參考opencv官方文檔OpenCV: Basic Operations on Images
加載圖像,常用的方式是imread()函數(shù),這個函數(shù)會返回一幅圖像,而這個圖像是一個數(shù)組,會根據(jù)imread()輸入?yún)?shù)的不同,可能是一個三維數(shù)組或者二維數(shù)組。
numpy是經(jīng)過優(yōu)化了的進行快速矩陣運算的包,其中numpy.array結(jié)構(gòu)針對數(shù)組操作有很好的優(yōu)化,它可以允許bulk(塊)操作,這些操作經(jīng)常會在圖像的處理上用到。
1.獲取像素并修改像素
import cv2
import numpy
img = cv2.imread('MY_PIC.jpg')
px=img[100,100]
print(px)
blue = img[100,100,0]
print(blue)
img[101,101]=[255,255,255]
print(img[101,101])
numpy是經(jīng)過優(yōu)化了的進行快速矩陣運算的包,所以不推薦逐個獲取像素值并修改能矩陣運算就不要用循環(huán)。例如前5行的后3列,用numpy的array.item()和array.itemset()會更好。但是返回是標量,如果想獲得所有RGB的值,需要使用array.item()分割.
print(img.item(10,10,2))
img.itemset((10,10,2),100)
print(img.item(10,10,2))
2.獲取圖像屬性
img.shape 獲得圖像的形狀,返回值是一個包含行數(shù),列數(shù),通道數(shù)的元組
img.size可以返回圖像的像素數(shù)目
?img.dtype返回圖像的數(shù)據(jù)類型,在debug時很重要,因為OpenCV-Python代碼中經(jīng)常出現(xiàn)數(shù)據(jù)類型的不一致
3.對圖像的特定區(qū)域操作。ROI是使用numpy索引來獲得的
例:選擇球的部分并拷貝到其他區(qū)域

ball = img[280:340, 330:390]
img[40:40,50:50]=ball
4.拆分及合并圖像通道
有時需要拆分BGR為單個通道,對BGR三個通道分別操作。有時需要把獨立的通道的圖片合成一個BGR。
b,g,r = cv2.split(img)
img = cv2.merge((b,g,r))
?#拆分b通道
b = img[:,:,0]
# 假如想使所有紅色通道值都為0,不必拆分再賦值,可以使用numpy索引,這樣更快
img[:,:,2]=0
PS:cv2.split()是比較耗時的操作,能用numpy就盡量使用。
5.為圖像擴邊(填充)
想為圖像周圍建一個邊可以使用cv2.copyMakeBorder()函數(shù)。這經(jīng)常在卷積運算或0填充時被用到。具體參數(shù)如下:
5.1 src輸入圖像
5.2 top,bottom,left,right對應(yīng)邊界的像素數(shù)目
5.3 borderType要添加哪種類型的邊界:
5.3.1 cv2.BORDER_CONSTANT添加有顏色的常數(shù)值邊界,還需要下一個參數(shù)(value:邊界顏色)
5.3.2 cv2.BORDER_REFLIECT邊界元素的鏡像。例如:fedcba | abcdefgh | hgfedcb
5.3.3 cv2.BORDER_101或者cv2.BORDER_DEFAULT跟上面一樣,但稍作改動,例如:gfedcb | abcdefgh | gfedcba
5.3.4 cv2.BORDER_REPLICATE復(fù)后一個元素。例如: aaaaaa| abcdefgh|hhhhhhh
5.3.5 cv2.BORDER_WRAP 就像這樣: cdefgh| abcdefgh|abcdefg

運行結(jié)果圖:
