数字图像处理中常用的模型有RGB(红、绿、蓝)模型和HSV(色调、饱和度、亮度)模型。 RGB 广泛用于彩色显示器和彩色摄像机。 我们平时的图片一般都是RGB模型。 HSV模型更符合人们描述和解释颜色的方式,HSV的颜色描述对人们来说是自然而直观的。
单纯疱疹病毒模型
HSV模型中颜色的参数有:色调(H:hue)、饱和度(S:saturation)、亮度(V:value)。 由 AR Smith 于 1978 年创建的色彩空间,也称为 Hexcone 模型。
(1)色调(H:hue):以角度衡量,取值范围0°~360°,从红色开始逆时针数,红色为0°,绿色为120°,蓝色为240°。 它们的互补色是:黄色为60°,青色为180°,品红色为300°;
(2)饱和度(S:saturation):取值范围为0.0到1.0,值越大,颜色越饱和。
(3)亮度(V:value):取值范围为0(黑色)到255(白色)
将 RGB 转换为 HSV
设(r,g,b)分别为一种颜色的红、绿、蓝坐标,它们的值是0到1之间的实数。设max等于r、g、b中的最大值。 让 min 等于这些值中的最小值。 求HSV空间中的(h, s, v)值,其中h ∈ [0, 360)为色相角,s, v ∈ [0,1]为饱和度和明度,方法为如下:
最大=最大(R,G圣诞红rgb,B)
分钟=分钟(R,G,B)
如果 R = 最大值,H = (GB)/(最大值-最小值)
如果 G = 最大值,H = 2 + (BR)/(最大值-最小值)
如果 B = 最大值,H = 4 + (RG)/(最大值-最小值)
高 = 高 * 60
如果 H < 0,H = H + 360
OpenCV下有一个函数可以直接将RGB模型转换成HSV模型。 在 OpenCV 中,H ∈ [0, 180],S ∈ [0, 255]圣诞红rgb,V ∈ [0, 255]。 我们知道H分量基本可以代表一个物体的颜色,但是S和V的取值也必须在一定的范围内,因为S代表的是H所代表的颜色和白色的混合程度,即也就是说,S越小,颜色越白,也就是颜色越浅; V表示H所代表的颜色与黑色混合的程度,也就是说V越小,颜色越深。 经过实验,识别蓝色的取值是H在100到140之间,S和V都在90到255之间。一些基本色H的取值可以设置如下:
橙0-22、黄22-38、绿38-75、蓝75-130、紫130-160、红160-179
执行
(1)读一张图片
cvtColor(imgOriginal, imgHSV, COLOR_BGR2HSV);
(2) 对彩色图像进行均衡
split(imgHSV, hsvSplit);
equalizeHist(hsvSplit[2],hsvSplit[2]);
merge(hsvSplit,imgHSV);
(3) 检测颜色
inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgThresholded);
(4)进行开闭操作,排除噪声的影响。
Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));
morphologyEx(imgThresholded, imgThresholded, MORPH_OPEN, element);
morphologyEx(imgThresholded, imgThresholded, MORPH_CLOSE, element);
代码:
#include
#include
#include
using namespace cv;
using namespace std;
//入口主函数
int main(int argc, char** argv)
{
//打开摄像头,从摄像头获取图像
VideoCapture cap(0);
if (!cap.isOpened())
{
cout << "Cannot open the web cam"<rame from video stream" << endl;
break;
}
//
Mat imgHSV;
vector hsvSplit;
cvtColor(imgOriginal,imgHSV,COLOR_BGR2HSV);
//转化成直方图均衡化
split(imgHSV,hsvSplit);
equalizeHist(hsvSplit[2],hsvSplit[2]);
merge(hsvSplit,imgHSV);
Mat imgThresholded;
//确定颜色显示的范围
inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS,iHighV),imgThresholded);
//去除噪点
Mat element = getStructuringElement(MORPH_RECT,Size(5,5));
morphologyEx(imgThresholded,imgThresholded,MORPH_OPEN,element);
//连接连通域
morphologyEx(imgThresholded, imgThresholded, MORPH_CLOSE, element);
imshow("Thresholded Image",imgThresholded);
imshow("Original",imgOriginal);
//等待时间
char Key = (char)waitKey(300);
if (Key==27)
{
break;
}
}
return 0;
}
本文福利,免费领取Qt开发学习资料包,技术视频,包括(C++语言基础,C++设计模式,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程、QT项目实战、QSS、OpenCV、Quick模块、面试题等)↓↓↓↓↓↓↓见下文↓↓点击文章底部领取费用↓↓