2012-06-18 17 views
7

tengo una imagen binaria que representa un número en MATLAB:área Relleno entre dos componentes conectados en MATLAB

image description

me gustaría para llenar todos los dígitos. El resultado deseado es:

enter image description here

Lo único que encontré fue la función imfill, pero eso no fue muy servicial ya que he perdido mis datos internos (círculo interno del 9 por ejemplo).

Respuesta

4

El problema es cómo distinguir los agujeros de los dígitos. Una posible solución ad hoc es filtrarlos por el área de los píxeles dentro.

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 

Después etapa (1):

enter image description here

Después la etapa (2):

enter image description here

+0

solución impresionante. Muchas gracias! ¡Lo único que cambié fue eliminar objetos cuyo espacio es menor que el 2% de la imagen y funciona muy bien! – user1240792

0

Suponiendo que el píxel superior izquierdo es siempre fuera las regiones a llenar:

trabajo a través de la línea superior, copiar píxeles de la imagen de salida

Cuando se llega a un píxel blanco seguido de un píxel negro la imagen de entrada, comenzar a establecer los píxeles en blanco la imagen de salida, hasta llegar a pixel negro seguido por un pixel blanco.

+3

No funcionará para una "imagen ruidosa" ... –

+0

@EitanT: lo suficientemente cierto - Estaba yendo en la muestra provista. –

+1

@MartinThompson las imágenes son binarias, por lo que el comentario que recibió es irrelevante. – mmgp

6

Otra posibilidad es utilizar la función BWBOUNDARIES, que:

traza los contornos exteriores de los objetos, así como límites de agujeros dentro de estos objetos

Esa información está contenida en el cuarto resultado A, una matriz de adyacencia que representa las dependencias padre-hijo-agujero.

%# 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

¡Agradable! Tenía la sensación de que debe haber una función de Matlab que lo hace, pero no lo sabía –

Cuestiones relacionadas