HSV颜色识别

Home / C++ 百晓生 2018-10-9 5220

HSV(HSV颜色模型)

HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。这个模型中颜色的参数分别是:色调(H),饱和度(S),明度(V)。

首先解释为什么不在RGB中设置范围寻找物体信息,而是在HSV中:

因为RGB通道并不能很好地反映出物体具体的颜色信息 , 而相对于RGB空间,HSV空间能够非常直观的表达色彩的明暗,色调,以及鲜艳程度,方便进行颜色之间的对比,比如红色在HSV空间中H维度的范围为0~10和160~180 你跟我说在RGB中它的范围是什么呢?

一般情况下HSV模型各分量的取值范围为:H为0到360°,S为0到100%,V为0到255。但是在OpenCV中在由RGB转换到HSV的过程中,发现HSV中H为0到180°,S为0到255,V为0到255(仅供参考)

H:  0 — 180

S:  0 — 255

V:  0 — 255

在HSV空间各种颜色的范围

但是这个范围相对我们要寻找或者识别的物体还是太大,容易误判,因此我们需要借助PS寻找更精确的范围

点击吸管工具那个图标,选择HSB颜色

但是HSV颜色空间却规定的是,H范围0~360,S范围0~1,V范围0~1 

PS中的HSV范围,H是0-360,S是0-1,V(B)是0-1

opencv中的HSV范围,H是0-180,S是0-255,V是0-255

因此需要转换一下

把PS中H的值除以2,S乘255,V乘255,可以得到对应的opencv的HSV值

在PS中某个物体上移动鼠标,可以大致看出物体颜色的HSV三个分量的范围,用这三个范围来识别物体

识别代码如下:

void hsvreg()
{
    Mat img = imread("蓝色笔筒.jpg",1);
 
    Mat imgHSV;  
 
    //蓝色笔筒颜色的HSV范围
    int iLowH = 100 /2;  
    int iHighH = 120 /2;  
 
    int iLowS = 50 *255/100;   
    int iHighS = 70 *255/100;  
 
    int iLowV = 40 *255/100;  
    int iHighV = 50 *255/100;  
 
    cvtColor(img, imgHSV, COLOR_BGR2HSV);//转为HSV
 
    imwrite("hsv.jpg",imgHSV);
 
    Mat imgThresholded;
 
    inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgThresholded); //Threshold the image  
 
    //开操作 (去除一些噪点)  如果二值化后图片干扰部分依然很多,增大下面的size
    Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));  
    morphologyEx(imgThresholded, imgThresholded, MORPH_OPEN, element);  
  
    //闭操作 (连接一些连通域)  
    morphologyEx(imgThresholded, imgThresholded, MORPH_CLOSE, element);  
  
    namedWindow("Thresholded Image",CV_WINDOW_NORMAL);
    imshow("Thresholded Image", imgThresholded); 
    
    //这里是自定义的求取形心函数,当然用连通域计算更好
    //Point center;
    //center = GetCenterPoint(imgThresholded);//获取二值化白色区域的形心
 
    //circle(img, center, 100, Scalar(0,0,255), 5, 8, 0);//绘制目标位置
    imwrite("end.jpg", img);
 
    waitKey(0);
}

源码源自于网络,仅供参考学习,不同opencv版本,可能方法也不一样。

本文链接:https://www.it72.com/12407.htm

推荐阅读
最新回复 (0)
返回