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))
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
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...
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.
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)
.