2013-06-07 15 views
7

Ho un'immagine binaria che contiene pochi blob.Rimozione di BLOB da un'immagine binaria

Desidero rimuovere i BLOB che sono inferiori a una determinata area.

Qualcuno può suggerirmi un modo?

Sto usando Open-CV. ho fatto la dilatazione e l'erosione per ottenere quei blob. quindi ho bisogno di qualcosa di diverso per rimuovere i blob di alesatura che sono meno di una certa area.

+1

1. algoritmo di etichettatura run conncomp. 2. Eliminare le aree di dimensioni inferiori alla soglia. Un'altra variante è N-times erosion e after - N-times dilation (ma la più alta N è la peggiore restavration di BLOB) –

+0

Potresti fornire un'immagine di esempio? – by0

risposta

1

si può fare qualcosa di simile:

// 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

Qualcuno può spiegarmi come ha fatto contouring_all nella condizione if? e cosa contiene Non potevo capire –

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; 
       } 
      } 

Beh dare una prova ...