如何使用python在另一个图像中查找图像
我试图使用python来确定一个(小)图像是否在另一个(大)图像中 在我完全走入歧途之前,有什么建议吗 /编辑:好的,一些想法:我正在使用PIL,我正在将每个图像转换为“p”模式,这样我可以将每个像素作为一个整数进行比较。我正在尝试实现类似于Boyer–Moore字符串搜索或Knuth–Morris–Pratt算法的东西,但是在二维中 也许这会有所帮助:我们正在搜索的不是XXXABCXXX中的如何使用python在另一个图像中查找图像,python,image,Python,Image,我试图使用python来确定一个(小)图像是否在另一个(大)图像中 在我完全走入歧途之前,有什么建议吗 /编辑:好的,一些想法:我正在使用PIL,我正在将每个图像转换为“p”模式,这样我可以将每个像素作为一个整数进行比较。我正在尝试实现类似于Boyer–Moore字符串搜索或Knuth–Morris–Pratt算法的东西,但是在二维中 也许这会有所帮助:我们正在搜索的不是XXXABCXXX中的ABC(答案=4) ABC DEF GHI 在 XXXXX X
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加速横向搜索的搜索,方法是切换到。但是你在真实的层面上做着天真的探索,因为你永远不会向下移动。不过,这是非常直观的,而且肯定是一种改进