J'ai écrit un code qui utilise les bibliothèques OpenCV pour détecter les lignes blanches peintes sur l'herbe. J'ai besoin de l'opinion de quelqu'un sur l'approche que j'ai utilisée (car je suis sûr qu'il existe un meilleur moyen que le mien). De plus, les résultats que je reçois ne sont pas aussi bons que prévu, car de légères variations dans l'image nécessitent de peaufiner les paramètres (et je dois agir sur des paramètres fixes).
Mon approche jusqu'ici:
Devrais-je changer la séquence des filtres?
P.S. Je ne suis pas trop préoccupé par la puissance de traitement; J'exécute HoughLinesP sur le GPU B-)
Aussi, voici un exemple d’image:
Les résultats que j'obtiens: With canny SANS astucieux (paramètres légèrement modifiés)
Toute aide ou conseils seraient appréciés! Je n'ai aucune idée de ce qu'il faut faire pour l'améliorer!
UPDATE Après avoir utilisé une implémentation vraiment rapide (avec des TONNES de flou) conformément à la réponse choisie, j’ai eu ceci:
J'essaierais d'utiliser une représentation du squelette de l'image. Le problème avec votre astuce, ici, est qu’il en résulte essentiellement deux lignes en raison de la largeur de la ligne.
Ensuite, j'appliquerais la transformation de Hough dessus.
Une solution possible consiste à prendre tous les points Edge que vous obtenez de la détection astucieuse de Edge et à ajuster une ligne à l'aide de la moindre carré linéaire (peut-être itérative) sur ces points. De cette façon, vous obtenez toujours une seule ligne qui "correspond le mieux" aux points Edge. Il n’existe pratiquement aucun paramétrage associé à cette méthode.
J'utilisais Canny pour les images d'intérieur, mais pour les images d'extérieur, je trouve le filtre de Laplace et le filtre de Sobel plus approprié que d'appliquer Probabilistic Hough line Transform (PHT).
Si vous voulez épaissir vos lignes, essayez l’opérateur Sobel après Laplace et enfin le PHT. Si votre image est trop curieuse, cela pourrait empirer.
Après votre dernier résultat (après le filtre squelette), vous obtenez de nombreux petits segments. Je pense qu'à ce stade, vous êtes vraiment bien placé pour mettre en œuvre ce qui a été fait dans cet article:
http://www.cs.ubc.ca/~lowe/papers/aij87.pdf
Fondamentalement, ils fournissent des outils permettant de regrouper différentes caractéristiques dans une image en fonction de leur probabilité d'appartenir à un même objet. Il vous suffit donc d'alimenter vos résultats avec l'algorithme et vous obtiendrez probablement une seule ligne.
L'algorithme RANSAC
peut être une bonne méthode. Cette méthode est similaire aux approches regression
ou interpolation
. Vous devriez extraire des points après avoir utilisé un Edge detection
(la meilleure méthode est canny
pour cet objectif, comme je le pense). Ensuite, vous devriez trouver la meilleure ligne. Pour trouver la ligne passant par plusieurs points, il existe différentes méthodes telles que la régression linéaire ou RANSAC. Vous pouvez trouver une implémentation et des notes sur l'algorithme RANSAC
dans ce lien .
Notez que RANSAC et d'autres algorithmes utiles pour cet objectif sont already implemented
dans OpenCV
(comme je le sais dans la version 3.2) et dans Accord NET
(une bibliothèque libre pour le traitement d'images).