10

Sto lavorando nella segmentazione dell'immagine medica e voglio combinare l'algoritmo di connessione fuzzy con il taglio del grafico, l'idea è di segmentare l'immagine con collegamento sfocato lo sfondo e il primo piano verrà utilizzato come dissipatore e la fonte per l'algoritmo grafico taglio, questo è il mio codice per ottenere i semi coordinate per la segmentazione del grafico tagliosegmentazione dell'immagine utilizzando il taglio del grafico con punti di semina

FC=afc(S,K); %// Absolute FC 
u=FC>thresh; 
v=FC<thresh; 

s=regionprops(u, 'PixelIdxList'); %// listes de pixels de l´objet 
t=regionprops(v, 'PixelIdxList'); %// listes de pixels de l´arrière plan 
[a,b]=size(s); 
[w,c,z]= size(t) 

for i=1:a 
    for j=1:b 
     [y,x] = ind2sub(size(u), s(i,j).PixelIdxList); 
    end 
end 
for k=1:w 
    for d=1:c 
     [y1,x1] = ind2sub(size(v), t(k,d).PixelIdxList); 
    end 
end 

per il taglio grafico, ho usato un algoritmo dal File Exchange

ad esempio, Posso definire

Cs=-log([y x]) 
Ct=-log([y1 x1]) 

ma il problema è come combinare le informazioni delle funzioni di costo come questa parte del codice sorgente

u = double((Cs-Ct) >= 0); 
ps = min(Cs, Ct); 
pt = ps 

supererà la dimensione della matrice

risposta

5

non ho familiarità con la graph- taglia l'implementazione da FEX a cui sei collegato,
ma mostrerò un esempio usando GCMex matlab wrapper (divulgazione corretta: ho implementato questo wrapper).

Supponendo hanno un'immagine di taglia size(S) con n pixel e K un sparso matrice di dimensioni n -by- n con K(ii,jj) rappresentano quanto bene ii e jj pixel sono collegati (per attigua ii e jj).
Inoltre, si dispone di una maschera u di pixel in primo piano e una maschera v di pixel di sfondo da trattare come vincoli rigidi.

Innanzitutto, costruire il termine dati utilizzando u e v:

Dc = 1000*[u(:), v(:)]; %// assign very large cost for picking FG pixel to label zero and vice versa 

Come si può vedere i dati termine Dc, è n -da-2 array con il costo di assegnazione dell'etichetta l (0 o uno) al pixel ii viene memorizzato in Dc(ii,l+1). Pertanto, per i pixel in primo piano (u(ii) è 1) assegnare l'etichetta l=0 (ad esempio lo sfondo) il costo che si paga è 1000. Lo stesso vale per i pixel in background (v(ii) è 1) assegnandoli a foreground (ovvero, l = 1) è costato 1000. Pertanto, il termine dati Dc dà un costo molto alto ai pixel seme (in primo piano o in background) che ottengono l'etichetta sbagliata.

Costruire un oggetto grafico taglio

gch = GraphCut('open'), Dc, [0 1; 1 0], K); 
[gch L] = GraphCut('expand',gch); 
gch = GraphCut('close',gch); 
L = reshape(L, size(u)); 
figure; imshow(L,[]); title('the resulting mask'); 

Si noti che in rder utilizzare GCMex è necessario follw le istruzioni di installazione e compilarlo per farlo funzionare.

+0

Potete per favore elaborare, come distribuire i pesi alla fonte e al dissipatore? attualmente sottrarre il valore di source da maxValue per ottenere il valore di sink, ha senso. – ZdaR

+0

segui questo link è una semplice implicazione del taglio grafico interattivo https: //masterravi.wordpress.it/2011/05/24/segmentazione interattiva-using-graph-cutsmatlab-code/ –

+0

@ZdaR si prega di consultare il mio aggiornamento su 'Dc'. – Shai

Problemi correlati