Traitement d'image: comment détecter une enseigne quadrialterale en image?

14

Comment puis-je détecter un panneau quadrilatère à partir d'une image capturée à l'aide d'un téléphone mobile? Comment détecter des formes comme un rectangle? rectangle arrondi (coins arrondis au lieu de coins de forme)?

J'utilise opencv.wrapper mais je suis nouveau dans ce domaine.

Merci.

Voici l'exemple: texte alternatif http://www.freeimagehosting.net/uploads/b03442fd36.png

texte alternatif http://www.freeimagehosting.net/uploads/e6b36040e8.png

En raison du bruit et de nombreuses lignes, je ne suis pas en mesure de déterminer quelle est la ligne frontière de l'enseigne. Parfois, je peux trouver la frontière des lignes après la transformation de Hough. Je suis pris au piège .... dans ce genre de scénario ...

Ce sont les 2 photos brutes prises à partir d'un appareil photo de téléphone portable

texte alternatif http://www.freeimagehosting.net/uploads/6dbd613edf.jpg texte alternatif http://www.freeimagehosting.net/uploads/720da20080.jpg

J'ai besoin de conseils pour voir comment je peux traiter l'image pour sortir l'enseigne?

Merci beaucoup


la source
2
Mots-clés: opencv, hough transform Duplicates: stackoverflow.com/questions/1817442 stackoverflow.com/questions/2068013
Ouais, mais transformez FTW!
mais il y a du bruit dans l'image, comment puis-je savoir quelle est la limite de l'enseigne
@ xabi123: transformation de hough, seuil, limite de
1
Pourriez-vous partager un exemple d'image?

Réponses:

7

Vos deux images contiennent de nombreuses lignes qui n'ont rien à voir avec le signe que vous recherchez. Et certaines de ces lignes sont plus longues / ont un contraste plus élevé que les lignes que vous voulez réellement, donc je pense que la détection des lignes de bord (par exemple en utilisant une transformation de Hough ou en additionnant les contrastes horizontalement / verticalement) ne fonctionnera pas.

Mais: l'enseigne que vous recherchez présente d'autres caractéristiques qui devraient être plus faciles à détecter:

  • Le fond du panneau a une luminosité (presque) constante
  • Il occupe une zone relativement grande de l'image
  • C'est près du centre de l'image

Vous recherchez donc une grande zone connectée à faible contraste. J'ai piraté un algorithme de validation de principe dans Mathematica. (Je ne suis pas un expert OpenCV, mais je mentionnerai la fonction OpenCV respective quand je les connais.)

Tout d'abord, j'utilise des filtres dérivés gaussiens pour détecter l'amplitude du gradient à chaque pixel. Le filtre dérivé gaussien a une grande ouverture (11x11 pixels dans ce cas), il est donc très insensible au bruit. Je normalise ensuite l'image du gradient pour signifier = 1, donc je peux utiliser les mêmes seuils pour les deux échantillons.

src = Import["http://www.freeimagehosting.net/uploads/720da20080.jpg"];
pixels = ImageData[ColorConvert[src, "Grayscale"]];
gradient = Sqrt[GaussianFilter[pixels, 5, {1, 0}]^2 + GaussianFilter[pixels, 5, {0, 1}]^2];
gradient = gradient/Mean[Flatten[gradient]];

Implémentation OpenCV: Vous pouvez utiliser sepFilter2Dpour le filtrage réel, mais apparemment, vous devrez calculer vous-même les valeurs du noyau du filtre .

Le résultat ressemble à ceci:

amplitude du gradient

Sur cette image, l'arrière-plan du panneau est sombre et les bordures du panneau sont lumineuses. Je peux donc binariser cette image et rechercher des composants connectés sombres.

binaryBorders = Binarize[Image[gradient], 0.2];
sign = DeleteBorderComponents@ColorNegate[binaryBorders];
largestComponent = SortBy[ComponentMeasurements[sign, {"Area", "ConvexVertices"}][[All, 2]], First][[-1, 2]];

Implémentation d'OpenCV: le seuillage devrait être simple, mais je pense qu'OpenCV ne contient pas d'analyse de composants connectés - vous pouvez utiliser soit le remplissage d'inondation ou cvBlobsLib pour cela.

Maintenant, il suffit de trouver le plus gros blob près du centre de l'image et de trouver la coque convexe (j'ai simplement utilisé le plus gros blob qui n'est pas connecté à l'arrière-plan, mais cela pourrait ne pas être suffisant pour chaque image).

Résultats: entrez la description de l'image ici entrez la description de l'image ici

Niki Estner
la source
0

Une autre approche que vous pouvez adopter qui est plus robuste aux bruits dans cette situation consiste à générer une courbe du niveau de gris moyen de l'image le long de l'axe x et le long de l'axe y. Autrement dit, calculez le niveau de gris moyen pour chaque ligne / colonne de l'image.

Si, par exemple, l'enseigne (ou ses bordures) est plus claire que son environnement (ce qui est le cas pour tous les exemples montrés dans la question), vous aurez deux pics dans votre courbe d'axe x (pour la gauche et la droite et les bordures ) et deux pics dans votre courbe de l'axe y (pour les bordures supérieure et inférieure). En utilisant une technique de détection de bordure pour un signal à 1 dimension (peut-être un filtre passe-haut), vous pouvez déduire les coordonnées des coins de l'enseigne.

J'ai vu cette approche utilisée pour détecter les plaques d'immatriculation et également pour la reconnaissance faciale (le nez a tendance à être la partie la plus brillante du visage, donc il génère un pic dans les courbes des axes x et y).

Alceu Costa
la source
hmm .. que se passe-t-il si l'enseigne est tournée ou la caméra est roulée?
Mustafa
0

Cela pourrait être une petite idée à l'envers, mais cela pourrait valoir la peine d'être essayé. Au lieu d'essayer de détecter le rectange et de penser le texte comme du bruit , vous pouvez peut-être traiter le texte comme une information et l'utiliser pour détecter le rectange plus facilement.

Voici les grandes lignes de l'idée:

  • détecter le texte dans l'image . Il n'a pas besoin d'être une implémentation robuste (vous devriez être en mesure de google une petite bibliothèque qui le fait, ou peut-être OpenCV l'a), juste une estimation approximative du texte dans l'image
  • trouver le cener de toutes les détections de texte . Même avec des images bruyantes, cela devrait être autour du lieu réel
  • faire la décomposition rectangle Hough sur la zone autour des détections de texte . Utilisez peut-être la distance médiane par rapport au centre des détections de texte, ou quelque chose de similaire. Faites différents diamètres et prenez le rappel le plus fort .

Les explications et avantages:

  • la zone autour du texte est généralement homogène - le vrai rectangle doit être le premier rappel fort
  • De cette façon, vous n'avez pas à effectuer de transformation sur toute l'image, vous pouvez donc le faire de manière plus thurale (peut-être plusieurs fois sur la même zone mais avec des tailles de godet différentes ...)
Pénélope
la source