參考o(jì)pencv官方文檔OpenCV: Basic Operations on Images
加載圖像捌臊,常用的方式是imread()函數(shù)深浮,這個函數(shù)會返回一幅圖像,而這個圖像是一個數(shù)組,會根據(jù)imread()輸入?yún)?shù)的不同,可能是一個三維數(shù)組或者二維數(shù)組码秉。
numpy是經(jīng)過優(yōu)化了的進(jìn)行快速矩陣運(yùn)算的包,其中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)化了的進(jìn)行快速矩陣運(yùn)算的包鲸伴,所以不推薦逐個獲取像素值并修改能矩陣運(yùn)算就不要用循環(huán)府蔗。例如前5行的后3列,用numpy的array.item()和array.itemset()會更好挑围。但是返回是標(biāo)量礁竞,如果想獲得所有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時很重要,因?yàn)镺penCV-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三個通道分別操作。有時需要把獨(dú)立的通道的圖片合成一個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.為圖像擴(kuò)邊(填充)
想為圖像周圍建一個邊可以使用cv2.copyMakeBorder()函數(shù)忠寻。這經(jīng)常在卷積運(yùn)算或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
運(yùn)行結(jié)果圖: