Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python在另一个图像中查找图像_Python_Image - Fatal编程技术网

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

如何使用python在另一个图像中查找图像,python,image,Python,Image,我试图使用python来确定一个(小)图像是否在另一个(大)图像中 在我完全走入歧途之前,有什么建议吗 /编辑:好的,一些想法:我正在使用PIL,我正在将每个图像转换为“p”模式,这样我可以将每个像素作为一个整数进行比较。我正在尝试实现类似于Boyer–Moore字符串搜索或Knuth–Morris–Pratt算法的东西,但是在二维中 也许这会有所帮助:我们正在搜索的不是XXXABCXXX中的ABC(答案=4) ABC DEF GHI 在 XXXXX X

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

在我完全走入歧途之前,有什么建议吗

/编辑:好的,一些想法:我正在使用PIL,我正在将每个图像转换为“p”模式,这样我可以将每个像素作为一个整数进行比较。我正在尝试实现类似于Boyer–Moore字符串搜索或Knuth–Morris–Pratt算法的东西,但是在二维中

也许这会有所帮助:我们正在搜索的不是XXXABCXXX中的
ABC(答案=4)

ABC    
DEF    
GHI    

XXXXX        
XABCX        
XDEFX       
XGHIX    
XXXXX  

(答案=(2,2))

是否使用OpenCV,请参见
match\u by\u template
如何工作,然后使用Python OpenCV绑定执行相同的操作。在没有OpenCV的情况下进行操作应该很困难,请查看OpenCV文档,搜索模板匹配等。

编辑:好的,下面是一个简单的方法:

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
,安装枕头,然后从PIL导入图像

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

请看我对类似问题的回答。从PIL到numpy的转换是直接进行的,例如,只需使用
np.array(pilimage)
pyautogui
模块使用
pyautogui.locate(小图像,大图像)
方法,该方法返回4个整数元组:
(左、上、宽、高)

你是在精确地寻找小图像,还是可以旋转/倾斜/缩放图像等?扎克,你解决过这个问题吗?我也在同一条船上,对吗now@mikew除了我在下面发布的幼稚算法,我从未解决过这个问题。我怀疑你可以用OpenCV解决这个问题,但我从未找到任何示例代码。我仍然有兴趣在纯python中看到一个好的解决方案。因为这是谷歌目前最热门的搜索结果,未来的观众可能会对a感兴趣。我也非常欣赏一个如何在2d空间中使用Boyer Moore(-Horspool)的例子。实际上,这个答案只在X平面上的一维上进行优化。您正在使用B-M加速横向搜索的搜索,方法是切换到。但是你在真实的层面上做着天真的探索,因为你永远不会向下移动。不过,这是非常直观的,而且肯定是一种改进