7

Ho una domanda riguardante il seguente scenario. Come ho post-processare un'immagine, ho acquisito un contorno, che sfortunatamente è collegato due volte come potete vedere nella riga inferiore. Per rendere evidente ciò che voglio è solo la linea esterna. Quindi ho ingrandito e segnato la linea, voglio dell'immagine grande.Separazione morfologica di due confini collegati

Quello che voglio da questa selezione è solo la parte outter, che ho segnato il verde nella figura seguente. Scusa per le mie cattive capacità di disegno. ;)

Sto usando MatLab con l'IPT. Così ho anche provato a distinguere con bwmorph e l'opzione hbreak, ma ha generato un errore.

Come risolvere il problema? Se avessi successo potresti parlarmi un po 'di più? Grazie in anticipo!

Sinceramente

risposta

1

Mi piacerebbe anche utilizzare bwmorph

%# find the branch point 
branchImg = bwmorph(img,'branchpoints'); 

%# grow the pixel to 3x3 
branchImg = imdilate(branchImg,ones(3)); 

%# hide the branch point 
noBranchImg = img & ~branchImg; 

%# label the three lines 
lblImg = bwlabel(noBranchImg); 

%# in the original image, mask label #3 
%# note that it may not always be #3 that you want to mask 
finalImg = img; 
finalImg(lblImg==3) = 0; 

%# show the result 
imshow(finalImg) 
+0

hai detto che non può essere sempre 3 ... qual è la ragione di questo? per la mia comprensione è sempre una linea/contorno allargata di 1px, che si adatta a tale modello (di 3) ..? – mchlfchr

+0

@mchlfchr: nel passaggio 'bwlabel', le tre linee disconnesse vengono assegnate rispettivamente alle etichette 1,2 e 3. Potrebbe non essere sempre la parte con l'etichetta 3 che desideri rimuovere. – Jonas

+0

quindi non è possibile selezionare la linea "outter" per ogni caso? Come ho capito il modo "hbreak", separa tali strutture triple connesse? Nel prossimo passaggio avrei selezionato quell'etichetta esterna, ma quell'opzione 'hbreak' non funziona per quale motivo. – mchlfchr

2

Sembra vostra immagine in ingresso è un po 'diverso da quello che hai postato, dal momento che non ho potuto raccogliere direttamente i punti di diramazione (c'erano troppi di loro). Quindi, per iniziare a gestire il tuo problema, sto considerando un diradamento seguito dal rilevamento dei punti di diramazione. Inoltre li diluisco e rimuovo dall'immagine assottigliata, questo garantisce che in effetti non vi è alcuna connessione (4 o 8) tra i diversi segmenti nell'immagine iniziale.

f = im2bw(imread('http://i.imgur.com/yeFyF.png'), 0); 
g = bwmorph(f, 'thin', 'Inf'); 
h = g & ~bwmorph(bwmorph(g, 'branchpoints'), 'dilate'); 

Dal h detiene segmenti sconnessi, la seguente operazione raccoglie i punti finali di tutti i segmenti:

u = bwmorph(h, 'endpoints'); 

Ora per risolvere realmente il problema ho fatto qualche rapida analisi su ciò che si desidera eliminare. Considerare due segmenti distinti, a e b, in h. Diciamo a e b si sovrappongono se i punti finali di uno sono contenuti nell'altro. Con contenuto, voglio dire semplicemente se il punto x iniziale di uno è minore o uguale all'altro, e il punto x finale è maggiore o uguale. Nel tuo caso, la "montagna" si sovrappone al segmento che desideri rimuovere. Per determinare ognuno di essi che rimuovi, considera la loro area. Ma poiché questi sono segmenti, l'area è un termine privo di significato. Per gestirlo, ho collegato i punti finali di un segmento e usato come area semplicemente i punti interni. Come puoi notare chiaramente, l'area del segmento sovrapposto in fondo è molto piccola, quindi diciamo che è fondamentalmente una linea e scartarla mantenendo il segmento "montagna". Per fare questo passo l'immagine u è di fondamentale importanza, poiché con essa hai una chiara indicazione di dove iniziare e smettere di tracciare un contorno. Se hai utilizzato l'immagine h così com'è, avresti difficoltà a stabilire dove iniziare e interrompere la raccolta dei punti di un contorno (ad esempio, l'ordine raster ti darebbe un'indicazione di sovrapposizione errata).

Per ricostruire il segmento come singolo (attualmente ne hai tre), considera i punti che hai scartato da g in h e utilizza quelli che non appartengono al segmento inferiore ora rimosso.