Select largest object in an image

后端 未结 2 1857
不思量自难忘°
不思量自难忘° 2020-12-03 16:16

I am trying to find the the largest object in an image and remove any other objects in the image that are smaller than it.

This is what I have but I cannot get it to

相关标签:
2条回答
  • 2020-12-03 16:31

    If you would like to continue with the bwlabel approach, you may use this -

    Code

    BW = im2bw(imread('coins.png')); %%// Coins photo from MATLAB Library
    
    [L, num] = bwlabel(BW, 8);
    count_pixels_per_obj = sum(bsxfun(@eq,L(:),1:num));
    [~,ind] = max(count_pixels_per_obj);
    biggest_blob = (L==ind);
    
    %%// Display the images
    figure,
    subplot(211),imshow(BW)
    subplot(212),imshow(biggest_blob)
    

    Output

    enter image description here

    0 讨论(0)
  • 2020-12-03 16:51

    Use bwconncomp instead since it returns the coordinate indexes for region in a separate cell, where the size of each is easily discerned:

    >> BW = [1 0 0; 0 0 0; 0 1 1]; % two regions
    >> CC = bwconncomp(BW)
    CC = 
        Connectivity: 8
           ImageSize: [3 3]
          NumObjects: 2
        PixelIdxList: {[1]  [2x1 double]}
    

    The PixelIdxList field is a cell array with the indexes of coordinates for each region. The length of each array is the size of each region:

    >> numPixels = cellfun(@numel,CC.PixelIdxList)
    numPixels =
         1     2
    >> [biggestSize,idx] = max(numPixels)
    biggestSize =
         2
    idx =
         2
    

    Then you can easily make a new image with just this component:

    BW2 = false(size(BW));
    BW2(CC.PixelIdxList{idx}) = true;
    

    EDIT: From the comments, the need to crop the output image so that the region comes to the edges can be addressed with regionprops using the 'BoundingBox' option:

    s  = regionprops(BW2, 'BoundingBox');
    

    which gives you a rectangle s.BoundingBox which you can use to crop with BW3 = imcrop(BW2,s.BoundingBox);.

    0 讨论(0)
提交回复
热议问题