Python調用OpenCV進行操作的時候基本上感覺就是對numpy進行操作,跟numpy是挺相關的。
1、像素操作
OpenCV獲取圖像(x,y)處的像素值:
px=img[x,y]
當圖像是三通道的時候返回的是BGR三通道的值,如果是灰度圖的話就返回一個亮度值
同樣的如果要對圖像(x,y)處賦值的話,也通過這種方式來實現:
#三通道
img[x,y]=[255,255,255]
#單通道
img[x,y]=255
2、獲取圖像屬性
獲取圖像的形式,這個跟numpy的操作基本一樣,通過shape來獲取:
img.shape
會返回一個圖像的形態,也就是(行,列,通道),OpenCV的圖像還有一個size屬性,這個返回的是總的像素數量行*列*通道數。
通過圖像的dtype來獲取圖像的像素數據類型:
img.dtype
返回的值類型如uint8等
3、圖像ROI
OpenCV獲取圖像的ROI的時候可以使用類似numpy的方式來獲取,如:
roi=img[r0:r1,c0:c1]
4、通道分離和合並
通道分離使用的是函數split:
b,g,r=cv2.split(img)
通道分離用的是merge函數:
img=cv2.merge(b,g,r)
當可以不用split的時候就不要用,改用numpy的索引操作,因爲split是比較耗時的操作。
5、圖像擴充邊界
擴充邊界的時候就用函數copyMakeBorder(),這個函數有四個參數:
-
src:輸入圖像
-
top,bottom,left,right:對應的邊界的像素數目
-
borderType要添加哪種類型的邊界
-
cv2.BORDER_CONSTANT,添加有顏色的常數值邊界,也就是下一個參數value;
-
cv2.BORDER_REFLECT,邊界顏色的鏡像,fedcba|abcdefgh|hgfedcb;
-
cv2.BORDER_REFLECT_101或者cv2.BORDER_DEFAULT,gfedcb|abcdefgh|gfedcba;
-
cv2.BORDER_REPLICATE,重複最後一個像素來填充;
-
cv2.BORDER_WRAP,這個比較...,應該是左移右移來填充吧,cdefgh| abcdefgh|abcdefg
-
-
value:邊界顏色
import numpy as np
import cv2 as cv
src = cv.imread("D:/lena.bmp")
src = cv.resize(src, (256, 256))
dst = cv.copyMakeBorder(src, 50, 50, 50, 50,
cv.BORDER_CONSTANT, value=[255, 255, 255])
cv.imshow('BORDER_CONSTANT', dst)
src_gray = cv.cvtColor(src,cv.COLOR_BGR2GRAY)
dst = cv.copyMakeBorder(src, 50, 50, 50, 50, cv.BORDER_REFLECT)
cv.imshow('BORDER_REFLECT', dst)
dst = cv.copyMakeBorder(src, 50, 50, 50, 50, cv.BORDER_REFLECT_101)
cv.imshow('BORDER_REFLECT_101', dst)
dst = cv.copyMakeBorder(src, 50, 50, 50, 50, cv.BORDER_REPLICATE)
cv.imshow('BORDER_REPLICATE', dst)
dst = cv.copyMakeBorder(src, 50, 50, 50, 50, cv.BORDER_WRAP)
cv.imshow('BORDER_WRAP', dst)
cv.waitKey(0)
cv.destroyAllWindows()
天還未黑,雲怎敢灰;
雨還未下,風怎敢吹;
瓜還未熟,秧怎敢枯;
花還未落,樹怎敢死;
你還未嫁,我怎敢老。
-- 汪國真 《怎敢》