Algorithme de l'Image dans L'image
j'ai besoin d'un algorithme écrit dans n'importe quelle langue pour trouver une image à l'intérieur d'une image, y compris à différentes échelles. Quelqu'un connaît-il un point de départ pour résoudre un problème comme celui-ci?
par exemple:
j'ai une image de 800x600 et que l'image est une boule jaune mesurant 180 pixels de circonférence. Je dois pouvoir trouver cette image avec un motif de recherche d'une boule jaune ayant une circonférence de 15 pixels.
Merci
4 réponses
voici un algorithme:
- divisez l'image en RGB et prenez le canal bleu. Vous remarquerez que les zones qui étaient jaunes dans l'image couleur sont maintenant sombres dans le canal bleu. C'est parce que le bleu et le jaune sont couleurs complémentaires .
- inverser le canal bleu
- créez un motif de recherche à l'échelle de gris avec un cercle de la même taille que ce qu'il y a dans l'image (180 pixels de circonférence). Faire un cercle blanc sur un fond noir.
- Calculez la corrélation croisée du patron de recherche avec le canal bleu inversé.
- le pic de corrélation croisée correspond à l'emplacement de la bille.
Voici l'algorithme en action:
RGB et R:
G et B:
inversé B et motif:
code Python + OpenCV:
import cv
if __name__ == '__main__':
image = cv.LoadImage('ball-b-inv.png')
template = cv.LoadImage('ball-pattern-inv.png')
image_size = cv.GetSize(image)
template_size = cv.GetSize(template)
result_size = [ s[0] - s[1] + 1 for s in zip(image_size, template_size) ]
result = cv.CreateImage(result_size, cv.IPL_DEPTH_32F, 1)
cv.MatchTemplate(image, template, result, cv.CV_TM_CCORR)
min_val, max_val, min_loc, max_loc = cv.MinMaxLoc(result)
print max_loc
résultat:
misha@misha-desktop:~/Desktop$ python cross-correlation.py
(72, 28)
cela vous donne la coordonnée en haut à gauche de la première occurrence de la motif dans l'image. Ajoutez le rayon du cercle aux deux coordonnées x et y si vous voulez trouver le centre du cercle.
vous devriez jeter un oeil à OpenCV , une bibliothèque de vision d'ordinateur open source - ce serait un bon point de départ. Vérifier spécifiquement la détection d'objet et la méthode cvMatchTemplate .
une version d'un des messages précédents faite avec opencv 3 et python 3
import cv2
import sys
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(cv2.matchTemplate(cv2.imread(sys.argv[1]),cv2.imread(sys.argv[2]),cv2.TM_CCOEFF_NORMED))
print(max_loc)
save as file.py et exécuter comme:
python file.py modèle d'image
un point de départ simple serait le Hough transform , si vous voulez trouver des cercles.
cependant, il y a tout un domaine de recherche autour de ce sujet appelé détection et reconnaissance d'objet. L'état de l'art a considérablement progressé au cours de la dernière décennie.