J'ai besoin de trouver tous les contours dans une image récupérée de la caméra. Donc, j'utilise d'abord le détecteur de bord rusé pour trouver les bords, puis trouver les contours. Assez simple.
Cependant, mes contours sont «fusionnés». Par exemple, dans l'image ci-dessous, j'ai clairement 4 objets différents. Les bords se touchent légèrement à certains points, donc j'obtiens un gros contour au lieu de quatre séparés. J'ai essayé de changer autour des seuils, de l'érosion, des opérations de morphologie et des choses similaires, mais les bords restent légèrement en contact. Quelqu'un a-t-il des suggestions sur la façon d'obtenir des contours séparés dans des images similaires à celle ci-dessous? (L'image ci-dessous n'est évidemment qu'un exemple, mes images réelles sont beaucoup plus complexes, mais ont le même problème de base).
la source
Réponses:
Détection de différents composants:
Si vous essayez de détecter les différents composants, il existe probablement d'autres approches pour les faire que la détection des contours. Voici un exemple dans Mathematica. Une érosion suivie d'une dilatation est utilisée pour combler l'écart dans le deuxième composant avant la détection (si vous ne le faites pas, il ne le détectera pas).
La figure de gauche ci-dessous montre une détection d'objet imparfaite (sans combler l'écart) et à droite, la détection correcte (en exécutant le code ci-dessus).
Détection des différents contours:
Cependant, si vous souhaitez en effet ne séparer que les contours, voici un exemple. L'érosion et la dilatation sont effectuées comme précédemment pour combler l'écart et l'image résultante est passée à travers un détecteur de bord Canny. J'ai explicité les options par défaut, afin que vous puissiez voir ce qui est utilisé.
Cela vous donnera à la fois le bord intérieur et extérieur (voir la figure à gauche ci-dessous), car la largeur de pixel est supérieure à 1 tout autour. Je n'ai pas eu beaucoup de chance pour essayer de l'amincir, car les performances se dégradent (peuvent être différentes pour vos autres images). Les contours intérieurs sont ceux que vous voulez, et le contour extérieur n'est que le contour combiné des 4 composants. Maintenant, tout ce que nous devons faire est de laisser tomber le plus extérieur avec:
ce qui vous donne juste les contours intérieurs (voir en bas à droite). En d'autres termes, il ne sélectionne que les contours qui sont entourés par au moins un autre contour, ce qui disqualifie automatiquement le plus externe. Je ne connais pas l'équivalent de ces commandes / opérations dans openCV.
Notez que les ruptures apparentes dans la figure sont dues à l'enregistrement en jpeg dans une taille plus petite. Cela ne ressemble pas à ça sur mon écran.
la source
Essayez de prétraiter vos images avec un filtre morphologique comme l' érosion . Cela permettra de séparer les contours touchants. Après avoir détecté vos contours, vous pouvez appliquer une opération de dilatation pour compléter les réseaux.
la source
Ce n'est pas une réponse à votre question, mais l'analyse des contours est sujette aux erreurs. Vous ne pouvez pas y faire grand-chose et cela ne fonctionne que sur des scénarios très simples.
Si vous avez du mal à l'utiliser, vous devez rechercher un algorithme complètement différent. Il existe des moyens plus complexes et plus robustes de résoudre les choses, mais cela dépend de ce que vous voulez réaliser (détection d'objet, suivi, etc ...)
la source
Les contours ne sont pas nécessairement ouverts, sachez que vous les avez utilisés pour les détecter. Les problèmes avec Canny étaient déjà discutés ici . La discussion sur canny vous donne l'idée de base qu'il y a encore des opérations comme la fermeture et la dilatation qui sont nécessaires en plus de canny pour évaluer les contours fermés.
Cela dépend aussi si nous recherchons des contours ou des segmentations (Canny contre des méthodes comme Graphcuts ). Je suppose donc que la recherche d'une solution robuste dépend de votre application finale.
la source