如何在python中比较两个图像文件的内容?

时间:2019-09-25 13:10:45

标签: python python-imaging-library

我想比较两个基本上读取两个.png文件的图像文件(.png),并断言内容是否相等。

我在下面尝试过

def read_file_contents(file1, file2):
     with open(file1, 'r', errors='ignore') as f:
        contents1 = f.readlines()
        f.close()
     with open(file1, 'r', errors='ignore') as f:
        contents2 = f.readlines()
        f.close()
     return {contents1, contents2}

然后断言我使用的两个内容是否相等

 assert contents1 == contents2

但这给了我断言错误。有人可以帮我吗谢谢。

3 个答案:

答案 0 :(得分:1)

有多种方法可以使用各种Python库来完成此任务,包括numpy和math,imagehash和pillow。

这是一种方法(我将其修改为仅比较2张图像)。

# This module is used to load images
from PIL import Image
# This module contains a number of arithmetical image operations
from PIL import ImageChops

def image_pixel_differences(base_image, compare_image):
  """
  Calculates the bounding box of the non-zero regions in the image.
  :param base_image: target image to find
  :param compare_image:  set of images containing the target image
  :return: The bounding box is returned as a 4-tuple defining the
           left, upper, right, and lower pixel coordinate. If the image
           is completely empty, this method returns None.
  """
  # Returns the absolute value of the pixel-by-pixel
  # difference between two images.

  diff = ImageChops.difference(base_image, compare_image)
  if diff.getbbox():
    return False
  else:
    return True

base_image = Image.open('image01.jpeg')
compare_image = Image.open('image02.jpeg')
results = image_pixel_differences (base_image, compare_image)

我还有其他示例,因此如果此示例不适合您,请告诉我。

答案 1 :(得分:0)

我不认为在这里使用硒作为标签是正确的选择,但有可能。

图像可以并且被表示为一堆像素(基本上是数字),其排列方式使它们成为真实的样子。 想法是将这些数字与它们在两张图片中的排列方式一并计算它们之间的距离,有多种方法可以实现,例如MSE。 有关其自身的代码和进一步的说明,请查看下面的链接。

https://www.pyimagesearch.com/2014/09/15/python-compare-two-images/

祝您好运! (:

答案 2 :(得分:0)

如果您只想精确匹配,则可以直接比较字节:

def validate_file_contents(file1, file2):
    with open(file1, 'rb', errors='ignore') as f1, open(file2, 'rb', errors='ignore') as f2:
        contents1 = f1.read()
        contents2 = f2.read()
    return contents1 == contents2     

如果需要,您可以使用assert,但我个人将检查True / False条件。

您的代码中也有一些错误:

  1. with块中的内容未缩进。
  2. with块中,您不需要close()文件。
  3. 您将返回setcontent1中的content2,如果它们实际上相等,则只返回1个项目。您可能想return (content1, content2)作为元组。