我使用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"
所以我的问题是,从文件加载后图像的差异如何?如何比较“直播”图像?带有从文件加载的图像的屏幕截图?
答案 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。