openCV中HSV颜色表示
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了openCV中HSV颜色表示相关的知识,希望对你有一定的参考价值。
参考技术A openCV中经常将RGB图像转换成HSV图像然后进行颜色的辨别和处理我们能够查到一般HSV的范围是
H: [0,360]
S: [0,100]
V: [0,100]
但是在openCV中,HSV的范围却是
H: [0,180]
S: [0,255]
V: [0,255]
那是因为openCV做了如下的变换
所以在openCV中
一般颜色的HSV分布如下:
如果要对应正常的HSV,那么
h要 x2
s要 /2.55
v要 /2.55
opencv目标识别——HSV颜色识别
首先解释为什么不在RGB中设置范围寻找物体信息,而是在HSV中:
因为RGB通道并不能很好地反映出物体具体的颜色信息 , 而相对于RGB空间,HSV空间能够非常直观的表达色彩的明暗,色调,以及鲜艳程度,方便进行颜色之间的对比,比如红色在HSV空间中H维度的范围为0~10和160~180 你跟我说在RGB中它的范围是什么呢?
下面是通过实验计算的模糊范围(准确的范围在网上都没有给出)。
H: 0 — 180
S: 0 — 255
V: 0 — 255
在HSV空间各种颜色的范围
图来自:http://blog.csdn.net/taily_duan/article/details/51506776
但是这个范围相对我们要寻找或者识别的物体还是太大,容易误判,因此我们需要借助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中HSV颜色表示的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV 例程200篇209. HSV 颜色空间的彩色图像分割