Removing blobs from a binary image

前端 未结 2 1914
感情败类
感情败类 2021-02-14 19:10

I have a binary image which contain few blobs.

I want to remove blobs which are less than a certain area.

Can any one suggest me a way?

I am using Open-C

相关标签:
2条回答
  • 2021-02-14 19:41
                //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;
                    }
                }
    

    Well give this a try...

    0 讨论(0)
  • 2021-02-14 19:45

    You can do something like this:

    // 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);
    }
    
    0 讨论(0)
提交回复
热议问题