基於python的Opencv項目實戰 (一)圖像基本操作

1.圖像讀取:

  • cv2.IMREAD_COLOR 讀取彩圖
    
  • cv2.IMREAD_GRAYSCALE 讀取灰度圖
import cv2 #opencv默認讀取格式是BGR
import matplotlib.pyplot as plt
import numpy as np

img = cv2.imread('01.jpg')
print(img) #打出的是三位維數組HWC(高、寬、通道),C是0、1、2,對應3個通道B、G、R

顯示:

import cv2 #opencv默認讀取格式是BGR

img = cv2.imread('01.jpg', cv2.IMREAD_GRAYSCALE)
print(img.shape)
cv2.imshow('image', img)
cv2.waitKey(0) #停頓時間,單位毫秒,0表示任意鍵結束
cv2.destroyAllWindows()

保存:

import cv2 #opencv默認讀取格式是BGR

img = cv2.imread('01.jpg')
cv2.imwrite('03.png', img) #保存

截取部分圖像:

import cv2 #opencv默認讀取格式是BGR

img = cv2.imread('01.jpg')
cat = img[0:200, 0:400] #H、W
cv2.imshow('cat', cat)
cv2.waitKey(0)
cv2.destroyAllWindows()

顏色通道提取:

import cv2 #opencv默認讀取格式是BGR

img = cv2.imread('01.jpg')
b, g, r = cv2.split(img)
print(b.shape) #各通道是二維
img = cv2.merge((b, g, r))
print(img.shape)
#只保留R
img_tep = img.copy() #以防直接改動img
img_tep[:, :, 0] = 0 #B通道像素置0
img_tep[:, :, 1] = 0 #G通道像素置0
cv2.imshow('R', img_tep)
#只保留G
img_tep0 = img.copy()
img_tep0[:, :, 0] = 0
img_tep0[:, :, 2] = 0
cv2.imshow('G', img_tep0)
#只保留B
img_tep1 = img.copy()
img_tep1[:, :, 1] = 0
img_tep1[:, :, 2] = 0
cv2.imshow('B', img_tep1)

cv2.waitKey(0)
cv2.destroyAllWindows()

邊界填充:

import cv2 #opencv默認讀取格式是BGR
import matplotlib.pyplot as plt

img = cv2.imread('01.jpg')
top_size, bottom_size, left_size, right_size = 50, 50, 50, 50
replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT101)
wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_CONSTANT, value=0)

plt.subplot(2, 3, 1), plt.imshow(img, 'gray'), plt.title('ORIGINAL')
plt.subplot(2, 3, 2), plt.imshow(replicate, 'gray'), plt.title('REPLICATE')
plt.subplot(2, 3, 3), plt.imshow(reflect, 'gray'), plt.title('REFLECT')
plt.subplot(2, 3, 4), plt.imshow(reflect101, 'gray'), plt.title('REFLECT101')
plt.subplot(2, 3, 5), plt.imshow(wrap, 'gray'), plt.title('WRAP')
plt.subplot(2, 3, 6), plt.imshow(constant, 'gray'), plt.title('CONSTANT')
plt.show()

 

圖像融合:

import cv2 #opencv默認讀取格式是BGR

img1 = cv2.imread('01.jpg')
img2 = cv2.imread('02.jpg')
print('img1: ', img1.shape) # (376, 499, 3))
print('img2: ', img2.shape) #(240, 320, 3))
img2 = cv2.resize(img2, (499, 376))
print('img1[:5, :, 0]: \n', img1[:5, :, 0]) #查看B通道的前5行
print('img2[:5, :, 0]: \n', img2[:5, :, 0])
img1_ = img1 + 10
print(img1_[:5, :, 0])
print('(img1 + img2)[:5, :, 0]: \n', (img1 + img2)[:5, :, 0])
print('cv2.add(img1, img2)[:5, :, 0]: \n', cv2.add(img1, img2)[:5, :, 0]) #add和直接加是不一樣的
res = cv2.addWeighted(img1, 0.4, img2, 0.6, 0) #r = ax1 + bx2 + b
cv2.imshow('res', res)
res1 = cv2.resize(res, (0, 0), fx=0.5, fy=2) #圖像x向縮至0.5倍,y向擴至2倍
cv2.imshow('res1', res1)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

 2. 數據讀取-視頻

  • cv2.VideoCapture 可以捕獲攝像頭,用數字來控制不同的設備,如0、1
  • 若是視頻文件,則直接指定文件路徑即可
import cv2 #opencv默認讀取格式是BGR

vc = cv2.VideoCapture('01.mp4')

if vc.isOpened(): #檢查是否打開正確
    while 1:
        ret, frame = vc.read()
        if ret == True:
            gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
            cv2.imshow('result', gray)
            # waitKey()取10,代表每10ms走一幀;0xFF取值27,代表按esc退出
            if cv2.waitKey(10) & 0xFF == 27: 
                break
vc.release()
cv2.destroyAllWindows()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章