4

这是我需要检测的图像: http: //s13.postimg.org/wt8qxoco3/image.png

这是 base64 表示:http ://pastebin.com/raw.php?i=TZQUieWe

我请求你帮助的原因是因为这是一个复杂的问题,我没有能力解决它。我自己可能需要一个星期的时间来完成。

我想到的一些伪代码:

1)截取应用程序并将其存储为图像对象。

2)将我的图像的二进制64表示转换为图像对象。

3)使用某种算法/函数来比较两个图像对象。

在屏幕上,我的意思是在应用程序中。我有应用程序的窗口名称和 PID。

为了 100% 清晰,我需要检测 image1 是否在 image2 内。image1 是我在 OP 中给出的图像。image2 是一个窗口的屏幕截图。

4

3 回答 3

3

如果你把它分解成碎片,它们都很简单。

首先,您需要将应用程序窗口的屏幕截图作为 2D 像素数组。有多种不同的方法可以以特定于平台的方式执行此操作,但您没有提及您所在的平台,所以……让我们使用PIL抓取整个屏幕:

screenshot = ImageGrab.grab()
haystack = screenshot.load()

现在,您需要将 base64 转换为图像。快速浏览一下,它显然只是一个编码的 PNG 文件。所以:

decoded = data.decode('base64')
f = cStringIO.StringIO(decoded)
image = Image.open(f)
needle = image.load()

现在你有一个二维像素数组,你想看看它是否存在于另一个二维数组中。有更快的方法来做到这一点——使用numpy可能是最好的——但也有一种愚蠢的蛮力方式,它更容易理解:只需迭代haystack; 对于每一个,迭代列,并查看是否找到与needle. 如果是这样,请继续浏览其余行,直到完成所有needle,在这种情况下,您返回True,或者找到不匹配的情况,在这种情况下,您continue只需从下一行重新开始。

于 2013-03-29T19:14:16.980 回答
1

这可能是最好的起点:

http://effbot.org/imagingbook/image.htm

如果您无法访问图像的元数据、文件名、类型等,那么您尝试做的事情非常困难,但您的伪声音听起来很准确。本质上,您必须根据照片的形状、线条、大小、颜色等创建算法模型。然后您必须将该模型与已在某些数据库中制作和索引的模型进行匹配。希望有帮助。

于 2013-03-29T18:51:46.130 回答
0

看起来https://python-pillow.org/是 PIL 的更新版本。

于 2016-11-09T19:20:50.227 回答