Je recherche un algorithme pour élaguer des segments de ligne courts de la sortie d'un détecteur de bord. Comme on peut le voir dans l'image (et le lien) ci-dessous, il existe plusieurs petits bords détectés qui ne sont pas des "longues" lignes. Idéalement, j'aimerais que les 4 côtés du quadrilatère apparaissent après la transformation, mais s'il y a quelques lignes errantes, ce ne sera pas une grosse affaire ... Toute suggestion? P>
P>
lien image p>
7 Réponses :
Je doute que cela puisse être fait avec une simple opération locale. Regardez le rectangle que vous souhaitez conserver - il existe plusieurs lacunes, d'où effectuer une opération locale pour éliminer les segments de ligne courts réduirait probablement fortement la qualité de la sortie souhaitée. P>
En conséquence, j'essaierais de détecter le rectangle comme contenu important en fermant les lacunes, ajustant un polygone ou quelque chose comme ça, puis dans une seconde étape, jetez la teneur sans importance restante. Peut être le Hough Transform pourrait aider. P>
Je viens d'utiliser ce Exemple d'application à l'aide d'une transformation de noyau à Hough avec votre image d'échantillon et a obtenu quatre belles lignes monté sur votre rectangle. P>
+1 pour suggérer la transformation de Hough. Il suffit de trouver les quatre pics les plus puissants dans l'espace de transformation, et c'est votre quadrilatère.
Avant de trouver les bords pré-traiter l'image avec une opération J'ai cherché des exemples en ligne, et le meilleur que je puisse trouver était à la page 41 de
Regardez l'exemple d'image. Le contour de bord du rectangle n'est que 1 pixel mince! Si vous vous érodez en premier, vous perdrez complètement le rectangle ainsi que les petits bords. Si vous dilez en premier, vous pouvez fermer quelques lacunes dans votre grand rectangle, mais c'est un problème différent et ne vous aide pas vraiment à vous débarrasser des petits bords.
@Levy - Non, comme je l'ai clairement indiqué dans ma réponse, l'image doit être fermée avant de trouver les bords. Bien sûr, cela ne devrait pas être appliqué aux bords (mais aux objets à partir desquels les bords sont calculés).
@ Tom10 - Merci pour les conseils, je suis passé à une opération ouverte (remplaçant un filtre gaussien) et je reçois beaucoup de puissance de détection de contextes de contour de canny (la ferme fonctionnement entraîne également une meilleure performance). J'avais pensé utiliser l'érosion / dilatation, mais je pensais utiliser après la détection des bords, ce qui ne fonctionne pas avec des lignes minces.
La transformation de Hough peut être une opération très coûteuse. P>
Une alternative qui peut bien fonctionner dans Exécuter 2 opérations de morphologie mathématique appelée une image Fermer ( http://homepages.inf.ed.ac.uk/rbf/hipr2/close.htm ) avec une ligne horizontale et verticale (d'une longueur donnée déterminée à partir d'un élément de structuration) respectivement. Le point de ceci est de fermer toutes les lacunes dans le grand rectangle. P> Li>
analyse connectée Analyse du composant. Si vous avez effectivement effectué la morphologie, le grand rectangle sortira comme un composant connecté. Il ne reste alors qu'à travers tous les composants connectés et choisissant le candidat le plus probable qui devrait être le grand rectangle. P> li>
ol>
C'est comme ça que je le ferais. Si l'objectif est de trouver l'emplacement du grand rectangle, sélectionnez le composant le plus important. Si l'objectif est juste d'éliminer les bords courts (le bruit), supprimez tous les composants suffisamment petits, ou tout sauf le plus grand.
peut-être trouver les composants connectés, puis éliminer les composants avec moins de x pixels (déterminé de manière empirique), suivi d'une dilatation le long des lignes horizontales / verticales pour reconduir les lacunes dans le rectangle p>
Il est possible de suivre deux techniques principales: p>
Opération basée sur les vecteurs: cartographique vos îles de pixels en grappes (blob, zones voronoi, peu importe). Appliquez ensuite certaines heuristiques pour corriger les segments, tels que l'algorithme d'approximation de la chaîne de Teh-Chin, et faites votre taille sur des éléments vectoriels (début, point final, longueur, orientation, etc.). P> li>
FONCTIONNEMENT basé sur le jeu: Cluster Vos données (comme ci-dessus). Pour chaque cluster, calculez les composants principaux et détectez des lignes de cercles ou d'une autre forme en recherchant uniquement des clusters montrant seulement 1 ressortissant significatif VIGENVALUE (ou 2 si vous recherchez des segments «gras», cela pourrait ressembler à des ellipses). Vérifiez les vecteurs propres associés à des valeurs propres pour avoir des informations sur l'orientation des blobs et faire votre choix. P> li> ol>
Les deux manières pourraient être facilement explorées avec OpenCV (l'ancienne, en effet, dans la catégorie "Analyse de contour" d'algos). P>
Si quelqu'un marche sur ce thread sur ce thread, OpenCV 2.x apporte un exemple nommé Squares.Cpp strong> qui claque essentiellement cette tâche. J'ai faussé une légère modification à l'application pour améliorer la détection pour améliorer la détection. du quadrangle em> p> code fort>: p>
p >
Voici une simple solution de filtrage morphologique suivant les lignes de @ Tom10:
solution dans matlab: p> L'idée est de connecter essentiellement les contours horizontaux à faire un grand composant et filtrer par un filtre d'ouverture de zone ultérieurement pour obtenir le rectangle. p> Résultats: > p>
p> p> p>
Ne cherchez-vous que des rectangles?