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