在本教程中忠售,我們將了解計算機視覺中經(jīng)常使用的色彩空間磨隘,并將其用于基于顏色的分割。我們還將用C ++和Python分享演示代碼。
RGB色彩空間
RGB顏色空間具有以下屬性
1. 它是一種加色空間碍彭,其中顏色通過紅色,綠色和藍色值的線性組合獲得悼潭。
2. 三個通道通過照射到表面的光量相關(guān)聯(lián)庇忌。
讓我們將這兩個圖像分成R,G和B分量并觀察它們以更深入地了解色彩空間舰褪。
圖1:RGB顏色空間的不同通道:藍(B)綠(G)紅(R)
如果你看一下藍色通道皆疹,可以看到在室內(nèi)光照條件下圖像中的藍色和白色部分看起來相似,但和室外的圖像有明顯區(qū)別占拍。這種不均勻性使得在該顏色空間中基于顏色的分割非常困難略就。此外,兩個圖像的值之間存在總體差異晃酒。下面我們總結(jié)了與RGB顏色空間相關(guān)的固有問題:
1. 顯著的感知不均勻性表牢。
2.色度(顏色相關(guān)信息)和亮度(強度相關(guān)信息)數(shù)據(jù)的混合。
LAB色彩空間
Lab顏色空間有三個組成部分贝次。
1.? ?? ???L -?亮度(強度)崔兴。
2.? ?? ???a -?顏色組成分布范圍是從綠色到洋紅色。
3.? ?? ???b -?顏色組成分布范圍是從藍色到黃色。
Lab顏色空間與RGB顏色空間完全不同敲茄。在RGB顏色空間中位谋,顏色信息被分成三個通道,而且相同的三個通道也編碼亮度信息堰燎。另一方面掏父,在Lab顏色空間中,L通道獨立于顏色信息并且只編碼亮度秆剪。另外兩個通道編碼顏色损同。
它具有以下屬性。
1. 感知上均勻的色彩空間近似于我們?nèi)绾胃兄省?/p>
2. 獨立于設(shè)備(捕獲或顯示)鸟款。
3. 廣泛用于Adobe Photoshop膏燃。
4. 通過復(fù)數(shù)變換方程與RGB顏色空間相關(guān)。
讓我們看一下Lab顏色空間中的兩個圖像分成三個通道何什。
brightLAB = cv2.cvtColor(bright, cv2.COLOR_BGR2LAB)
darkLAB = cv2.cvtColor(dark, cv2.COLOR_BGR2LAB)
圖2:LAB顏色空間中的亮度(L)和顏色分量(A,B)
1.?從圖2中可以清楚地看出组哩,光照的變化主要影響L分量。
2. 包含顏色信息的A和B組分沒有經(jīng)歷大的變化处渣。
3. 綠色伶贰,橙色和紅色(它們是A成分的極值)的相應(yīng)值在B組分中沒有變化,同樣地罐栈,藍色和黃色(它們是B成分的極值)的相應(yīng)值在A組分中也沒有變化黍衙。
YCrCb色彩空間
YCrCb顏色空間源自RGB顏色空間,并具有以下三個組分荠诬。
1.? ?? ???Y – 在伽馬校正后從RGB獲得的亮度或亮度分量琅翻。
2.? ?? ???Cr = R - Y(紅色分量離亮度有多遠)。
3.? ?? ???Cb = B - Y(藍色分量離亮度有多遠)柑贞。
此顏色空間具有以下屬性方椎。
1. 將亮度和色度分量分成不同的通道。
2. 主要用于電視傳輸?shù)膲嚎s(Cr和Cb組件)钧嘶。
3. 取決于設(shè)備棠众。
YCrCb顏色空間中分成其通道的兩個圖像如下所示
brightYCB = cv2.cvtColor(bright, cv2.COLOR_BGR2YCrCb)
darkYCB = cv2.cvtColor(dark, cv2.COLOR_BGR2YCrCb)
圖3:YCrCb顏色空間中的亮度(Y)和色度(Cr,Cb)分量
意見
1. 對于光照變化有决,可以針對強度和顏色分量對LAB進行類似的觀察闸拿。
2. 與LAB相比,室外圖像中紅色和橙色之間的感知差異較小书幕。
3.? ?? ???White已經(jīng)在所有3個組件中發(fā)生了變化新荤。
HSV色彩空間
HSV色彩空間具有以下三個組成部分
1.? ?? ???H-色調(diào)(主波長)。
2.? ?? ???S-飽和度(顏色的純度/色調(diào))按咒。
3.? ?? ???V-值(強度)迟隅。
讓我們列舉一些屬性但骨。
1. 最好的是它只使用一個通道來描述顏色(H),這使得指定顏色變得非常直觀智袭。
2. 取決于設(shè)備奔缠。
兩個圖像的H,S和V分量如下所示吼野。
brightHSV = cv2.cvtColor(bright, cv2.COLOR_BGR2HSV)
darkHSV = cv2.cvtColor(dark, cv2.COLOR_BGR2HSV)
圖4:HSV顏色空間中的色調(diào)(H)校哎,飽和度(S)和值(V)分量
意見
1.? ?? ???H分量在兩個圖像中非常相似,這表明即使在光照變化下顏色信息也是完整的瞳步。
2.? ?? ???兩個圖像中的S分量也非常相似闷哆。
3.? ?? ???V分量捕獲落在其上的光量,因此它會因照明變化而發(fā)生變化单起。
4.?室外和室內(nèi)圖像的紅色值之間存在巨大差異抱怔。這是因為Hue表示為圓形,紅色表示起始角度嘀倒。因此屈留,它可能需要[300,360]和[0,60]之間的值。
如何使用這些顏色空間進行分割
最簡單的方法
現(xiàn)在我們已經(jīng)了解了不同的顏色空間测蘑,讓我們首先嘗試使用它們來檢測立方體中的綠色灌危。
第1步:獲取特定顏色的顏色值
找到每個顏色空間的綠色值的近似范圍。為此碳胳,我創(chuàng)建了一個交互式GUI勇蝙,您可以通過將鼠標懸停在圖像上來檢查每個像素的所有顏色空間的值,如下所示:
圖5:Demo顯示室外圖像的不同顏色空間中的像素及其值
第2步:應(yīng)用分段閾值
從圖像中提取具有接近綠色像素值的所有像素挨约。我們可以為每個顏色空間采用+/- 40的范圍味混,并檢查結(jié)果的樣子。我們將使用opencv函數(shù)inRange來查找綠色像素的掩模烫罩,然后使用bitwise_and操作來使用掩模從圖像中獲取綠色像素惜傲。
代碼如下:
bgr = [40,158,16]
thresh =40
minBGR = np.array([bgr[0] - thresh, bgr[1] - thresh, bgr[2] - thresh])
maxBGR = np.array([bgr[0] + thresh, bgr[1] + thresh, bgr[2] + thresh])
maskBGR = cv2.inRange(bright,minBGR,maxBGR)
resultBGR = cv2.bitwise_and(bright, bright, mask = maskBGR)
# 將1D數(shù)組轉(zhuǎn)換為3D,然后將其轉(zhuǎn)換為HSV贝攒,并獲取第一個元素
# 這將與上面的圖相同[65,229,158]
hsv = cv2.cvtColor( np.uint8([[bgr]] ), cv2.COLOR_BGR2HSV)[0][0]
minHSV = np.array([hsv[0] - thresh, hsv[1] - thresh, hsv[2] - thresh])
maxHSV = np.array([hsv[0] + thresh, hsv[1] + thresh, hsv[2] + thresh])
maskHSV = cv2.inRange(brightHSV, minHSV, maxHSV)
resultHSV = cv2.bitwise_and(brightHSV, brightHSV, mask = maskHSV)
# 將1D數(shù)組轉(zhuǎn)換為3D,然后將其轉(zhuǎn)換為YCrCb时甚,并獲取第一個元素
ycb = cv2.cvtColor( np.uint8([[bgr]] ), cv2.COLOR_BGR2YCrCb)[0][0]
minYCB = np.array([ycb[0] - thresh, ycb[1] - thresh, ycb[2] - thresh])
maxYCB = np.array([ycb[0] + thresh, ycb[1] + thresh, ycb[2] + thresh])
maskYCB = cv2.inRange(brightYCB, minYCB, maxYCB)
resultYCB = cv2.bitwise_and(brightYCB, brightYCB, mask = maskYCB)
# 將1D數(shù)組轉(zhuǎn)換為3D隘弊,然后將其轉(zhuǎn)換為LAB,并獲取第一個元素
lab = cv2.cvtColor( np.uint8([[bgr]] ), cv2.COLOR_BGR2LAB)[0][0]
minLAB = np.array([lab[0] - thresh, lab[1] - thresh, lab[2] - thresh])
maxLAB = np.array([lab[0] + thresh, lab[1] + thresh, lab[2] + thresh])
maskLAB = cv2.inRange(brightLAB, minLAB, maxLAB)
resultLAB = cv2.bitwise_and(brightLAB, brightLAB, mask = maskLAB)
cv2.imshow("Result BGR", resultBGR)
cv2.imshow("Result HSV", resultHSV)
cv2.imshow("Result YCB", resultYCB)
cv2.imshow("Output LAB", resultLAB)
圖6:RGB看起來不錯荒适,可能我們只是在這里浪費時間
因此梨熙,似乎RGB和LAB足以檢測顏色,我們不需要多想刀诬。讓我們看看更多的結(jié)果
圖7:對室內(nèi)圖像應(yīng)用相同的閾值無法檢測所有顏色空間中的綠色立方體
因此咽扇,相同的閾值對暗圖像不起作用。進行相同的實驗以檢測黃色會產(chǎn)生以下結(jié)果。
圖8:嘗試使用從明亮圖像獲得的相同技術(shù)和閾值(黃色)檢測黃色碎片质欲。HSV和YCrCb仍然表現(xiàn)不佳
可見閾值的設(shè)置對我們檢測顏色是多么的重要
色彩空間的其他有用應(yīng)用
1. 直方圖均衡通常在灰度圖像上完成树埠。但是,你可以通過將RGB圖像轉(zhuǎn)換為YCbCr并僅對Y通道進行直方圖均衡來執(zhí)行彩色圖像的均衡嘶伟。
2. 通過將圖像轉(zhuǎn)換為Lab顏色空間怎憋,在兩個圖像之間進行顏色轉(zhuǎn)換。
3. 智能手機相機應(yīng)用程序(如Google相機或Instagram)中的許多濾鏡都會利用這些色彩空間變換來創(chuàng)建這些炫酷效果九昧!
openCV【實踐系列】8——OpenCV中的顏色空間
https://bbs.easyaiforum.cn/thread-855-1-1.html
(出處: 易學(xué)智能)