Другая возможность заключается в том, чтобы использовать функцию BWBOUNDARIES, которая:
отслеживает внешние границы объектов, а также границы отверстий внутри этих объектов
Эта информация содержится в четвертый выход A
, матрица смежности, которая представляет зависимости от родительских и дочерних дыр.
%# 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')
Впечатляющие решение. Спасибо большое! Единственное, что я изменил, это удалить объекты, размер которых меньше 2% изображения, и он отлично работает! – user1240792