OpenCV色彩識別

2021-08-29 03:36:52 字數 4147 閱讀 1310

hsv模型中顏色的引數分別是:色調(h:hue),飽和度(s:saturation),亮度(v:value)。由a. r. smith在2023年建立的一種顏色空間, 也稱六角錐體模型(hexcone model)。

設 (r, g, b) 分別是乙個顏色的紅、綠和藍座標,它們的值是在 0 到 1 之間的實數。設 max 等價於 r, g 和 b 中的最大者。設 min 等於這些值中的最小者。要找到在 hsv 空間中的 (h, s, v) 值,這裡的 h ∈ [0, 360)是角度的色相角,而 s, v ∈ [0,1] 是飽和度和亮度,計算為:

max=max(r,g,b)

min=min(r,g,b)

if r = max, h = (g-b)/(max-min)

if g = max, h = 2 + (b-r)/(max-min)

if b = max, h = 4 + (r-g)/(max-min)

h = h * 60

if h < 0, h = h + 360

v=max(r,g,b)

s=(max-min)/max

opencv下有個函式可以直接將rgb模型轉換為hsv模型,注意的是opencv中h∈ [0, 180), s ∈ [0, 255], v ∈ [0, 255]。我們知道h分量基本能表示乙個物體的顏色,但是s和v的取值也要在一定範圍內,因為s代表的是h所表示的那個顏色和白色的混合程度,也就說s越小,顏色越發白,也就是越淺;v代表的是h所表示的那個顏色和黑色的混合程度,也就說v越小,顏色越發黑。經過實驗,識別藍色的取值是 h在100到140,s和v都在90到255之間。一些基本的顏色h的取值可以如下設定:

orange 0-22

yellow 22- 38

green 38-75

blue 75-130

violet 130-160

red 160-179

opencv實現

cvtcolor(imgoriginal, imghsv, color_bgr2hsv);
然後我們對彩色影象做直方圖均衡化

//因為我們讀取的是彩色圖,直方圖均衡化需要在hsv空間做

split(imghsv, hsvsplit);

equalizehist(hsvsplit[2],hsvsplit[2]);

merge(hsvsplit,imghsv);

接著就是進行顏色檢測,我們用void inrange(inputarray src, inputarray lowerb, inputarray upperb, outputarray dst);函式進行顏色檢測,這個函式的作用就是檢測src影象的每乙個畫素是不是在lowerb和upperb之間,如果是,這個畫素就設定為255,並儲存在dst影象中,否則為0。

inrange(imghsv, scalar(ilowh, ilows, ilowv), scalar(ihighh, ihighs, ihighv), imgthresholded); //threshold the image
通過上面的函式我們就可以得到目標顏色的二值影象,接著我們先對二值影象進行開操作,刪除一些零零星星的噪點,再使用閉操作,連線一些連通域,也就是刪除一些目標區域的白色的洞。

//開操作 (去除一些噪點)

mat element = getstructuringelement(morph_rect, size(5, 5));

morphologyex(imgthresholded, imgthresholded, morph_open, element);

//閉操作 (連線一些連通域)

morphologyex(imgthresholded, imgthresholded, morph_close, element);

整個**實現

#include #include "opencv2/highgui/highgui.hpp"

#include "opencv2/imgproc/imgproc.hpp"

using namespace cv;

using namespace std;

int main( int argc, char** argv )

namedwindow("control", cv_window_autosize); //create a window called "control"

int ilowh = 100;

int ihighh = 140;

int ilows = 90;

int ihighs = 255;

int ilowv = 90;

int ihighv = 255;

//create trackbars in "control" window

cvcreatetrackbar("lowh", "control", &ilowh, 179); //hue (0 - 179)

cvcreatetrackbar("highh", "control", &ihighh, 179);

cvcreatetrackbar("lows", "control", &ilows, 255); //saturation (0 - 255)

cvcreatetrackbar("highs", "control", &ihighs, 255);

cvcreatetrackbar("lowv", "control", &ilowv, 255); //value (0 - 255)

cvcreatetrackbar("highv", "control", &ihighv, 255);

while (true)

mat imghsv;

vectorhsvsplit;

cvtcolor(imgoriginal, imghsv, color_bgr2hsv); //convert the captured frame from bgr to hsv

//因為我們讀取的是彩色圖,直方圖均衡化需要在hsv空間做

split(imghsv, hsvsplit);

equalizehist(hsvsplit[2],hsvsplit[2]);

merge(hsvsplit,imghsv);

mat imgthresholded;

inrange(imghsv, scalar(ilowh, ilows, ilowv), scalar(ihighh, ihighs, ihighv), imgthresholded); //threshold the image

//開操作 (去除一些噪點)

mat element = getstructuringelement(morph_rect, size(5, 5));

morphologyex(imgthresholded, imgthresholded, morph_open, element);

//閉操作 (連線一些連通域)

morphologyex(imgthresholded, imgthresholded, morph_close, element);

imshow("thresholded image", imgthresholded); //show the thresholded image

imshow("original", imgoriginal); //show the original image

char key = (char) waitkey(300);

if(key == 27)

break;

}return 0;

}

實驗結果圖: 

經典的顏色識別的經典應用就是車牌定位了,因為中國的車牌無非就是藍色和黃色,還有就是交通標誌定位也是個應用。比如下面兩張,有很明顯的顏色區分。 

Open CV 色彩空間

顏色空間按照基本結構可以分兩大類 基色顏色空間 和 色 亮分離顏色空間。前者的典型是 rgb,還包括 cmy cmyk cie xyz 等 後者包括 ycc yuv lab 以及一批 色相類顏色空間 cie xyz 是定義一切顏色空間的基準,很奇妙的是,它即屬於基色顏色空間,也屬於色 亮分離顏色空間...

opencv之偽色彩

opencv之偽色彩 引數 src 源影象 灰度圖或彩色圖 cv 8uc1 or cv 8uc3 dst 在源影象上進行色彩對映後的結果影象。colormap 提供的色彩圖 值。例子 import cv2 偽色彩 顯示影象 cv2.imshow input img cv2.imshow dst co...

opencv學習之色彩提取與色彩空間

上篇文章我們說了有關色彩的問題,rgb只是一種色彩空間,除了它之外我們還有很多色彩空間,這篇重點說一下色彩空間的轉換以及在hsv色彩空間中對於顏色的提取。我們先來看 import cv2 as cv import numpy as np 建議先跳過這個函式去看下面的色彩空間轉換函式,看完了再回過頭看...