Bordi di collegamento rilevati da un rilevatore di bordi


14

Ho un'immagine binaria ottenuta da un rilevatore di bordi astuti. I bordi non sono ben rilevati al centro e devo unirmi a loro. La connessione dei bordi dipende dall'orientamento e dal vicinato. Devo collegare i vertici se sono al di sotto di una soglia (diciamo a meno di 5 pixel di distanza). Se le mie caratteristiche quasi lineari sono ben orientate, questa soglia dovrebbe essere rilassata. (Questo è il caso migliore.) Immagine

Ho provato la trasformazione di Hough, ma non ha funzionato per me perché non ho linee rette. Anche dilatazione ed erosione non sono buone; rendono le immagini più disordinate.

L'approccio che sto provando è prima di rilevare vertici e nodi (in MATLAB con bwmorph) e quindi fare le foglie come una funzione separata. Questo viene fatto come segue:

  1. Scansionando in una finestra 3x3, cerca i vicini.
  2. Attraversa l'intero oggetto connesso.
  3. Prova ad adattare una linea (o forse un polinomio quadratico).
  4. Controlla funzionalità per funzionalità se vale la pena connettersi o meno.

L'implementazione non è semplice poiché la parte decisionale in cui i vertici devono essere collegati è difficile.


Ho trovato una soluzione interessante per trovare i rami. MATLAB può prontamente assegnare alla posizione i nodi. MATLAB può anche etichettare le funzionalità connesse. Quindi puoi scegliere una funzione connessa. Trova nodi. Impostare questi nodi su 0. Scollegare fondamentalmente il carattere ed etichettarli nuovamente. Avrai rami tra gli alberi. Ciò ha richiesto meno programmazione manuale e i risultati sembrano soddisfacenti. Qualche input?
Naresh,

Per quanto riguarda la connessione, ora sto pensando di trovare funzionalità di grandi dimensioni e considerarle più affidabili. Quindi se sono linee rette, (controlla la qualità della forma fisica), convertilo in coordinate polari e cerca il quartiere come la trasformazione hough. Per funzionalità di grandi dimensioni, il raggio di ricerca è grande (proporzionale alla dimensione). Sto implementando questo codice. Risultati in arrivo. Commenti per favore.
Naresh,

Risposte:


4

Questa potrebbe non essere una soluzione completa, ma ti darà una buona direzione.

Fondamentalmente, quali sono i criteri chiave per dire che i bordi corrispondono? Che "localmente" il gradiente del bordo corrisponda e in una certa misura le distanze sono ragionevoli rispetto al tempo in cui il bordo è continuo.

Se hai bordi geometrici, come lunghe linee rette, Hough farà subito un lavoro senza soluzione di continuità. Ma questo non funziona quando i bordi sono curve arbitrarie. In questo caso, puoi ancora pensare alla curva come a segmenti costanti approssimativamente saggi (abbastanza buono nel tuo caso), quindi, dovresti prendere Hough localmente. cioè puoi prendere una piccola porzione di immagine (diciamo un blocco) calcolare Hough e identificare alcuni picchi. Sulla base di questo, è possibile identificare che il de-houghing sta creando gap significativi, in tal caso, mantenerlo o andare avanti.

Una volta riempiti gli spazi più piccoli, è possibile estendere lo stesso per occupare una dimensione maggiore. i picchi saranno più, ma puoi selezionarne meno.


grazie Dipan, ci ho pensato anche io. Sarà un'operazione costosa ma posso estrarre alcune informazioni. Ma a volte anche la trasfomazione di Hoguh non mi dà linee collegate. Hough si occupa solo di linee rette perfette. E non si preoccupa della connettività dei pixel. Adatta solo una linea a 3 o più pixel casuali su una linea retta. Sto codificando la mia ipotesi. Pubblicherò i risultati qui per ulteriori discussioni. Naresh
Naresh,

θ

4

Non sarà davvero semplice ... Potresti provare a lavorare interamente con una struttura Graph. Estrarre innanzitutto tutti i pixel collegati dall'immagine e inserirli in un grafico in cui i nodi vicini sono collegati con un bordo. È possibile scartare Grafici più piccoli di un numero M di nodi (per escludere piccoli punti non rilevanti per l'immagine).

Alla fine di questo processo avrai una serie di grafici disconnessi. (A giudicare dalla tua immagine, questi non sono esattamente Alberi perché ci sono cicli lì dentro)

Puoi trovare i punti estremi di ciascun Grafico (i pixel estremi nella periferia di ciascun Grafico) partendo da un nodo casuale e facendo un DFS .

Alla fine di questo processo avrai un set di coordinate pixel per ogni grafico corrispondente ai punti estremi in cui è più probabile che si formino connessioni.

Ora puoi provare a collegare i vicini di punti estremi più vicini (con una distanza <= 5) semplicemente con una linea retta.

Ma, se vuoi prendere in considerazione la pendenza del segmento di linea che porta a quel pixel estremo, potresti provare a "adattare una linea" a N pixel PRIMA di raggiungere quel pixel estremo. Quindi se N = 5, allora gli ultimi 5 pixel di un ramo verrebbero usati per stimare una linea.

Pertanto, per ciascuna coppia vicina più vicina ora hai anche un'altra cosa da usare come criterio per giudicare se due segmenti debbano essere collegati (cioè Distanza punto estremo <= 5 pixel E pendenza della linea approssimativamente uguale).

Per ridurre al minimo l'impatto del rumore che può far apparire le tue linee frastagliate vicino alle punte del ramo (e quindi distorcere la stima della pendenza) puoi provare ad applicare un passaggio di semplificazione al tuo Grafico (questo è un altro punto (oltre al DFS sopra) dove paga lavorare con una struttura grafica). Ad esempio, è possibile rimuovere i nodi successivi del grafico che farebbero "piegare" la linea ad angoli maggiori di alcuni punti di interruzione (per qualcosa di più complesso, vedere qui ). In questo modo si adatteranno linee "più semplici", approssimativamente alla direzione di una parte più grande del segmento formato dai pixel dell'immagine.

Ciò comporterà probabilmente connessioni decenti per la maggior parte dei casi (a giudicare dall'immagine che hai pubblicato) ma ti lascerebbe comunque con alcuni difficili. Ad esempio, come potrebbe essere collegato un modello interrotto a forma di "Y" in cui uno dei rami viene interrotto vicino al punto di connessione? (ovvero, hai una curva "continua" che deve essere connessa con un segmento di linea che "si fonde" con essa). Forse potresti rivedere quanto sono comuni questi casi e rivedere i tuoi criteri di connessione in un secondo momento.

Inoltre, forse varrebbe la pena esaminare come migliorare l'acquisizione delle immagini (ad esempio aumentare la risoluzione).


Grazie per una buona risposta Sì, la tua osservazione è giusta. Non è un albero, quindi è meglio fare un grafico. Questo mi aiuterà a trovare anche i cicli. Il fatto è che MATLAB ha implementato il grafico nella cassetta degli attrezzi di bioinfo, che non posso supporre che la maggior parte delle persone avrà. La maggior parte che posso fare è la cassetta degli attrezzi per l'elaborazione delle immagini. Douglas-peucker è anche qualcosa che ho considerato. Ma dopo aver consultato un esperto GIS, mi sono reso conto che potrebbe rendere le cose più complesse e potrei ottenere linee intersecanti. Inoltre, devo guardare anche diversi segmenti di linee in un grafico, poiché ho bisogno di 10 pixel per creare una linea e potrei già avere una biforcazione.
Naresh,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.