Сравнение изображений на равенство, но результат большой - PullRequest
0 голосов
/ 18 мая 2018

Я пытался прочитать изображения в значениях ASCII и сравнить два изображения для точного соответствия значений ASCII.Однако вывод очень большой, и мое оборудование очень старое и не может прочитать вывод, я попытался сохранить вывод в файл, и файл был огромным.Вот что я пытаюсь сделать:

orig = sys.stdout
f = open('output.txt','w')
sys.stdout = f

# Load the two Images 

with open("image1.jpg", "rb") as b:
 with open("image2.jpg", "rb") as a:

  # Convert the two images from binary to ascii

    chunk1 = binascii.b2a_hex(b.read())
    chunk2 = binascii.b2a_hex(a.read())

# split the two chunks of ascii values into a list of 24 bytes 

chunkSize = 24
for i in range (0,len(chunk1),chunkSize):
 for j in range (0,len(chunk2),chunkSize):

 # Print them

  list1 = chunk1[i:i+chunkSize]
  print "List1: "+ list1
  list2 = chunk2[j:j+chunkSize]
  print "List2: " + list2

# Compare the two images for equality 

  list = list1 == list2

 # print whether its a match or false

  print list

sys.stdout = orig
f.close()

# Saved to a file

Как это работает:

img1 имеет следующий гекс: FFD8 FFE0 0010 4A46 4946 0001 0200 0064 0064 0000 FFEC 0011 img2 имеетследующий гекс: FFD8 FFE0 0010 4A46 4946 0001 0210 0064 0064 0000 FFEC 0012

Это займет первые 24 символа img1 и проверит его по всем гексам img2 за 24 символа, а затем возьмет следующие 24символы из img1 и проверить все гексагоны img2.Пример:

List1: FFD8 FFE0 0010 4A46 4946 0001 
List2: FFD8 FFE0 0010 4A46 4946 0001 
True 

List1: FFD8 FFE0 0010 4A46 4946 0001 
List2: 0210 0064 0064 0000 FFEC 0012 
False

List1: 0200 0064 0064 0000 FFEC 0011 
List2: FFD8 FFE0 0010 4A46 4946 0001 
False 

List1: 0200 0064 0064 0000 FFEC 0011 
List2: 0210 0064 0064 0000 FFEC 0012 
False

Тем не менее, вывод велик, учитывая огромные изображения, такие как 40-килограммовые шестнадцатеричные и 20-килобайтные, которые я не могу прочитать с терминала, ни сохраняя выходные данные в файл.

Как распечатать только совпадающие (True) 24-значные шестнадцатеричные значения ASCII без печати истинных, ложных и ложных шестнадцатеричных значений ASCII?

FFD8 FFE0 0010 4A46 4946 0001

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Если я понимаю вопрос, как насчет:

orig = sys.stdout
f = open('output.txt','w')
sys.stdout = f

# Load the two Images 

with open("image1.jpg", "rb") as b:
 with open("image2.jpg", "rb") as a:

  # Convert the two images from binary to ascii

    chunk1 = binascii.b2a_hex(b.read())
    chunk2 = binascii.b2a_hex(a.read())

# split the two chunks of ascii values into a list of 24 bytes 

chunkSize = 24
for i in range (0,len(chunk1),chunkSize):
 for j in range (0,len(chunk2),chunkSize):

  list1 = chunk1[i:i+chunkSize]
  list2 = chunk2[j:j+chunkSize]

  # Compare the two images for equality 

  list = list1 == list2

  # print bytes once only if they were the same in both list1 and list2

  if list:
   print list1

sys.stdout = orig
f.close()

Это исключит любой вывод, который является ложным в вашем исходном примере, единственным выводом будут совпадения байтов.Если это не то, что вы имели в виду, можете ли вы уточнить, чего именно вы хотите достичь?

0 голосов
/ 18 мая 2018

Вы можете просто прочитать 24 байта с каждого изображения за раз вместо чтения всего файла сразу.file.read() принимает параметр, который позволяет ему просто читать пару байтов за раз.Вы можете запустить это в цикле, пока read() не вернет пустую строку, что означает, что конец файла достигнут.См. doc .

EDIT :

Если вам нужно просто проверить, совпадают ли два файла, почему бы не посмотреть контрольные суммы?Одинаковые файлы всегда будут иметь одинаковую контрольную сумму.См. ответ для более подробной информации.

...