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
demandé sur Paul 2011-01-18 06:14:38

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:

alt text alt text

G et B:

alt text alt text

inversé B et motif:

alt text alt text

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.

21
répondu mpenkov 2012-09-06 00:05:19

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 .

1
répondu BrokenGlass 2011-01-18 03:18:04

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

1
répondu user3694243 2016-05-21 15:46:58

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.

0
répondu carlosdc 2011-01-18 03:18:41