2013-06-07 13 views
7

Tôi có hình ảnh nhị phân có chứa vài đốm màu.Xóa các đốm màu khỏi hình ảnh nhị phân

Tôi muốn xóa các đốm màu ít hơn một khu vực nhất định.

Có thể bất kỳ ai đề xuất cho tôi một cách không?

Tôi đang sử dụng Open-CV. tôi đã giãn nở và xói mòn để có được những đốm màu đó. vì vậy tôi cần một cái gì đó khác nhau để loại bỏ các đốm màu reaming đó là ít hơn một khu vực nhất định.

+1

1. thuật toán ghi nhãn chạy conncomp. 2. Vứt bỏ các khu vực có kích thước nhỏ hơn treshold. Một biến thể khác là N-lần xói mòn và sau - N-lần giãn nở (nhưng N cao hơn sự tàn phá nặng hơn của các đốm màu) –

+0

Bạn có thể cung cấp một hình ảnh ví dụ? – by0

Trả lời

1

Bạn có thể làm một cái gì đó như thế này:

// your input binary image 
// assuming that blob pixels have positive values, zero otherwise 
Mat binary_image; 

// threashold specifying minimum area of a blob 
double threshold = 100; 

vector<vector<Point>> contours; 
vector<Vec4i> hierarchy; 
vector<int> small_blobs; 
double contour_area; 
Mat temp_image; 

// find all contours in the binary image 
binary_image.copyTo(temp_image); 
findContours(temp_image, contours, hierarchy, CV_RETR_CCOMP, 
                CV_CHAIN_APPROX_SIMPLE); 

// Find indices of contours whose area is less than `threshold` 
if (!contours_all.empty()) { 
    for (size_t i=0; i<contours.size(); ++i) { 
     contour_area = contourArea(contours_all[i]) ; 
     if (contour_area < threshold) 
      small_blobs.push_back(i); 
    } 
} 

// fill-in all small contours with zeros 
for (size_t i=0; i < small_blobs.size(); ++i) { 
    drawContours(binary_image, contours, small_blobs[i], cv::Scalar(0), 
               CV_FILLED, 8); 
} 
+1

Ai đó có thể vui lòng giải thích cho tôi cách contours_all đến trong điều kiện if? và những gì nó chứa. Tôi không thể hiểu –

0
  //src_gray is your image that we threshold 
      threshold(src_gray, threshold_output, NULL, 255, THRESH_OTSU); 
      /// Find contours 
      findContours(threshold_output, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0)); 
      /// Approximate contours 
      vector<Rect> boundRect(contours.size()); 
      for (unsigned int i = 0; i < contours.size(); i++) 
      { //identify bounding box 
       boundRect[i] = boundingRect(contours[i]); 
      } 
      for (unsigned int i = 0; i < contours.size(); i++) 
      { 

       if ((boundRect[i].area() < //enter your area here)) 
       { 
        src_gray(boundRect[i])=//set it to whatever value you want; 
       } 
      } 

Vâng cung cấp cho một thử này ...