2012-06-18 10 views
7

Ho un'immagine binaria che rappresenta un numero in MATLAB:zona Fill tra due componenti connesse in MATLAB

image description

mi piacerebbe riempire tutte le cifre. Il risultato desiderato è:

enter image description here

L'unica cosa che ho trovato è stata la funzione imfill, ma che non è stato davvero disponibile da quando ho perso i miei dati interne (cerchio interno del 9 di, per esempio).

risposta

4

Il problema è come distinguere i fori dalle cifre. Una possibile soluzione ad hoc li sta filtrando in base all'area dei pixel all'interno.

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 

Dopo stadio (1):

enter image description here

Dopo stadio (2):

enter image description here

+0

soluzione impressionante. Grazie mille !! L'unica piccola cosa che ho cambiato è stato rimuovere oggetti che lo spazio è più piccolo del 2% dell'immagine e funziona benissimo !! – user1240792

0

Supponendo che il pixel in alto a sinistra è sempre fuori le aree da riempire:

lavoro su tutta la linea superiore, la copia di pixel per l'immagine di uscita

Quando si arriva a un pixel bianco seguito da un pixel nero l'immagine in ingresso a, iniziare ad impostare pixel bianchi nell'immagine di uscita, fino ad arrivare a pixel nero seguito da un pixel bianco.

+3

Non funziona per una "immagine rumorosa" ... –

+0

@EitanT: abbastanza vero - stavo andando sul campione fornito. –

+1

@MartinThompson le immagini sono binarie, quindi il commento che hai ricevuto è irrilevante. – mmgp

6

Un'altra possibilità è quella di utilizzare la funzione BWBOUNDARIES, quali:

ripercorre i confini esterni degli oggetti, nonché confini fori all'interno di questi oggetti

Tale informazione è contenuta nel quarta uscita A, una matrice di adiacenza che rappresenta le dipendenze padre-figlio.

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

Bello! Ho avuto la sensazione che ci debba essere una funzione Matlab che lo fa, ma non lo sapeva –