Как сравнить содержимое двух файлов изображений в Python? - PullRequest
0 голосов
/ 25 сентября 2019

Я хочу сравнить два файла изображений (.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

, но это дает мне assertionerror.Может ли кто-нибудь помочь мне с этим.спасибо.

Ответы [ 3 ]

1 голос
/ 25 сентября 2019

Существует несколько способов решения этой задачи с использованием различных библиотек 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)

У меня есть дополнительные примеры, поэтому, пожалуйста, дайте мне знать, если этот не работает для вас.

0 голосов
/ 25 сентября 2019

Если вы просто хотите точное совпадение, вы можете сравнить байты напрямую:

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. Вы возвращаете set из content1 и content2, где, если они фактически равны, у вас будет только 1 предмет.Вы, вероятно, хотели return (content1, content2) как кортеж.
0 голосов
/ 25 сентября 2019

Я не думаю, что использование селена в качестве тега здесь является правильным выбором, но с / е.

Изображения могут и представляются в виде группы пикселей (в основном чисел), расположенных таким образом, что делает ихони есть.Идея состоит в том, чтобы взять эти числа с их расположением обоих изображений и рассчитать расстояние между ними, есть несколько способов сделать это, как MSE.Сам код и дальнейшие объяснения можно найти по ссылке ниже.

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

Удачи, приятель!(

...