如何在叶子图像中分割感兴趣的区域

时间:2014-02-22 05:52:11

标签: c++ opencv image-processing image-segmentation feature-extraction

目的: 我想检测叶子图像的某些区域。 我发现了我的相关问题,接近于此segment object(leaf) which is on the white paper using image processing(从白色背景中移除叶子)但是我的超越它,它的目的是提取/分割叶子的病变区域。

问题: 如何准确地分割和提取图像中叶片的病变区域。

我的尝试:
1. inRange()OpenCV函数      - 阈值绿色,这样我就不会为非绿色区域(棕色,灰色等)制作几个inRange值,我希望能去掉绿色;我应用了高斯模糊,在分割之前从RGB转换为HSV

image1,image2输入和结果的

链接到文件
IMAGE1: 结果: 绿色被细分(以为不太准确),但我仍然不知道如何提取非绿色区域(如下一步)

图像2: 结果: 包含黑色小圆圈/被视为绿色,据说不应该是

我是OpenCV(以及C ++)的新手,我已经阅读了几种技术(如聚类方法fuzzy-c和k-means等)进行分割,但我无法确定哪种分割技术可用于我的图像。我也从我读过的文章中了解到,没有可以应用于所有图像的通用分割技术。

因此,我想知道哪种技术(聚类方法?基于区域?直方图?等)或过程最适用于我所拥有的图像种类,以便准确地分割所述图像。

非常感谢。

1 个答案:

答案 0 :(得分:4)

试试以下步骤

创建蒙版图像: - 首先需要为树叶创建蒙版图像,需要进行阈值处理,找到轮廓(最大),绘制轮廓(填充)等...为了消除边缘效果,你需要侵蚀你的面具,这会产生更好的效果。

enter image description here enter image description here

enter image description here enter image description here

以下代码段将执行上述操作

Mat thr;
Mat src=imread("image2.png",1); //Your processed  image
cvtColor(src,thr,CV_BGR2GRAY);
threshold(thr,thr,180,255,THRESH_BINARY_INV);

vector< vector <Point> > contours; // Vector for storing contour
vector< Vec4i > hierarchy;
int largest_contour_index=0;
int largest_area=0;
Mat mask(src.rows,src.cols,CV_8UC1,Scalar::all(0)); //create destination image
findContours( thr.clone(), contours, hierarchy,CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE ); // Find the contours in the image
 for( int i = 0; i< contours.size(); i++ ) // iterate through each contour.
  {
   double a=contourArea( contours[i],false);  //  Find the area of contour
   if(a>largest_area){
   largest_area=a;
   largest_contour_index=i;                //Store the index of largest contour
   }
  }
 drawContours( mask,contours, largest_contour_index, Scalar(255,255,255),CV_FILLED, 8, hierarchy ); // Draw the largest contour using previously stored index.
 int dilation_size = 2;
 Mat element = getStructuringElement( MORPH_RECT,
                                      Size( 2*dilation_size + 1, 2*dilation_size+1 ),
                                      Point( dilation_size, dilation_size ) );
 erode( mask, mask, element );

提取绿色区域: - 在这里你应该使用hsv颜色空间,inrange等...如你的问题所述。

enter image description here enter image description here

Mat HSV,hsv_thr,dst;
cvtColor(src,HSV,CV_BGR2HSV);
inRange(HSV,Scalar(20,10,10),Scalar(90,255,255),hsv_thr);
上面图片的

bitwise_not: - 在这里你应该使用上面创建的面具。

enter image description here enter image description here

  bitwise_not(hsv_thr, dst, mask);

绘制患病区域: - 这里再次需要找到轮廓绘制轮廓等...

enter image description here enter image description here

findContours( dst.clone(), contours, hierarchy,CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE ); // Find the contours in the image
     for( int i = 0; i< contours.size(); i++ ) // iterate through each contour.
      drawContours( src,contours, i, Scalar(0,0,255),1, 8, hierarchy ); 

您可以通过适当的过滤,阈值处理使用适当的hsv范围等来改善结果...此外,上述算法认为您的背景始终为白色,而对于其他背景,您需要更改创建蒙版图像的步骤。

希望这些有用...