我用python创建了一个程序,使用pyscreenshot定期截取屏幕特定区域的屏幕截图,其中包含几个预定义的图像之一。我希望将这些图像中的每一个从文件加载到一个列表中,并将它们与屏幕截图进行比较,看看哪一个是当前显示的。最初,这些文件是通过截图图像在屏幕上的方式创建的:
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
然后,当我尝试比较它们时,它总是报告为false:
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"
所以我的问题是,一旦从文件中加载的图像有什么不同,我如何比较‘实时’屏幕截图和从文件中加载的图像?
发布于 2017-08-09 03:55:23
看起来就像我使用ImageGrab.grab()
时,创建了一个PIL.Image.Image
对象,而as 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)
在这里,我利用了np.array()
的PIL图像自动转换为麻木ndarray。然后我检查尺寸是否匹配,如果匹配,则计算绝对误差的最大值。如果此最大值为零,则图像相同。现在你可以直接打电话给
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
发布于 2017-08-09 04:04:18
您可能会对使用感知差异工具感兴趣,该工具可以让您快速识别屏幕截图中的差异。imgdiff是一个用Python语言封装了一个工具的库。一个简单的版本可能可以像在this answer中一样,用PIL的ImageChop
实现
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。
https://stackoverflow.com/questions/45576651
复制相似问题