OpenCV學習筆記之三:圖像基本操作

首先,學習圖像處理需要用到Python的兩個庫,在Pycharm的終端裏安裝以下兩個庫:

注意:安裝特定版本的庫時,在後面用==接要安裝的版本號

pip install opencv-python==3.4.1.15

pip install opencv-contrib-python==3.4.1.15

計算機中一個像素點事從0-255表示亮度,255最亮表示白色,0表示黑色。RGB是三維數據矩陣表示一個圖片的所有像素點組成。

圖像-->500x500x3(3:RGB) 在每個顏色通道上都有1個500x500的矩陣。

一、數據讀取-圖像

cv2.IMREAD_COLOR:彩色圖像 

img = cv2.imread(r'.\jay1.jpg')

cv2.IMREAD_GRAYSCALE:灰度圖像

img = cv2.imread('jay1.jpg',cv2.IMREAD_GRAYSCALE) #圖像進行灰度處理,灰度圖進行預處理操作

二、數據讀取-視頻

cv2.VideoCapture可以捕獲攝像頭,用數字來控制不同的設備,例如0,1。

如果是視頻文件,直接指定好路徑即可。

#視頻顯示
vc = cv2.VideoCapture('test.mp4') #參數是要讀取的視頻

#檢查是否打開正確
if vc.isOpened():
    oepn, frame = vc.read() #把視頻拆成幀, frame是當前一幀的圖像
else:
    open = False

while open:
    ret, frame = vc.read()
    if frame is None: #讀取每幀,如果不爲空就繼續執行,否則跳出
        break
    if ret == True:
        gray = cv2.cvtColor(frame,  cv2.COLOR_BGR2GRAY) #每幀轉成灰度圖
        cv2.imshow('result', gray) #灰度顯示
        if cv2.waitKey(10) & 0xFF == 27: #27是退出鍵
            break
vc.release()
cv2.destroyAllWindows()

三、截取部分

讀取圖片img=cv2.imread('cat.jpg')

設置要裁剪的區域cat=img[0:50,0:200]

顯示圖片cv_show('cat',cat)

四、顏色通道提取

首先顏色通道的先後順序是BGR,而不是RGB。BGR->(0,1,2)

若保留R,需要把G,B全部設置爲0

若保留G,需要把R,B全部設置爲0

若保留B,需要把R,G全部設置爲0

#顏色通道提取
img = cv2.imread(r'.\jay1.jpg')
b,g,r=cv2.split(img) #注意順序是BGR,而不是RGB
print(b) #顯示b顏色通道像素點
print(g) #顯示g顏色通道像素點
print(r) #顯示r顏色通道像素點
print(r.shape) #顯示r顏色通道大小

img = cv2.merge((b,g,r)) #注意順序是BGR,而不是RGB,另外顏色通道需要用元組作爲參數
print(img.shape)

#(b,g,r) -> (0,1,2)
# 只保留R,其他通道置爲0
cur_img = img.copy()
cur_img[:,:,0] = 0
cur_img[:,:,1] = 0
cv_show('R',cur_img)
# 只保留G,其他通道置爲0
cur_img = img.copy()
cur_img[:,:,0] = 0
cur_img[:,:,2] = 0
cv_show('G',cur_img)
# 只保留B,其他通道置爲0
cur_img = img.copy()
cur_img[:,:,1] = 0
cur_img[:,:,2] = 0
cv_show('B',cur_img)

五、邊界填充

邊界填充形象理解就是對原始圖片加一個邊框,如下圖所示:

 邊界填充都是用同一個函數cv2.copyMakeBorder(image,top_size,bottom_size,left_size,right_size,border_type)。

#邊界填充
top_size,bottom_size,left_size,right_size = (50,50,50,50)

replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,borderType=cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,borderType=cv2.BORDER_CONSTANT, value=0)

plt.subplot(231), plt.imshow(img, 'gray'), plt.title('ORIGINAL')
plt.subplot(232), plt.imshow(replicate, 'gray'), plt.title('REPLICATE')
plt.subplot(233), plt.imshow(reflect, 'gray'), plt.title('REFLECT')
plt.subplot(234), plt.imshow(reflect101, 'gray'), plt.title('REFLECT_101')
plt.subplot(235), plt.imshow(wrap, 'gray'), plt.title('WRAP')
plt.subplot(236), plt.imshow(constant, 'gray'), plt.title('CONSTANT')

plt.show()

BoderType的屬性見下圖 

六、數值計算

圖像的像素相加,必須滿足維度是一樣的。

如果是兩張圖相加img1+img2,則超過255的需要轉換(用和求餘256)

如果是用add函數相加的話,超過255的直接保持最大的255 

#數值計算
img_jay1=cv2.imread(r'jay1.jpg')
img_jay12= img_jay1 +10
print(img_jay1[:5,:,0]) #打印原圖像素
print(img_jay12[:5,:,0])#打印像素+10後圖片的像素
print((img_jay1+img_jay12)[:5,:,0]) #兩圖相加後的像素 超過255執行%256
img_add = cv2.add(img_jay1,img_jay12)[:5,:,0] #兩圖相加後的像素 超過255則保持255
print(img_add)

七、圖像融合

如果直接把兩張圖片相加,必須滿足兩張圖片的大小一致。

cv2.resize(image,(width,height))注意width在前,height在後

img_heart=cv2.resize(img_heart,(500,546))#先w再h

同比例縮放圖片,也可以單獨只放大寬或者高

#同比例放大四倍
res = cv2.resize(img_jay1, (0,0), fx =4, fy=4)
cv_show('img_p1',res)
#寬度保持不變,高度放大三倍
res = cv2.resize(img_jay1, (0,0), fx =1, fy=3)
cv_show('img_p3',res)

兩張圖片融合需要符合一個公式: R=alpha * x1 + beta * x2 + b 其中alpha--x1的權重,beta--x2的權重, b--亮度級微調偏置項

#融合公式 R=alpha * x1 + beta * x2 + b (alpha=0.4, beta=0.6, b=0) alpha--x1的權重,beta--x2的權重, b--亮度級微調偏置項
img_conj_1 = cv2.addWeighted(img_jay1, 0.4, img_heart, 0.6, 0)
cv_show('img_conj',img_conj_1)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章