web-dev-qa-db-fra.com

Une bonne approche pour détecter des lignes dans une image?

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:

  1. Saisissez l'image de la webcam (et transformez-vous en niveaux de gris évidemment)
  2. Exécutez-le à travers un filtre de seuil (en utilisant le mode THRESH_TO_ZERO, où il met à zéro tous les pixels SOUS la valeur de seuil).
  3. brouiller l'image
  4. passer à travers un filtre d'érosion
  5. lancez-le à travers un détecteur Canny Edge
  6. enfin, prenez cette image traitée et recherchez les lignes à l'aide de la transformation probabiliste de Hough HoughLinesP

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: original image

Les résultats que j'obtiens: With canny with canny SANS astucieux (paramètres légèrement modifiés) no canny this time

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: it works!

23
Cashew

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.

12
JonesV

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.

5
Zaphod

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. 

4
Elod

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.

0
Exeko

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

0
Babak.Abad