如何在Python中查找一幅图像中的另一幅图像

25 投票
5 回答
20946 浏览
提问于 2025-04-16 00:01

我正在尝试用Python来判断一张小图片是否在另一张大图片里面。

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

/编辑:好的,有一些想法:我正在使用PIL库,并把每张图片转换成'P'模式,这样我就可以把每个像素当作整数来比较。我想实现类似于Boyer-Moore字符串搜索或Knuth-Morris-Pratt算法的东西,不过是用在二维的。

也许这样会更清楚:我们不是在搜索 ABC in XXXABCXXX(答案是4),而是在搜索

ABC    
DEF    
GHI    

XXXXX        
XABCX        
XDEFX       
XGHIX    
XXXXX  

(答案是(2,2))

5 个回答

4

pyautogui模块可以完成这个任务,它使用的方法是pyautogui.locate(small_image, large_image)。这个方法会返回一个包含四个整数的元组:(left, top, width, height)

8

Sikuli 是通过 OpenCV 来实现的,你可以在 这里 查看 match_by_template 是怎么工作的,然后使用 Python 的 OpenCV 绑定来做同样的事情。如果不使用 OpenCV,可能会比较困难,建议你看看 OpenCV 的文档,搜索一下模板匹配等相关内容...

10

编辑:好的,这里有一个简单的方法来做到这一点:

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上,安装Pillow,然后使用from PIL import Image

撰写回答