Python?OpenCV基于HSV的顏色分割實(shí)現(xiàn)示例
前言
一周沒(méi)有更新博客了,這一周的時(shí)間內(nèi)加強(qiáng)了對(duì)機(jī)器學(xué)習(xí)和圖像處理的學(xué)習(xí)。學(xué)的有點(diǎn)混亂,有必要記錄一下。
深度學(xué)習(xí)可以解決很多問(wèn)題,但有時(shí)候深度學(xué)習(xí)和圖像處理相結(jié)合才能有更好的效果:比如,在進(jìn)行交通信號(hào)燈檢測(cè)時(shí),用目標(biāo)檢測(cè)模型確定信號(hào)燈位置后,對(duì)信號(hào)燈進(jìn)行顏色分割再識(shí)別可大大提高準(zhǔn)確率。
機(jī)器學(xué)習(xí)領(lǐng)域中有句話:數(shù)據(jù)和特征決定了模型的上限,而算法只不過(guò)是逼近這個(gè)上限而已,所以了解機(jī)器學(xué)習(xí)的常用算法,熟悉機(jī)器學(xué)習(xí)中的特征工程是很有必要的。
1、什么是HSV
我們知道RGB顏色模式,通過(guò)不同的配比可以形成不同的顏色。HSV也是一種顏色模式,其模型如圖所示
通過(guò)圖示我們也能夠看到,他和RGB顏色模型相似,也是由三個(gè)屬性決定顏色,H、S、V分別是色彩、深度、明暗,按著圖中方向的變化,其對(duì)應(yīng)的顏色也會(huì)改變,三者也同樣是有取值范圍的:
- H(色調(diào)):用角度度量,取值范圍為0°~360°
- S(飽和度):表示顏色接近光譜色的程度。通常取值范圍為0%~100%,值越大,顏色越飽和。
- V(明度):表示顏色明亮的程度,對(duì)于光源色,明度值與發(fā)光體的光亮度有關(guān);對(duì)于物體色,此值和物體的透射比或反射比有關(guān)。通常取值范圍為0%(黑)到100%(白)。
HSV空間中三個(gè)指標(biāo)相互獨(dú)立,能夠非常直觀的表達(dá)色彩的明暗,色調(diào),以及鮮艷程度,方便進(jìn)行顏色之間的對(duì)比,所以經(jīng)常在HSV中進(jìn)行顏色的分割識(shí)別。在HSV中各個(gè)顏色的范圍見(jiàn)下表
2、代碼實(shí)戰(zhàn)
從網(wǎng)上下載了一張交通信號(hào)燈的圖片,如圖
我們的目的是進(jìn)行顏色分割,將我們感興趣的區(qū)域提取出來(lái)以方便下一步的操作。
2.1 createTrackbar使用方法及步驟
在開(kāi)始實(shí)際操作之前,來(lái)了解一下createTrackbar。createTrackbar是Opencv中的API,其可在顯示圖像的窗口中快速創(chuàng)建一個(gè)滑動(dòng)控件,用于手動(dòng)調(diào)節(jié)閾值,具有非常直觀的效果??梢灾苯佑^察閾值選擇的效果,并確定想要的閾值。
使用Trackbar我們要了解兩個(gè)函數(shù);
(1)創(chuàng)建滑動(dòng)條函數(shù)
一個(gè)滑動(dòng)條只能用于一個(gè)參數(shù),如果需要改變多個(gè)參數(shù),可以使用多個(gè)滑動(dòng)條。
cv2.createTrackbar(trackbarName, windowName, value, count, onChange)
各參數(shù)意義:
trackbarName:滑動(dòng)空間的名稱;
windowName:滑動(dòng)空間用于依附的圖像窗口的名稱;
value:初始化閾值;
count:滑動(dòng)控件的刻度范圍;最小值默認(rèn)為0。
onChange:回調(diào)函數(shù)(所謂回調(diào)函數(shù)即每次修改滑動(dòng)條后,需要傳入新變量的函數(shù))的名稱,其定義如下:
onchange:void foo(int,void*)。
其中第一個(gè)參數(shù)是滑動(dòng)條位置,第二個(gè)參數(shù)是用戶數(shù)據(jù)(請(qǐng)參見(jiàn)下一個(gè)參數(shù))。如果回調(diào)是空指針,則不調(diào)用回調(diào),但只更新值
用戶數(shù)據(jù):按原樣傳遞給回調(diào)的用戶數(shù)據(jù)。它可以用來(lái)處理滑動(dòng)條事件而不使用全局變量。
(2)獲取滑動(dòng)條的值函數(shù)
cv.getTrackbarPos獲取滑動(dòng)條位置處的值
g = cv2.getTrackbarPos(trackbarName2, windowName) #第一個(gè)參數(shù)為滑動(dòng)條1的名稱,第二個(gè)參數(shù)為窗口的名稱。
注意:需要在回調(diào)函數(shù)內(nèi)部采用函數(shù)cv.getTrackbarPos獲取滑動(dòng)條位置處的值,不然如果存在多個(gè)滑動(dòng)條時(shí),函數(shù)無(wú)法獲取更新后的參數(shù)值。
2.2 代碼詳解
import cv2 # 滑動(dòng)條的回調(diào)函數(shù),獲取滑動(dòng)條位置處的值 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)建一個(gè)窗口,放置6個(gè)滑動(dòng)條 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ù),獲取滑動(dòng)條的值 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) # 對(duì)原圖圖像進(jìn)行按位與的操作,掩碼區(qū)域保留 imgResult = cv2.bitwise_and(img,img,mask=mask) cv2.imshow("Mask", mask) cv2.imshow("Result", imgResult) cv2.waitKey(1)
其實(shí)在交通信號(hào)燈檢測(cè)中,我們只需要獲得掩碼(mask圖像)就可以進(jìn)行識(shí)別了。
3、總結(jié)
顏色分割在很多場(chǎng)景都可以用到,結(jié)合深度學(xué)習(xí)會(huì)有更好的效果。后續(xù)將記錄如何進(jìn)行字符分割。字符分割的應(yīng)用場(chǎng)景和思路應(yīng)用同樣廣泛,更多關(guān)于Python OpenCV HSV顏色分割的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python個(gè)人博客程序開(kāi)發(fā)實(shí)例用戶驗(yàn)證功能
這篇文章主要介紹了怎樣用Python來(lái)實(shí)現(xiàn)一個(gè)完整的個(gè)人博客系統(tǒng),我們通過(guò)實(shí)操上手的方式可以高效的鞏固所學(xué)的基礎(chǔ)知識(shí),感興趣的朋友一起來(lái)看看吧2022-12-12Python3.9最新版下載與安裝圖文教程詳解(Windows系統(tǒng)為例)
這篇文章主要介紹了Python3.9最新版下載與安裝圖文教程詳解,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11基于OpenCV python3實(shí)現(xiàn)證件照換背景的方法
這篇文章主要介紹了基于OpenCV python3實(shí)現(xiàn)證件照換背景的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03淺談spring boot 集成 log4j 解決與logback沖突的問(wèn)題
今天小編就為大家分享一篇淺談spring boot 集成 log4j 解決與logback沖突的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02Python實(shí)戰(zhàn)使用Selenium爬取網(wǎng)頁(yè)數(shù)據(jù)
這篇文章主要為大家介紹了Python實(shí)戰(zhàn)使用Selenium爬取網(wǎng)頁(yè)數(shù)據(jù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2023-05-05python 基于空間相似度的K-means軌跡聚類的實(shí)現(xiàn)
這篇文章主要介紹了python 基于空間相似度的K-means軌跡聚類的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03