De hecho, eso no será sencillo ... Podrías intentar trabajar completamente con una estructura Graph. Primero extraiga todos los píxeles conectados de la imagen e insértelos en un Gráfico donde los nodos vecinos estén conectados con un borde. Puede descartar Gráficos que son más pequeños que un número M de nodos (para excluir pequeños puntos que no son relevantes para la imagen).
Al final de este proceso, tendrá un conjunto de gráficos desconectados. (A juzgar por su imagen, estos no son exactamente árboles porque hay ciclos allí)
Puede encontrar los puntos extremos de cada gráfico (los píxeles extremos en la periferia de cada gráfico) comenzando desde un nodo aleatorio y haciendo un DFS .
Al final de este proceso, tendrá un conjunto de coordenadas de píxeles para cada Gráfico correspondiente a los puntos extremos donde es más probable que se formen conexiones.
Ahora puede intentar conectar los vecinos extremos más cercanos (con una distancia <= 5) simplemente con una línea recta.
Pero, si desea tener en cuenta la pendiente del segmento de línea que conduce a ese píxel extremo, puede intentar "ajustar una línea" a N píxeles ANTES de alcanzar ese píxel extremo. Entonces, si N = 5, los últimos 5 píxeles de una rama se usarían para estimar una línea.
Por lo tanto, para cada par de vecinos más cercanos ahora también tiene otra cosa que usar como criterio para juzgar si se deben conectar dos segmentos (es decir, Distancia de punto extremo <= 5 píxeles Y pendiente de línea aproximadamente igual).
Para minimizar el impacto del ruido que puede hacer que sus líneas aparezcan irregulares cerca de las puntas de las ramas (y, por lo tanto, distorsionar su estimación de pendiente), puede intentar aplicar un paso de simplificación a su Gráfico (este es otro punto (además del DFS anterior) en el que vale la pena trabajar con una estructura gráfica). Podría, por ejemplo, eliminar los nodos posteriores del Gráfico que harían que la línea se "doblara" en ángulos mayores que algunos límites (para algo más complejo, consulte aquí ). De esta manera, ajustará líneas "más simples", aproximadamente en la dirección de una parte más grande del segmento formado por los píxeles de la imagen.
Eso probablemente dará como resultado conexiones decentes para la mayoría de los casos (a juzgar por la imagen que ha publicado), pero aún lo dejaría con algunos desafiantes. Por ejemplo, ¿cómo se conectaría un patrón interrumpido en forma de "Y" en el que una de las ramas se interrumpe cerca del punto de conexión? (es decir, tiene un doblez "continuo" que debe estar conectado con un segmento de línea que se "combina" con él). Quizás podría revisar qué tan comunes son estos casos y revisar sus criterios de conexión más adelante.
Además, quizás valga la pena examinar cómo podría mejorar la adquisición de su imagen (por ejemplo, aumentar la resolución).