Connecter les bords détectés par un détecteur de bord

14

J'ai une image binaire obtenue à partir d'un détecteur de bord rusé. Les bords ne sont pas bien détectés au centre et je dois les rejoindre. La connexion des bords dépend de l'orientation et du voisinage. J'ai besoin de connecter les sommets s'ils sont inférieurs à un seuil (disons à moins de 5 pixels de distance). Si mes caractéristiques presque linéaires sont bien orientées, ce seuil devrait être assoupli. (C'est le meilleur des cas.) image

J'ai essayé la transformation de Hough, mais cela n'a pas fonctionné pour moi car je n'ai pas de lignes droites. La dilatation et l'érosion ne sont pas bonnes non plus; ils rendent les images plus désordonnées.

L'approche que j'essaie est de détecter d'abord les sommets et les nœuds (dans MATLAB avec bwmorph), puis de créer des feuilles comme entité distincte. Cela se fait comme suit:

  1. Numérisation dans une fenêtre 3x3, recherchez des voisins.
  2. Parcourez l'objet connecté complet.
  3. Essayez d'ajuster une ligne (ou peut-être un polynôme quadratique).
  4. Vérifiez fonctionnalité par fonctionnalité si elle vaut ou non une connexion.

L'implémentation n'est pas simple car la partie décisionnelle où les sommets doivent être connectés est délicate.

Naresh
la source
J'ai trouvé une solution intéressante pour trouver les succursales. MATLAB peut facilement donner l'emplacement des nœuds. MATLAB peut également étiqueter les fonctions connectées. Vous pouvez donc choisir une fonction connectée. Trouvez des nœuds. Réglez ces nœuds sur 0. Déconnectez fondamentalement la fonction et étiquetez-la à nouveau. Vous aurez des branches dans les arbres. Cela a nécessité moins de programmation manuelle et les résultats semblent bons. Une entrée?
Naresh
Pour la partie connexion, je pense maintenant à trouver de grandes fonctionnalités et à les considérer comme plus fiables. Ensuite, si ce sont des lignes droites (vérifiez la qualité de la forme physique), convertissez-les en coordonnées polaires et recherchez le voisinage comme une transformation de Hough. Pour les grandes entités, le rayon de recherche est grand (proportionnel à la taille). J'implémente ce code. Résultats en route. Commentaires pls.
Naresh

Réponses:

4

Ce n'est peut-être pas une solution complète, mais cela vous donnera une bonne direction.

Fondamentalement, quels sont les critères clés pour dire que les bords correspondent? Le fait que "localement" le gradient du bord corresponde et dans une certaine mesure les distances sont raisonnables par rapport à la durée pendant laquelle le bord est continu.

Si vous avez des bords géométriques, comme de longues lignes droites, Hough fera immédiatement un travail très transparent. Mais cela ne fonctionne pas lorsque les bords sont des courbes arbitraires. Dans ce cas, vous pouvez toujours considérer la courbe comme des segments constants approximativement par morceaux (assez bien dans votre cas), par conséquent, vous devez prendre Hough localement. c'est-à-dire que vous pouvez prendre une petite partie de l'image (disons un bloc) calculer le Hough et identifier certains pics. Sur cette base, vous pouvez identifier que le dénudage crée un écart significatif, si c'est le cas, conservez-le ou continuez.

Une fois les petits espaces comblés, vous pouvez les étendre pour prendre une taille plus grande. les pics seront plus, mais vous pouvez en sélectionner moins.

Dipan Mehta
la source
merci Dipan, j'y ai pensé aussi. Ce sera une opération coûteuse mais je peux extraire quelques informations. Mais parfois, la transfomation Hoguh ne me donne pas non plus de lignes connectées. Hough ne s'occupe que de lignes droites parfaites. Et ne se soucie pas de la connectivité des pixels. Il ajuste simplement une ligne à 3 pixels aléatoires ou plus sur une ligne droite. Je code mon hypothèse. Je publierai les résultats ici pour une discussion plus approfondie. Naresh
Naresh
θ
4

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

A_A
la source
Merci pour une bonne réponse. Oui, votre observation est juste. Ce n'est pas un arbre, donc il vaut mieux faire un graphique. Cela m'aidera également à trouver des cycles. Le truc, c'est que MATLAB a mis en place un graphique dans la boîte à outils bioinfo, que je ne peux pas supposer que la plupart des gens auront. Tout ce que je peux faire, c'est une boîte à outils de traitement d'image. Douglas-peucker est aussi quelque chose que j'ai considéré. Mais après avoir consulté un expert SIG, j'ai réalisé que cela pourrait rendre les choses plus complexes et que je pourrais obtenir des lignes qui se croisent. De plus, je dois également regarder différents segments de lignes dans un graphique, car j'ai besoin de 10 pixels pour faire une ligne, et j'ai peut-être déjà une bifurcation.
Naresh