OpenCV之圖像處理基礎(chǔ)
點(diǎn)擊下方 卡片 ,關(guān)注“ 新機(jī)器視覺 ”公眾號(hào)
重磅干貨,第一時(shí)間送達(dá)

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