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);
.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…