(学习笔记)基于opencv颜色过滤只保留红色区域(适用于图像分割方面)

来源:互联网 发布:无间道 无间风云 知乎 编辑:程序博客网 时间:2024/06/05 14:42
  1. H分量得是(0,8),(120,180),S与V分量没有做筛选
  2. 分别取得H,S,V分量,注意图像转化的时候BGR2HSV,所以s.val[0]是B或H的值,s.val[1]是G或S的值,s.val[2]则是R或V的值。另外要注意一点,因为是对彩色图像做实验,所以如果传入的图片不是3通道的彩色图片,那么就会出内存错误。
  3. opencv 的H范围是0~180,红色的H范围大概是(0~8)∪(160,180) ,S是饱和度,一般是大于一个值,S过低就是灰色(参考值S>80),V是亮度,过低就是黑色,过高就是白色(参考值220>V>50)。

    所以接下来要做的就是遍历图像,获取图像每个像素点的H,S,V分量,然后做判断,满足条件的就保留,不满足的就赋值为黑色。


  4. void colorFilter(CvMat *inputImage, CvMat *&outputImage)  
  5. {  
  6.     int i, j;  
  7.     IplImage* image = cvCreateImage(cvGetSize(inputImage), 8, 3);  
  8.     cvGetImage(inputImage, image);      
  9.     IplImage* hsv = cvCreateImage( cvGetSize(image), 8, 3 );    
  10.       
  11.     cvCvtColor(image,hsv,CV_BGR2HSV);  
  12.     int width = hsv->width;  
  13.     int height = hsv->height;  
  14.     for (i = 0; i < height; i++)  
  15.         for (j = 0; j < width; j++)  
  16.         {  
  17.             CvScalar s_hsv = cvGet2D(hsv, i, j);//获取像素点为(j, i)点的HSV的值   
  18.             /* 
  19.                 opencv 的H范围是0~180,红色的H范围大概是(0~8)∪(160,180)  
  20.                 S是饱和度,一般是大于一个值,S过低就是灰色(参考值S>80), 
  21.                 V是亮度,过低就是黑色,过高就是白色(参考值220>V>50)。 
  22.             */  
  23.             CvScalar s;  
  24.             if (!(((s_hsv.val[0]>0)&&(s_hsv.val[0]<8)) || (s_hsv.val[0]>120)&&(s_hsv.val[0]<180)))  
  25.             {  
  26.                 s.val[0] =0;  
  27.                 s.val[1]=0;  
  28.                 s.val[2]=0;  
  29.                 cvSet2D(hsv, i ,j, s);  
  30.             }  
  31.               
  32.               
  33.         }  
  34.     outputImage = cvCreateMat( hsv->height, hsv->width, CV_8UC3 );  
  35.     cvConvert(hsv, outputImage);  
  36.     cvNamedWindow("filter");  
  37.     cvShowImage("filter", hsv);  
  38.     waitKey(0);  
  39.     cvReleaseImage(&hsv);  
  40. }  
阅读全文
0 0