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.
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
@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
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