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