如何比较pyscreenshot中截图和保存的屏幕截图?

时间:2017-08-08 19:31:14

标签: python python-2.7

我使用pyscreenshot在python中创建了一个程序,它定期截取屏幕特定区域的屏幕截图,其中包含几个预定义图像中的一个。我希望将这些图像中的每一个从文件加载到列表中,并将它们与屏幕截图进行比较,以查看当前显示的内容。最初,文件是通过截取屏幕上的图像来创建的:

while True:

filenm = str(i) + ".png"
im=ImageGrab.grab(bbox=(680,640,735,690)) #accross, down
im.save(filenm)
time.sleep(1)
i = i + 1

然后,当我尝试比较它们时,它总是报告错误:

image2 = Image.open("04.png")

im=ImageGrab.grab(bbox=(680,640,735,690)) #accross, down

if im == image2:
    print "TRUE"
else:
    print "FALSE"

然而,比较保存到文件的两个图像是有效的:

image = Image.open("03.png")
image2 = Image.open("04.png")

if image == image2:
    print "TRUE"
else:
    print "FALSE"

所以我的问题是,从文件加载后图像的差异如何?如何比较“直播”图像?带有从文件加载的图像的屏幕截图?

2 个答案:

答案 0 :(得分:0)

当我使用ImageGrab.grab()时,会创建一个PIL.Image.Image对象,而Image.open()创建一个PIL.pngImagePlugin.PngImageFile对象。您不希望在实际对象上调用==,因为在比较这两种对象类型时没有为PIL图像实现特殊语义,因此它只是检查它们是否相同记忆中的物体。代码我会用来比较两个图像(使用numpy)看起来像

import numpy as np
from PIL import Image

def image_compare(image_1, image_2):
    arr1 = np.array(image_1)
    arr2 = np.array(image_2)
    if arr1.shape != arr2.shape:
        return False
    maxdiff = np.max(np.abs(arr1 - arr2))
    return maxdiff == 0

def image_compare_file(filename_1, filename_2):
    im1 = Image.load(filename_1)
    im2 = Image.load(filename_2)
    return image_compare(im1, im2)

在这里,我利用PIL图像自动投射到np.array()的numpy ndarrays。然后我检查尺寸是否匹配,并计算绝对误差的最大值。如果此最大值为零,则图像相同。现在你可以打电话

if image_compare_file('file1.png','file2.png'):
    pass # images in file are identical
else:
    pass # images differ

if image_compare(image1,image2):
    pass # images are identical
else:
    pass # images differ

答案 1 :(得分:0)

您可能有兴趣使用感知差异工具,它可以让您快速识别屏幕截图中的差异。 imgdiff是一个用Python包装工具的库。可以使用PIL ImageChop实现简单版本,如this answer中所示:

import Image
import ImageChops

im1 = Image.open("splash.png")
im2 = Image.open("splash2.png")

diff = ImageChops.difference(im2, im1)

有关感知差异的更多信息,请查看Bret Slatkin's talk about using it for safe continuous deployment