如何使用python在另一个图像中查找图像

时间:2010-06-15 21:58:27

标签: python image

我正在尝试使用python来确定一个(小)图像是否在另一个(大)图像中。

在我完全走错路之前有什么建议吗?

/ edit:好的,有些想法:我正在使用PIL,我正在将每个图像转换为'P'模式,因此我可以将每个像素作为整数进行比较。我正在尝试实现类似Boyer-Moore字符串搜索或Knuth-Morris-Pratt算法,但是在二维中。

也许这会有所帮助:我们正在搜索

而不是搜索ABC in XXXABCXXX(answer = 4)
ABC    
DEF    
GHI    

in

XXXXX        
XABCX        
XDEFX       
XGHIX    
XXXXX  

(回答=(2,2))

5 个答案:

答案 0 :(得分:9)

编辑:好的,这是一种天真的方式:

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)

它工作正常,但我想加快速度。我认为关键在于数组'test',我们可以使用它来跳过图像中的某些位置。

编辑2:确保以无损格式使用图像来测试它。

Mac上,安装枕头和from PIL import Image

答案 1 :(得分:7)

Sikuli使用OpenCV进行操作,请参阅here match_by_template如何工作,然后使用Python OpenCV绑定执行相同操作。没有OpenCV这样做应该很难,看看OpenCV文档,搜索模板匹配等......

答案 2 :(得分:3)

我知道它有点晚了,但你可以使用Boyer-Moore在大图像的每一行中搜索小图像的第一行。找到匹配的那一刻,你有X和Y的位置,你只需要检查较小图像的其余行是否与从X和Y + 1,2开始的较大图像的其余行匹配, 3,...在第一次不匹配时继续搜索第一行。我认为你不能比这更快。

答案 3 :(得分:3)

pyautogui模块使用pyautogui.locate(small_image, large_image)方法执行该工作,该方法返回4整数元组:(left, top, width, height)

答案 4 :(得分:0)

查看我对code example using OpenCV的类似问题的回答。从PIL到numpy的转换是直截了当的,例如只需使用np.array(pilimage)