opencv 在hsv顏色空間識別區域顏色

2021-08-20 11:38:17 字數 3213 閱讀 3336

1. hsv顏色空間簡介

2. 為什麼是hsv

3. 識別方法說明

4. 識別步驟解析(**片段)

4. 檢測結果

由色調(hue)、飽和度(saturation)、亮度(value)三個分量構成,hsv更接近於人眼的主觀感受。我們可以通過下面的圖來展示hsv顏色分布情況:

使用了下面的matlab程式畫出上面的圖形,感興趣的可以**一下。程式很簡單。

[plain] 

view plain

copy

% 建立hsv分量  

hue        = repmat(linspace(0,1,100),100,1);  

saturation = repmat([linspace(0,1,50) linspace(1,0,50)].',1,100);  

value      = repmat([ones(1,50) linspace(1,0,50)].',1,100);  

% 生成hsv影象  

hsvimage = cat(3,hue,saturation,value);   

% 轉換成rgb影象  

rgbimage = hsv2rgb(hsvimage);   

% 構造座標系  

theta = linspace(0,2*pi,100);    

xcor = [zeros(1,100); cos(theta); zeros(1,100)];  

ycor = [zeros(1,100); sin(theta); zeros(1,100)];  

zcor = [2.*ones(2,100); zeros(1,100)];  

surf(xcor,ycor,zcor,rgbimage,'clipping','on','facecolor','texturemap','edgecolor','none');  

axis equal  

對於影象而言,識別相應的顏色在rgb空間、hsv空間或者其它顏色空間都是可行的。之所以選擇hsv,是因為h代表的色調基本上可以確定某種顏色,再結合飽和度和亮度資訊判斷大於某乙個閾值(這裡是40到255)。而rgb由三個分量構成,需要判斷每種分量的貢獻比例。比如:r = 200, g = 20, b = 30,可以看到r值很大,所以是紅色,再看gb值相對較小,可以判斷為深紅色。但如果變成:r = 200, g = 190, b = 180,實際上顏色已經接近灰色。

基本原理很簡單,讀入後,首先轉換成hsv顏色空間。然後逐一的判斷每個畫素是否在一定範圍內,並標識出來(是就標識為255,不是就標識為0)。這樣就可以用查詢輪廓的方式,把每個顏色區域標識出來。

[cpp] 

view plain

copy

image = imread(

"test4.png"

, cv_load_image_color);  

if(!image.data)  

imshow("display image"

, image);  

[cpp] 

view plain

copy

cvtcolor(image, hsvimg, color_bgr2hsv);  

[cpp] 

view plain

copy

enum

colortype;  

const

scalar hsvredlo( 0,  40,  40);  

const

scalar hsvredhi(40, 255, 255);  

const

scalar hsvgreenlo(41,  40,  40);  

const

scalar hsvgreenhi(90, 255, 255);  

const

scalar hsvbluelo(100,  40,  40);  

const

scalar hsvbluehi(140, 255, 255);  

vectorhsvlo;  

vectorhsvhi;  

vectortextcolor;  

[cpp] 

view plain

copy

// 查詢指定範圍內的顏色

inrange(hsvimg, hsvlo[coloridx], hsvhi[coloridx], imgthresholded);  

// 轉換成二值圖

threshold(imgthresholded, imgthresholded, 1, 255, thresh_binary);  

2)將所得的二值影象四邊都增加乙個畫素,再查詢輪廓。這樣做的乙個明顯情況是當影象為純色的時候,整圖只有一種顏色的判斷。當然可能還有各種情況,需要分別判斷。

[cpp] 

view plain

copy

copymakeborder(imgthresholded, imag_1, 1, 1, 1, 1, border_constant, 0);  

vector> contours0;  

vectorhierarchy;  

3) 檢查所有的輪廓中心點,如果非0,判斷為所需要查詢的顏色區域,用文字標記顏色。如藍色標記為字母『b』。

[cpp] 

view plain

copy

for(int

idx = 0; idx 

}  

用excel畫的顏色圖,圖中可以看到顏色都正確的標識了。第三行不是沒有識別出來,而是字母的顏色與本來的顏色一樣,這裡懶得設定了。

OpenCV中HSV顏色空間

opencv中實現bgr顏色空間想hsv顏色空間轉換的是cvcvtcolor h通道的值範圍為 0 180 s 0 255 v 0 255 後來發現了 cv bgr2hsv full cv bgr2hsv 在轉換影象的時候是將 h 2 h 我們知道影象中色相h的取值範圍為 0 360 所以利用ope...

opencv 在hsv顏色空間識別區域顏色

1.hsv顏色空間簡介 2.為什麼是hsv 3.識別方法說明 4.識別步驟解析 片段 4.檢測結果 由色調 hue 飽和度 saturation 亮度 value 三個分量構成,hsv更接近於人眼的主觀感受。我們可以通過下面的圖來展示hsv顏色分布情況 使用了下面的matlab程式畫出上面的圖形,感...

opencv學習筆記 hsv顏色空間

1.rgb模型。三維座標 原點到白色頂點的中軸線是灰度線,r g b三分量相等,強度可以由三分量的向量表示。用rgb來理解色彩 深淺 明暗變化 色彩變化 三個座標軸rgb最大分量頂點與黃紫青ymc色頂點的連線 深淺變化 rgb頂點和cmy頂點到原點和白色頂點的中軸線的距離 明暗變化 中軸線的點的位置...