Заполните область между двумя подключенными компонентами в MATLAB

У меня есть двоичное изображение, которое представляет число в MATLAB:

image description

Я хотел бы заполнить все цифры. Желаемый результат:

enter image description here

Единственное, что я нашел, былоimfill функция, но это не очень помогло, так как я потерял свои внутренние данные (например, внутренний круг 9).

Ответы на вопрос(3)

Решение Вопроса

Проблема в том, как отличить отверстия от цифр. Возможное специальное решение - отфильтровать их по площади пикселей внутри.

function SolveSoProblem()

    I = imread('http://i.stack.imgur.com/SUvif.png');

    %Fill all the holes 
    F = imfill(I,'holes');

    %Find all the small ones,and mark their edges in the image
    bw = bwlabel(I);
    rp = regionprops(bw,'FilledArea','PixelIdxList');
    indexesOfHoles = [rp.FilledArea]<150;   
    pixelsNotToFill = vertcat(rp(indexesOfHoles).PixelIdxList); 
    F(pixelsNotToFill) = 0;
    figure;imshow(F);

    %Remove the inner area
    bw1 = bwlabel(F,4);
    rp = regionprops(bw1,'FilledArea','PixelIdxList');
    indexesOfHoles1 = [rp.FilledArea]<150;
    pixelListToRemove = vertcat(rp(indexesOfHoles1).PixelIdxList);
    F(pixelListToRemove) = 0;

    figure;imshow(F);
end

Послеstep(1):

enter image description here

Послеstep(2):

enter image description here

 user124079218 июн. 2012 г., 12:08
Впечатляющее решение. Большое спасибо!! Единственное, что я изменил, это удалил объекты, размер которых меньше 2% изображения, и это прекрасно работает !!

Предполагая, что верхний левый пиксель всегда находится вне областей для заполнения:

Работа через верхнюю строку, копирование пикселей на выходное изображение

Когда вы переходите к белому пикселю, за которым следует черный пиксель во входном изображении, начинайте устанавливать белые пиксели в выходном изображении, пока не дойдете до черного пикселя, за которым следует белый пиксель.

 18 июн. 2012 г., 16:19
Не работал для "шумной картинки" ...
 18 янв. 2013 г., 17:59
@MartinThompson изображения являются двоичными, поэтому полученный вами комментарий не имеет значения.
 18 июн. 2012 г., 17:12
@EitanT: достаточно верно - я собирался использовать предоставленный образец.

Другая возможность заключается в использованииBWBOUNDARIES функция, которая:

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

Эта информация содержится в четвертом выводе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')

enter image description here

 19 июн. 2012 г., 07:16
Ницца! У меня было ощущение, что должна быть функция Matlab, которая делает это, но я этого не знал

Ваш ответ на вопрос