Cela ne va pas être simple en effet ... Vous pouvez essayer de travailler entièrement avec une structure Graph. Extraire d'abord tous les pixels connectés de l'image et les insérer dans un graphique où les nœuds voisins sont connectés avec un bord. Vous pouvez supprimer les graphiques qui sont plus petits qu'un certain nombre de nœuds (pour exclure les petites taches qui ne sont pas pertinentes pour l'image).
À la fin de ce processus, vous aurez un ensemble de graphiques déconnectés. (A en juger par votre image, ce ne sont pas exactement des arbres car il y a des cycles là-dedans)
Vous pouvez trouver les points extrêmes de chaque graphique (les pixels extrêmes à la périphérie de chaque graphique) en partant d'un nœud aléatoire et en faisant un DFS .
À la fin de ce processus, vous aurez un ensemble de coordonnées de pixels pour chaque graphique correspondant aux points extrêmes où les connexions sont plus susceptibles de se former.
Vous pouvez maintenant essayer de connecter les voisins des points extrémaux les plus proches (avec une distance <= 5) simplement avec une ligne droite.
Mais, si vous voulez prendre en compte la pente du segment de ligne qui mène à ce pixel extrême, vous pouvez essayer d'ajuster une ligne à N pixels AVANT d'atteindre ce pixel extrême. Donc, si N = 5, les 5 derniers pixels d'une branche seraient utilisés pour estimer une ligne.
Par conséquent, pour chaque paire de voisins les plus proches, vous avez maintenant également une autre chose à utiliser comme critère pour juger si deux segments doivent être connectés (c.-à-d. Distance du point extrême <= 5 pixels ET pente de ligne approximativement égale).
Pour minimiser l'impact du bruit qui peut faire apparaître vos lignes dentelées près des pointes de la branche (et donc fausser votre estimation de la pente), vous pouvez essayer d'appliquer une étape de simplification à votre graphique (c'est un autre point (en plus du DFS ci-dessus) où il paie travailler avec une structure graphique). Vous pouvez par exemple supprimer les nœuds suivants du graphe qui feraient "plier" la ligne à des angles supérieurs à certains seuils (pour quelque chose de plus complexe, veuillez voir ici ). De cette façon, vous ajusterez des lignes "plus simples", à peu près dans la direction d'une plus grande partie du segment formé par les pixels de l'image.
Cela se traduira probablement par des connexions décentes pour la majorité des cas (à en juger par l'image que vous avez publiée), mais cela vous laissera encore des défis. Par exemple, comment un motif interrompu en forme de "Y" dans lequel l'une des branches est interrompue près du point de connexion serait-il connecté? (c'est-à-dire que vous avez un coude "continu" qui doit être connecté à un segment de ligne qui "se confond" avec lui). Vous pourriez peut-être revoir la fréquence de ces cas et réviser vos critères de connexion ultérieurement.
En outre, il serait peut-être intéressant d'examiner comment vous pourriez améliorer votre acquisition d'image (augmenter la résolution par exemple).