2012-06-18 2 views
7

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

image description

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

enter image description here

Единственное, что я нашел был imfill функция, но это на самом деле не ПОЛЕЗНЫЕ, так как я потерял свои внутренние данные (9 по внутренней окружности, например).

ответ

4

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

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 

После стадии (1):

enter image description here

После стадии (2):

enter image description here

+0

Впечатляющие решение. Спасибо большое! Единственное, что я изменил, это удалить объекты, размер которых меньше 2% изображения, и он отлично работает! – user1240792

0

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

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

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

+3

Не будет работать для «шумной картинки» ... –

+0

@EitanT: правда, я шел по образцу. –

+1

@MartinThompson изображения являются двоичными, поэтому полученный вами комментарий не имеет значения. – mmgp

6

Другая возможность заключается в том, чтобы использовать функцию 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') 

enter image description here

+0

Ницца! У меня было ощущение, что должна быть функция Matlab, которая делает это, но не знает этого –

Смежные вопросы