OpenCV-利用函数inRange进行颜色分割(针对HSV颜色空间)

我们可以利用inRange函数,通过调节图像颜色信息(H)、饱和度(S)、亮度(V)区间选择我们需要的图像区域:

[cpp]  view plain  copy
  1. #include<opencv2/core.hpp>  
  2. #include<opencv2/highgui.hpp>  
  3. #include<opencv2/imgproc.hpp>  
  4. using namespace cv;  
  5. #include<iostream>  
  6. #include<string>  
  7. using namespace std;  
  8. //输入图像  
  9. Mat img;  
  10. //灰度值归一化  
  11. Mat bgr;  
  12. //HSV图像  
  13. Mat hsv;  
  14. //色相  
  15. int hmin = 0;  
  16. int hmin_Max = 360;  
  17. int hmax = 360;  
  18. int hmax_Max = 360;  
  19. //饱和度  
  20. int smin = 0;  
  21. int smin_Max = 255;  
  22. int smax = 255;  
  23. int smax_Max = 255;  
  24. //亮度  
  25. int vmin = 106;  
  26. int vmin_Max = 255;  
  27. int vmax = 250;  
  28. int vmax_Max = 255;  
  29. //显示原图的窗口  
  30. string windowName = "src";  
  31. //输出图像的显示窗口  
  32. string dstName = "dst";  
  33. //输出图像  
  34. Mat dst;  
  35. //回调函数  
  36. void callBack(intvoid*)  
  37. {  
  38.     //输出图像分配内存  
  39.     dst = Mat::zeros(img.size(), CV_32FC3);  
  40.     //掩码  
  41.     Mat mask;  
  42.     inRange(hsv, Scalar(hmin, smin / float(smin_Max), vmin / float(vmin_Max)), Scalar(hmax, smax / float(smax_Max), vmax / float(vmax_Max)), mask);  
  43.     //只保留  
  44.     for (int r = 0; r < bgr.rows; r++)  
  45.     {  
  46.         for (int c = 0; c < bgr.cols; c++)  
  47.         {  
  48.             if (mask.at<uchar>(r, c) == 255)  
  49.             {  
  50.                 dst.at<Vec3f>(r, c) = bgr.at<Vec3f>(r, c);  
  51.             }  
  52.         }  
  53.     }  
  54.     //输出图像  
  55.     imshow(dstName, dst);  
  56.     //保存图像  
  57.     dst.convertTo(dst, CV_8UC3, 255.0, 0);  
  58.     imwrite("HSV_inRange.jpg", dst);  
  59. }  
  60. int main(int argc, char*argv[])  
  61. {  
  62.     //输入图像  
  63.     img = imread(argv[1], IMREAD_COLOR);  
  64.     if (!img.data || img.channels() != 3)  
  65.         return -1;  
  66.     imshow(windowName, img);  
  67.     //彩色图像的灰度值归一化  
  68.     img.convertTo(bgr, CV_32FC3, 1.0 / 255, 0);  
  69.     //颜色空间转换  
  70.     cvtColor(bgr, hsv, COLOR_BGR2HSV);  
  71.     //定义输出图像的显示窗口  
  72.     namedWindow(dstName, WINDOW_GUI_EXPANDED);  
  73.     //调节色相 H  
  74.     createTrackbar("hmin", dstName, &hmin, hmin_Max, callBack);  
  75.     createTrackbar("hmax", dstName, &hmax, hmax_Max, callBack);  
  76.     //调节饱和度 S  
  77.     createTrackbar("smin", dstName, &smin, smin_Max, callBack);  
  78.     createTrackbar("smax", dstName, &smax, smax_Max, callBack);  
  79.     //调节亮度 V  
  80.     createTrackbar("vmin", dstName, &vmin, vmin_Max, callBack);  
  81.     createTrackbar("vmax", dstName, &vmax, vmax_Max, callBack);  
  82.     callBack(0, 0);  
  83.     waitKey(0);  
  84.     return 0;  
  85. }  
运行结果如下:

可以通过调节不同的颜色、饱和度、亮度区间来定义信息

           

   
 

猜你喜欢

转载自blog.csdn.net/u013270326/article/details/80678280