Détecter les noeuds de grille en utilisant OpenCV (ou en utilisant autre chose))
j'ai une grille sur les photos (elles viennent de la caméra). Après la binarisation ils ressemblent à ceci (rouge est 255, Bleu est 0):
Quelle est la meilleure façon de détecter les noeuds de grille (croix) sur ces images? Note: la grille est déformée d'une cellule à l'autre de façon non uniforme.
mise à Jour:
Quelques exemples de grilles différentes et de leurs distorsions avant la binarisation:
3 réponses
dans de tels cas, j'essaie d'abord de trouver le meilleur point de départ. Ainsi, d'abord j'ai battu votre image (cependant je pourrais aussi le squelettiser et juste alors le seuil. Mais de cette façon, certaines données sont perdues définitivement):
puis, j'ai essayé des tas d'outils pour obtenir les caractéristiques les plus importantes accentuées en vrac. Enfin, en jouant avec gimp's g'KMIC plugin j'ai trouvé ceci:
sur la base de ce qui précède j'ai préparé un universel modèle qui ressemble à ceci:
Alors je viens de recevoir une partie de cette image:
pour aider à déterminer l'angle j'ai fait Local Fourier freq graphe - de cette façon, vous pouvez obtenir votre modèle angle local:
alors vous pouvez faire une épaisseur simple qui fonctionne rapidement sur les GPUs modernes-obtenir la différence comme ceci (manqué cas):
quand on frappe la différence est minime; ce que j'avais à l'esprit en parlant de maximums locaux se réfère plus ou moins à la façon dont la différence résultante devrait être traitée. Il ne serait pas sage de pondérer à l'extérieur de la différence de cercle de motif la même chose qu'à l'intérieur en raison de la sensibilité du facteur d'échelle. Ainsi, à l'intérieur avec cross devrait être pondéré plus dans l'algorithme utilisé. Néanmoins le motif différencié avec l'image ressemble à ceci:
comme vous pouvez le voir, il est possible de faire la différence entre un hit et un miss. Ce qui est crucial est de définir la tolérance appropriée et d'utiliser les fréquences de Fourier pour obtenir l'angle (avec des images battues Fourier suit généralement l'orientation globale de l'image analysée). La méthode ci-dessus peut être complétée plus tard par la détection Harris, ou la détection Harris peut être modifiée en utilisant les modèles ci-dessus pour distinguer deux ou quatre coins étroitement placés. Malheureusement, tous les les techniques sont dépendantes de l'échelle dans un tel cas et doivent être ajustées correctement. Il y a aussi d'autres approches à votre problème, par exemple en watershedding d'abord, puis en obtenant des régions, puis en ignorant avant-plan, puis en simplifiant des courbes, puis en vérifiant si leurs coins forment un motif équidistant consécutif. Mais à mon nez, cela ne produirait pas de bons résultats.
une autre chose - libgmic est la bibliothèque G'KMIC d'où vous pouvez utiliser directement ou par le biais de reliures les transformations indiquées ci-dessus. Ou obtenez des algorithmes et réécrivez-les dans votre application.
je suppose que cela peut être une réponse potentielle (en fait mentionnée dans les commentaires): http://opencv.itseez.com/2.4/modules/imgproc/doc/feature_detection.html?highlight=hough#houghlinesp
il peut aussi y avoir d'autres façons d'utiliser les outils de criblage pour la détection des caractéristiques.
mais en fait je pense qu'au lieu D'une transformation qui pourrait contribuer à d'énormes gonflements et à un manque de précision (lignes droites), je suggérerais D'essayer la détection Harris corner - http://docs.opencv.org/2.4/doc/tutorials/features2d/trackingmotion/harris_detector/harris_detector.html .
cela peut être encore ajusté (coins croisés, donc le maximum local devrait dépendre de la distribution de crossy') à votre problème spécifique. Alors quelques approximations de courbes peuvent être faites sur la base des points obtenus.
Peut-être que vous cloud calculer Hough Lines et déterminer les intersections. Une documentation OpenCV peut être trouvée ici