利用OpenCV進行顏色檢測

2021-10-17 08:38:14 字數 2747 閱讀 6845

rgb通道與hsv通道在顏色檢測中的區別

hsv是相對rgb的另一種顏色表示方式,它相對rgb而言,是一種比較直觀的顏色模型。其中顏色的引數分別是:色調(h),飽和度(s),明度(v)。

色調h:

用角度度量,取值範圍為0°~360°,從紅色開始按逆時針方向計算,紅色為0°,綠色為120°,藍色為240°。它們的補色是:黃色為60°,青色為180°,紫色為300°;

飽和度s:

飽和度s表示顏色接近光譜色的程度。一種顏色,可以看成是某種光譜色與白色混合的結果。其中光譜色所佔的比例愈大,顏色接近光譜色的程度就愈高,顏色的飽和度也就愈高。飽和度高,顏色則深而豔。光譜色的白光成分為0,飽和度達到最高。通常取值範圍為0%~100%,值越大,顏色越飽和。

明度v:

明度表示顏色明亮的程度,對於光源色,明度值與發光體的光亮度有關;對於物體色,此值和物體的透射比或反射比有關,光照對此值影響最大。通常取值範圍為0%(黑)到100%(白)。

)#讀取一張

hsv=cv2.cvtcolor(img,cv2.color_bgr2hsv)

#利用cv2.cvtcolor將進行格式轉化

#轉化型別為cv2.color_bgr2hsv

cv2.imshow(

"hsv"

, hsv)

cv2.waitkey(

0)

cv2.destroyallwindows(

)原圖:

處理後:

此函式可實現影象的二值化處理功能,這點類似之前提到過的threshold()函式,但是threshold()函式只能對單一通道進行二值化處理,而inrange()可以對多個通道進行操作。使用inrange處理之前,需要確定好兩個陣列,即影象上限和影象下限。

img = cv2.inrange(hsv, lower, upper)

第乙個引數:hsv指的是原圖

第二個引數:lower指的是影象中低於這個lower的值,影象值變為0

第三個引數:upper指的是影象中高於這個upper的值,影象值變為0

注意:如果傳入的影象是彩色的,即三維數**像,則lower與upper裡面分別有三個元素,並且二者必須都是陣列型別

(lower, upper)兩個陣列引數可以作為乙個範圍,如果影象的畫素點在這個範圍之內,畫素點就變成255(即白色),如果影象的畫素點在這個範圍之外,畫素點就變為0(即黑色)。

處理完成之後,影象變為二值影象,想要的影象顏色變為白色,其他顏色變為黑色,之後可以專門針對白色進行處理。

提取該圖水杯部分(即黑色部分):

])#提前確定黑色的hsv範圍

img_r=cv2.inrange(img,lower,upper)

cv2.imshow(

"img_r"

,img_r)

cv2.waitkey(0)

cv2.destroyallwindows(

)處理後:

由於貓耳朵與後面角落有部分黑色,並且杯子本身黑色不純(存在白點),會產生噪點,需要後續進行處理,消去噪音點

如果光源不穩定,光照變化較大(存在陰影或者亮斑),則利用hsv通道檢測就比rgb檢測高效得多。光照變化較大時,對rgb三個色道的引數影響都很大,在實際調參過程中會顯得非常麻煩,而且效果不理想。

hsv中,由於h是顏色的色調基本不受光照影響(即不受陰影或者亮斑影響),而v(明度)主要體現了顏色明亮程度,可以主要除錯v來應對光源的變化,並且除錯效果比rgb色道要可靠。

文:齊魯工業大學 雲靈未來人工智慧協會 aidc017

利用opencv檢測出矩形

pragma once include troot.h include cbintoprofile.h include th1.h include cbmpdiff.h include ccircletopeak.h include ccolorcut.h include ccubicbspline...

利用opencv進行換臉

關於換臉的什麼背景什麼的,我也就不提了,直接說一下換臉所需要的步驟吧,在這裡我用的是opencv和之前我用的clm框架,clm還是進行人臉關鍵點檢測,利用opencv進行臉部替換和顏色風格統一。接下來是利用opencv換臉的一般步驟 臉部關鍵點檢測 因為我們要變換的兩張臉的形狀一般是不同的,所以我們...

利用dlib進行人臉檢測

1 dlib安裝,pip install dlib。參考 同opencv人臉檢測,參考 構建人臉檢測器 detector dlib.get frontal face detector 獲取人臉關鍵點檢測器 predictor dlib.shape predictor shape predictor ...