Isso não será realmente claro ... Você pode tentar trabalhar inteiramente com uma estrutura Graph. Primeiro, extraia todos os pixels conectados da imagem e insira-os em um gráfico em que os nós vizinhos estejam conectados com uma aresta. Você pode descartar gráficos menores que alguns números M de nós (para excluir pequenos pontos que não são relevantes para a imagem).
No final deste processo, você terá um conjunto de gráficos desconectados. (A julgar pela sua imagem, estas não são exatamente árvores, porque existem ciclos lá)
Você pode encontrar os pontos extremais de cada gráfico (os pixels extremais na periferia de cada gráfico) iniciando em algum nó aleatório e executando um DFS .
No final deste processo, você terá um conjunto de coordenadas de pixel para cada gráfico, correspondendo aos pontos extremais em que as conexões têm maior probabilidade de se formar.
Agora você pode tentar conectar os vizinhos do ponto externo mais próximos (com uma distância <= 5) simplesmente com uma linha reta.
Mas, se você quiser levar em consideração a inclinação do segmento de linha que leva ao pixel externo, tente "ajustar uma linha" a N pixels ANTES de atingir esse pixel externo. Portanto, se N = 5, os últimos 5 pixels de um ramo seriam usados na estimativa de uma linha.
Portanto, para cada par vizinho mais próximo, você também tem outra coisa a ser usada como critério para julgar se dois segmentos devem ser conectados (por exemplo, distância do ponto extremo externo <= 5 pixels E inclinação aproximadamente igual à linha).
Para minimizar o impacto do ruído que pode fazer com que suas linhas pareçam serrilhadas perto das dicas do ramo (e, portanto, distorça sua estimativa de inclinação), tente aplicar uma etapa de simplificação ao seu gráfico (este é outro ponto (além do DFS acima) em que vale a pena trabalhar com uma estrutura de gráfico). Você pode, por exemplo, remover os nós subsequentes do gráfico que tornariam a linha "dobrada" em ângulos maiores que alguns pontos de corte (para algo mais complexo, consulte aqui ). Dessa maneira, você ajustará linhas "mais simples", aproximadamente na direção de uma parte maior do segmento formado pelos pixels da imagem.
Provavelmente, isso resultará em conexões decentes para a maioria dos casos (a julgar pela imagem que você postou), mas ainda assim você deixará algumas com problemas. Por exemplo, como um padrão interrompido em forma de "Y", onde um dos ramos é interrompido perto do ponto de conexão, é conectado? (ou seja, você tem uma dobra "contínua" que deve ser conectada a um segmento de linha que "combina" com ela). Talvez você possa revisar como esses casos são comuns e revisar seus critérios de conexão posteriormente.
Além disso, talvez valha a pena examinar como você pode melhorar sua aquisição de imagens (aumente a resolução, por exemplo).