当前位置:   article > 正文

如何使用Opencv识别颜色_opencv分析颜色深浅

opencv分析颜色深浅

彩色模型

数字图像处理中常用的采用模型是RGB(红,绿,蓝)模型和HSV(色调,饱和度,亮度),RGB广泛应用于彩色监视器和彩色视频摄像机,我们平时的图片一般都是RGB模型。而HSV模型更符合人描述和解释颜色的方式,HSV的彩色描述对人来说是自然且非常直观的。

HSV模型

HSV模型中颜色的参数分别是:色调(H:hue),饱和度(S:saturation),亮度(V:value)。由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。

(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] 是饱和度和亮度,方法如下:

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

具体实现

(1) 读取一张图片

cvtColor(imgOriginal, imgHSV, COLOR_BGR2HSV);

(2)将彩色图像均衡化

  1. split(imgHSV, hsvSplit);
  2. equalizeHist(hsvSplit[2],hsvSplit[2]);
  3. merge(hsvSplit,imgHSV);

(3)检测颜色

inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgThresholded);

(4)进行开操作和闭操作,去除噪声的影响。

  1. Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));
  2. morphologyEx(imgThresholded, imgThresholded, MORPH_OPEN, element);
  3. morphologyEx(imgThresholded, imgThresholded, MORPH_CLOSE, element);

代码:

  1. #include<opencv2/highgui/highgui.hpp>
  2. #include<opencv2/imgproc/imgproc.hpp>
  3. #include<iostream>
  4. using namespace cv;
  5. using namespace std;
  6. //入口主函数
  7. int main(int argc, char** argv)
  8. {
  9. //打开摄像头,从摄像头获取图像
  10. VideoCapture cap(0);
  11. if (!cap.isOpened())
  12. {
  13. cout << "Cannot open the web cam"<<endl;
  14. return -1;
  15. }
  16. //创建窗口
  17. namedWindow("Control",CV_WINDOW_AUTOSIZE);
  18. int iLowH = 100;
  19. int iHighH = 140;
  20. int iLowS = 90;
  21. int iHighS = 255;
  22. int iLowV = 90;
  23. int iHighV = 255;
  24. //创建进度条
  25. cvCreateTrackbar("LowH","Control",&iLowH,179);
  26. cvCreateTrackbar("HighH", "Control", &iHighH,179);
  27. cvCreateTrackbar("LowS", "Control", &iLowS,255);
  28. cvCreateTrackbar("Highs", "Control", &iHighS,255);
  29. cvCreateTrackbar("LowV", "Control", &iLowV,255);
  30. cvCreateTrackbar("HighV", "Control", &iHighV,255);
  31. //while循环加载图片
  32. while (true)
  33. {
  34. Mat imgOriginal;
  35. bool bSuccess = cap.read(imgOriginal);
  36. if (!bSuccess)
  37. {
  38. cout << "Cannot read a frame from video stream" << endl;
  39. break;
  40. }
  41. //
  42. Mat imgHSV;
  43. vector<Mat> hsvSplit;
  44. cvtColor(imgOriginal,imgHSV,COLOR_BGR2HSV);
  45. //转化成直方图均衡化
  46. split(imgHSV,hsvSplit);
  47. equalizeHist(hsvSplit[2],hsvSplit[2]);
  48. merge(hsvSplit,imgHSV);
  49. Mat imgThresholded;
  50. //确定颜色显示的范围
  51. inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS,iHighV),imgThresholded);
  52. //去除噪点
  53. Mat element = getStructuringElement(MORPH_RECT,Size(5,5));
  54. morphologyEx(imgThresholded,imgThresholded,MORPH_OPEN,element);
  55. //连接连通域
  56. morphologyEx(imgThresholded, imgThresholded, MORPH_CLOSE, element);
  57. imshow("Thresholded Image",imgThresholded);
  58. imshow("Original",imgOriginal);
  59. //等待时间
  60. char Key = (char)waitKey(300);
  61. if (Key==27)
  62. {
  63. break;
  64. }
  65. }
  66. return 0;
  67. }

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,C++设计模式,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/369976
推荐阅读
相关标签
  

闽ICP备14008679号