Comment trouver une image dans une autre image en utilisant python

j'essaye d'utiliser python pour déterminer si une (petite) image est dans une autre (grande) image.

N'importe quelles suggestions avant que je me prenne complètement dans le mauvais chemin?

/edit: Ok, quelques idées: j'utilise PIL, et je convertis chaque image en mode 'P' pour pouvoir comparer chaque pixel en entier. J'essaie d'implémenter quelque chose comme une recherche de chaîne de caractères Boyer–Moore ou L'algorithme Knuth–Morris–Pratt, mais en 2 dimensions.

peut-être que ceci aide: au lieu de chercher ABC in XXXABCXXX (réponse=4) nous sommes à la recherche pour

ABC    
DEF    
GHI    

XXXXX        
XABCX        
XDEFX       
XGHIX    
XXXXX  

(réponse=(2,2))

20
demandé sur Zach 2010-06-16 01:58:27

4 réponses

EDIT: Ok, voici le naïf manière de faire ceci:

import Image, numpy

def subimg(img1,img2):
    img1=numpy.asarray(img1)
    img2=numpy.asarray(img2)

    #img1=numpy.array([[1,2,3],[4,5,6],[7,8,9]])
    #img2=numpy.array([[0,0,0,0,0],[0,1,2,3,0],[0,4,5,6,0],[0,7,8,9,0],[0,0,0,0,0]])

    img1y=img1.shape[0]
    img1x=img1.shape[1]

    img2y=img2.shape[0]
    img2x=img2.shape[1]

    stopy=img2y-img1y+1
    stopx=img2x-img1x+1

    for x1 in range(0,stopx):
        for y1 in range(0,stopy):
            x2=x1+img1x
            y2=y1+img1y

            pic=img2[y1:y2,x1:x2]
            test=pic==img1

            if test.all():
                return x1, y1

    return False

small=Image.open('small.tif')
big=Image.open('big.tif')

print subimg(small, big)

ça marche très bien, mais je veux accélérer. Je pense que la clé est dans le tableau de "test" qui nous pourrions être en mesure d'utiliser d'ignorer certaines positions dans l'image.

Edit 2: Assurez-vous d'utiliser des images dans un format sans perte pour tester ceci.

Mac, installer Oreiller et from PIL import Image

8
répondu Zach 2016-07-20 05:38:51

Sikuli utilise-t-il OpenCV, voir ici comment match_by_template fonctionne et utilise ensuite les fixations Python OpenCV pour faire de même. Faire cela sans OpenCV devrait être difficile, jetez un oeil à la documentation OpenCV, rechercher des modèles de correspondance, etc...

6
répondu Tarantula 2013-04-19 00:16:06

je sais qu'il est un peu tard, mais vous pouvez utiliser Boyer-Moore pour rechercher la première ligne de la petite image dans chacune des lignes de la grande image. Au moment où vous trouvez une correspondance, vous avez la position X et Y et vous n'avez qu'à vérifier si le reste des lignes de l'image plus petite correspondent au reste des lignes de l'image plus grande à partir de la position X et Y+1,2,3,... À la première discordance continuer avec la recherche de la première ligne. Je ne pense pas que tu puisses aller plus vite que ce.

3
répondu rslite 2011-09-26 14:39:29

regardez ma réponse à une question similaire pour un exemple de code utilisant OpenCV. La conversion de PIL en numpy est simple, par exemple il suffit d'utiliser np.array(pilimage).

0
répondu PiQuer 2017-05-23 12:25:06