?
這篇文章介紹圖像的基本表示方法、像素的訪問和操作、感興趣區域處理、通道處理等知識點。需要說明的是,在使用面向python的OpenCV必須熟練掌握Numpy庫,尤其是Numpy.array庫是python處理圖像的基礎。
圖像的基本表示方法
這里只討論二值圖像、灰度圖像、彩色圖像的基本表示方法。
二值圖像
二值圖像是指僅僅包含黑色和白色兩種顏色的圖像。在計算機中,將白色像素點處理為“1”,將黑色像素點處理為“0”,以方便進行后續的存儲和處理等操作。由于圖像只有黑色和白色兩種不同的顏色,因此只使用一個比特位就能表示。
灰度圖像
由于二值圖像表示簡單,只有黑色和白色兩種顏色,所以表示的圖像不夠細膩。通常在計算機中,會將灰度處理為256個灰度級,用數值區間[0,255]來表示。其中,數值“255”表示純白色,數值“0”表示純黑色,其余的數值表示從純白色到純黑之間不同級別的灰度。0~255個灰度級的數值,可以用一個八位二進制表示(一個字節)。
彩色圖像
相比于二值圖像和灰度圖像,彩色圖像識更常見的一類圖像,它能表現更豐富的細節信息。彩色圖像是建立在一個RGB色彩空間中的,R--red,紅色;G--green,綠色;B--blue,藍色;一共三個通道,且每個通道的范圍都在[0,255]之間。 一般情況下,在RGB色彩空間中,圖像通道的順序是R-G-B,即第一通道式R,紅色,第二個通道是G,綠色,第三個通道是B,藍色。然而在OpenCV中通道的順序是B-G-R,即藍色--綠色--紅色。
像素處理
像素是圖像構成的基本單元,像素處理是圖像處理的基本操作,可以通過位置索引的形式對圖像內得元素進行訪問、處理。
二值圖像及灰度圖像
在OpenCV中最小的數據類型時無符號的8位數。因此,在OpenCV中實際上沒有二值圖像這種數據類型,二值圖像經常是通過處理得到的,使用0表示黑色,使用255表示白色。可以理解為一種特殊的灰度圖像。
彩色圖像
RGB模式的彩色圖像在讀入OpenCV內進行處理時,會按照行方向依次讀取該RGB圖像的B通道、G通道、R通道的像素點,并將像素點以單位儲存在ndarray的列中。
使用numpy.array訪問像素
numpy.array提供了item()和itemset()函數來訪問和修改像素值,而且這兩個函數都是經過優化處理的,能夠更大幅度地提高處理效率。唉訪問及修改像素點值時,利用numpy.array提供的函數比直接使用索引要快得多,同時,他們也有更好的可讀性。
二值圖像及灰度圖像
可以將二值圖像理解為特殊的灰度圖像,所以這里僅以灰度圖像為例討論像素點值得讀取和修改。 函數item()能夠更加高效地訪問圖像的像素點,該函數的語法格式為: item(行,列) 函數itemset()可以用來修改像素值,其語法格式為: itemset(索引值,新值) 其中索引值是一個元組——(行,列)
彩色圖像
我們可以使用item()和函數itemset()來訪問和修改彩色圖像的像素值,過程與操作灰度圖像相似,不同之處在于需要補充通道信息。 item(行,列,通道) itemset(三元組索引值,新值) 注意:針對RGB圖像的訪問,必須必須同時指定行、列以及索引通道。僅僅指定行和列是不可以的。
感興趣區域ROI
在圖像處理過程中,我們可能會對圖像某個特定區域感興趣,該區域被稱為感興趣區域(Region of Interest,ROI)。在設定感興趣區域ROI后,就可以對該區域進行整體操作。例如進行賦值,復制。 ROI表達式如下: img[200:400,200:400]
通道操作
拆分通道
通過索引拆分通道
通過索引的方式,可以直接將各個通道從圖像內提取出來。例如,針對OpenCV內的BGR圖像img,如下語句分別從中提取了B通道、G通道、R通道。
b = img[:,:,0] g = img[:,:,1] r = img[:,:,2]
通過函數拆分
函數cv2.split()能夠拆分圖像的通道。例如,可以通過如下語句拆分彩色BGR圖像img,得到B通道圖像b、G通道g和R通道圖像r
b = cv2.split(a)[0] g = cv2.split(a)[1] r = cv2.split(a)[2]
通道合并
通道合并是通道拆分的逆過程,通過合并通道可以將三個通道的灰度圖像構成一幅彩色圖像。函數cv2.merge可以實現圖像通道合并,例如將有B通道圖像b、G通道圖像g和R通道圖像r,使用函數cv2.merge()可以將三個通道合并為一幅BGR的三通道彩色圖像。其語句為:
brg = cv2.merge([b,g,r])
獲取圖像屬性
在圖像處理過程中,經常需要獲取圖像的屬性,例如圖像的大小、類型等。這里介紹幾個常用的屬性。
shape: 如果是彩色圖像,則返回包含行數、列數、通道數的數組;如果是二值圖像或者灰度圖像,則僅返回行數和列數。通過該屬性的返回值是否包含通道數,可以判斷一幅圖像識灰度圖像(或二值圖像)還是彩色圖像。
size: 返回圖像的像素數目。其值為“行×列×通道數”,灰度圖像或者二值圖像的通道數為1。
dtype: 返回圖像的數據類型。
如下例,提取一幅圖像內得膚色部分:
import cv2 img = cv2.imread("lesson2.jpg") hav = cv2.cvtColor( img, cv2.COLOR_BGR2HSV ) h , s, v, = cv2.split(hsv) minHue = 5 maxHue = 170 hueMask = cv2.inRange(h, minHue, maxHue) minSat = 25 maxSat = 166 satMask = cv2.inRange( s, minSat, maxSat) mask = hueMask & satMask roi = cv2.bitwise_and( img, img, mask= mask) cv2.imshow("img",img) cv2.imshow("ROI",roi) cv2.waitKey() cv2.destroyALLWindows()
編輯:黃飛
評論
查看更多