> Modules non standards > OpenCV > Match de pattern
Match de pattern
L'objectif est de retrouver dans une image donnée le meilleur match avec une petite image.
On essaie de retrouver la petite image suivante (qui a été grossie ici) :
newImg = img[160:200,284:324,:]
dans l'image courante rappelée ici :
newImg = img
Match du template :
- recherche dans une image img du template en faisant glisser le template sur toute l'image et en calculant une proximité à chaque position :
template = img[160:200,284:324,:]
result = cv2.matchTemplate(img, template, cv2.TM_SQDIFF)
- le template doit être de même type que l'image.
- plusieurs méthodes pour juger de la proximité :
- cv2.TM_SQDIFF : carré des différences (on cherche la plus petite valeur sur toute l'image).
- cv2.TM_SQDIFF_NORMED : carré des différences normalisé.
- cv2.TM_CCORR : corrélation (on cherche alors la plus grande valeur sur toute l'image).
- cv2.TM_CCORR_NORMED : corrélation normalisée.
- le résultat est un tableau de valeurs que l'on peut visualiser comme image.
Visualisation des matchs sous forme d'image (avec cette méthode de calcul des carrés, les meilleurs matchs ont une valeur faible, donc sont noirs) :
import numpy
template = img[160:200,284:324,:]
newImg = cv2.matchTemplate(img, template, cv2.TM_SQDIFF)
newImg = (255 * newImg / newImg.max()).astype(numpy.uint8)
On peut calculer la position de meilleur match sur le tableau obtenu :
- (minVal, maxVal, minLocation, maxLocation) = cv2.minMaxLoc(newImg) : les localisations sont un couple de coordonnées correspondant au minimum ou au maximum.
- en fonction de la méthode donnée à matchTemplate, il faut prendre en compte le minimum ou le maximum (ça donne la position du pixel en haut à gauche de la petite image pour le meilleur match).
Copyright python-simple.com
programmer en python, tutoriel python, graphes en python, Aymeric Duclert