首页 > 学院 > 开发设计 > 正文

opencv 颜色识别

2019-11-06 07:20:24
字体:
来源:转载
供稿:网友
对于opencv本人也属于小白,刚开始学习,有些代码也借鉴然后修改的,望多包涵,第一次写blog,以后我会将自己学习到的在这上面分享这个程序是基于opencv2.4.9+VS2013,功能是实现某种颜色的识别,将图片阈值化,效果可见文末图;彩色模型数字图像处理中常用的采用模型是RGB(红,绿,蓝)模型和HSV(色调,饱和度,亮度),RGB广泛应用于彩色监视器和彩色视频摄像机,我们平时的图片一般都是RGB模型。而HSV模型更符合人描述和解释颜色的方式,HSV的彩色描述对人来说是自然且非常直观的。HSV模型HSV模型中颜色的参数分别是:色调(H:hue),饱和度(S:saturation),亮度(V:value)。由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。色调(H:hue):用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;饱和度(S:saturation):取值范围为0.0~1.0,值越大,颜色越饱和。亮度(V:value):取值范围为0(黑色)~255(白色)。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-22Yellow 22- 38Green 38-75Blue 75-130Violet 130-160Red 160-179而在opencv中可以使用cvtColor()将所需要转化成的格式进行转换:RGB转HSV:cvtColor(srcImage, dstImage, COLOR_BGR2HSV);首先我们先读取一张照片Mat srcImage = imread("1.jpg");然后进行模型转换cvtColor(srcImage, srcImage, COLOR_BGR2HSV);因为我们在下一步中需要进行均匀化,RGB模型是不能进行均匀化的,有关均匀化这个问题我大概说一下我的理解,就是使得图片色调相近,将有些图像泛白的就让他暗一点,有些图像对比度太高就低一点;然后我们就对图片进行通道分离split(srcImage, Channels);然后再将亮度均匀化,这里的Channel是一个三维数值equalizeHist(Channels[2], Channels[2]);然后再将通道合并,merge(Channels, srcImage);最后进行二值化:inRange(srcImage, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgThresholded);scalar()表示一个数组;效果如图:完整代码如下:#include"opencv2/opencv.hpp"using namespace cv;void main(){int iLowH = 160;int iHighH = 179;int iLowS = 90;int iHighS = 255;int iLowV = 90;int iHighV = 255;vector<Mat> Channels;Mat imgThresholded;Mat srcImage = imread("1.jpg");cvtColor(srcImage, srcImage, COLOR_BGR2HSV);split(srcImage, Channels);equalizeHist(Channels[2], Channels[2]);merge(Channels, srcImage);inRange(srcImage, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgThresholded);imshow("【均匀之后】", imgThresholded);waitKey(0);

}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表