Fill area between two connected components in MATLAB

user1240792 picture user1240792 · Jun 18, 2012 · Viewed 12.6k times · Source

I have a binary image that represents a number in MATLAB:

image description

I'd like to fill all the digits. The desired result is:

enter image description here

The only thing I found was the imfill function, but that wasn't really helpfull since I've lost my inner data (the 9's inner circle for example).

Answer

Amro picture Amro · Jun 18, 2012

Another possibility is to use the BWBOUNDARIES function, which:

traces the exterior boundaries of objects, as well as boundaries of holes inside these objects

That information is contained in the fourth output A, an adjacency matrix that represents the parent-child-hole dependencies.

%# read binary image
bw = imread('SUvif.png');

%# find all boundaries
[B,L,N,A] = bwboundaries(bw, 8, 'holes');

%# exclude inner holes
[r,~] = find(A(:,N+1:end));        %# find inner boundaries that enclose stuff
[rr,~] = find(A(:,r));                      %# stuff they enclose
idx = setdiff(1:numel(B), [r(:);rr(:)]);    %# exclude both
bw2 = ismember(L,idx);                      %# filled image

%# compare results
subplot(311), imshow(bw), title('original')
subplot(312), imshow( imfill(bw,'holes') ), title('imfill')
subplot(313), imshow(bw2), title('bwboundaries')

enter image description here