【OpenCV實戰(zhàn)】基于HSV的顏色分割Python實現(xiàn)(含Python代碼)
標(biāo)簽: OPenCV自學(xué)記錄 python 機器學(xué)習(xí) 人工智能
版權(quán)聲明:本文為qq_40784418原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明
原文鏈接:https://blog.csdn.net/qq_40784418/article/details/106347196
一周沒有更新博客了,這一周的時間內(nèi)加強了對機器學(xué)習(xí)和圖像處理的學(xué)習(xí)。學(xué)的有點混亂贪惹,有必要記錄一下。
深度學(xué)習(xí)可以解決很多問題,但有時候深度學(xué)習(xí)和圖像處理相結(jié)合才能有更好的效果:比如聊浅,在進(jìn)行交通信號燈檢測時,用目標(biāo)檢測模型確定信號燈位置后现使,對信號燈進(jìn)行顏色分割再識別可大大提高準(zhǔn)確率低匙。
機器學(xué)習(xí)領(lǐng)域中有句話:數(shù)據(jù)和特征決定了模型的上限,而算法只不過是逼近這個上限而已碳锈,所以了解機器學(xué)習(xí)的常用算法顽冶,熟悉機器學(xué)習(xí)中的特征工程是很有必要的。
【OpenCV實戰(zhàn)】基于HSV的顏色分割實現(xiàn)(含Python代碼)
1贸人、什么是HSV
我們知道RGB顏色模式间景,通過不同的配比可以形成不同的顏色。HSV也是一種顏色模式艺智,其模型如圖所示
通過圖示我們也能夠看到倘要,他和RGB顏色模型相似,也是由三個屬性決定顏色十拣,H封拧、S志鹃、V分別是色彩、深度泽西、明暗曹铃,按著圖中方向的變化,其對應(yīng)的顏色也會改變尝苇,三者也同樣是有取值范圍的:
- H(色調(diào)):用角度度量铛只,取值范圍為0°~360°
- S(飽和度):表示顏色接近光譜色的程度。通常取值范圍為0%~100%糠溜,值越大淳玩,顏色越飽和。
- V(明度):表示顏色明亮的程度非竿,對于光源色蜕着,明度值與發(fā)光體的光亮度有關(guān);對于物體色红柱,此值和物體的透射比或反射比有關(guān)承匣。通常取值范圍為0%(黑)到100%(白)。
HSV空間中三個指標(biāo)相互獨立锤悄,能夠非常直觀的表達(dá)色彩的明暗韧骗,色調(diào),以及鮮艷程度零聚,方便進(jìn)行顏色之間的對比袍暴,所以經(jīng)常在HSV中進(jìn)行顏色的分割識別。在HSV中各個顏色的范圍見下表
2隶症、代碼實戰(zhàn)
從網(wǎng)上下載了一張交通信號燈的圖片政模,如圖
我們的目的是進(jìn)行顏色分割,將我們感興趣的區(qū)域提取出來以方便下一步的操作蚂会。
2.1 createTrackbar使用方法及步驟
在開始實際操作之前淋样,來了解一下createTrackbar。createTrackbar是Opencv中的API胁住,其可在顯示圖像的窗口中快速創(chuàng)建一個滑動控件趁猴,用于手動調(diào)節(jié)閾值,具有非常直觀的效果彪见。可以直接觀察閾值選擇的效果躲叼,并確定想要的閾值。
使用Trackbar我們要了解兩個函數(shù)企巢;
(1)創(chuàng)建滑動條函數(shù)
一個滑動條只能用于一個參數(shù),如果需要改變多個參數(shù)让蕾,可以使用多個滑動條浪规。
cv2.createTrackbar(trackbarName, windowName, value, count, onChange)
各參數(shù)意義:
trackbarName:滑動空間的名稱或听;
windowName:滑動空間用于依附的圖像窗口的名稱;
value:初始化閾值笋婿;
count:滑動控件的刻度范圍誉裆;最小值默認(rèn)為0。
onChange:回調(diào)函數(shù)(所謂回調(diào)函數(shù)即每次修改滑動條后缸濒,需要傳入新變量的函數(shù))的名稱足丢,其定義如下:
onchange:void foo(int,void*)庇配。
其中第一個參數(shù)是滑動條位置斩跌,第二個參數(shù)是用戶數(shù)據(jù)(請參見下一個參數(shù))。如果回調(diào)是空指針捞慌,則不調(diào)用回調(diào)耀鸦,但只更新值
用戶數(shù)據(jù):按原樣傳遞給回調(diào)的用戶數(shù)據(jù)。它可以用來處理滑動條事件而不使用全局變量啸澡。
(2)獲取滑動條的值函數(shù)
cv.getTrackbarPos獲取滑動條位置處的值
g = cv2.getTrackbarPos(trackbarName2, windowName)
#第一個參數(shù)為滑動條1的名稱袖订,第二個參數(shù)為窗口的名稱。
注意:需要在回調(diào)函數(shù)內(nèi)部采用函數(shù)cv.getTrackbarPos獲取滑動條位置處的值嗅虏,不然如果存在多個滑動條時洛姑,函數(shù)無法獲取更新后的參數(shù)值。
2.2 代碼詳解
import cv2
# 滑動條的回調(diào)函數(shù)皮服,獲取滑動條位置處的值
def empty(a):
h_min = cv2.getTrackbarPos("Hue Min","TrackBars")
h_max = cv2.getTrackbarPos("Hue Max", "TrackBars")
s_min = cv2.getTrackbarPos("Sat Min", "TrackBars")
s_max = cv2.getTrackbarPos("Sat Max", "TrackBars")
v_min = cv2.getTrackbarPos("Val Min", "TrackBars")
v_max = cv2.getTrackbarPos("Val Max", "TrackBars")
print(h_min, h_max, s_min, s_max, v_min, v_max)
return h_min, h_max, s_min, s_max, v_min, v_max
path = 'Resources/11.jpg'
# 創(chuàng)建一個窗口楞艾,放置6個滑動條
cv2.namedWindow("TrackBars")
cv2.resizeWindow("TrackBars",640,240)
cv2.createTrackbar("Hue Min","TrackBars",0,179,empty)
cv2.createTrackbar("Hue Max","TrackBars",19,179,empty)
cv2.createTrackbar("Sat Min","TrackBars",110,255,empty)
cv2.createTrackbar("Sat Max","TrackBars",240,255,empty)
cv2.createTrackbar("Val Min","TrackBars",153,255,empty)
cv2.createTrackbar("Val Max","TrackBars",255,255,empty)
while True:
img = cv2.imread(path)
imgHSV = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
# 調(diào)用回調(diào)函數(shù),獲取滑動條的值
h_min,h_max,s_min,s_max,v_min,v_max = empty(0)
lower = np.array([h_min,s_min,v_min])
upper = np.array([h_max,s_max,v_max])
# 獲得指定顏色范圍內(nèi)的掩碼
mask = cv2.inRange(imgHSV,lower,upper)
# 對原圖圖像進(jìn)行按位與的操作冰更,掩碼區(qū)域保留
imgResult = cv2.bitwise_and(img,img,mask=mask)
cv2.imshow("Mask", mask)
cv2.imshow("Result", imgResult)
cv2.waitKey(1)
其實在交通信號燈檢測中产徊,我們只需要獲得掩碼(mask圖像)就可以進(jìn)行識別了。
3蜀细、總結(jié)
顏色分割在很多場景都可以用到舟铜,結(jié)合深度學(xué)習(xí)會有更好的效果。下一篇博客將記錄如何進(jìn)行字符分割奠衔。字符分割的應(yīng)用場景和思路應(yīng)用同樣廣泛谆刨。
版權(quán)聲明:本文為qq_40784418原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議归斤,轉(zhuǎn)載請附上原文出處鏈接和本聲明
原文鏈接:https://blog.csdn.net/qq_40784418/article/details/106347196