Я загрузил тестовое изображение из Википедии (дерево, показанное ниже), чтобы сравнить Pillow
и OpenCV
(с использованием cv2
) в python. На первый взгляд два изображения выглядят одинаково, но их соответствующие хэши md5
не совпадают; и если я вычту два изображения, результат даже не будет близким к сплошному черному (изображение, показанное под оригиналом). Исходное изображение - JPEG. Если я сначала конвертирую его в PNG, хеши совпадают.
На последнем изображении показано частотное распределение различий значений пикселей.
Как указала Катри, мое вычитание вызывало целочисленное переполнение. Я тоже обновился до преобразования dtype=int
перед вычитанием (чтобы показать отрицательные значения), а затем взял абсолютное значение перед построением разницы. Теперь разностное изображение воспринимается сплошным черным цветом.
Это код, который я использовал:
from PIL import Image
import cv2
import sys
import md5
import numpy as np
def hashIm(im):
imP = np.array(Image.open(im))
# Convert to BGR and drop alpha channel if it exists
imP = imP[..., 2::-1]
# Make the array contiguous again
imP = np.array(imP)
im = cv2.imread(im)
diff = im.astype(int)-imP.astype(int)
cv2.imshow('cv2', im)
cv2.imshow('PIL', imP)
cv2.imshow('diff', np.abs(diff).astype(np.uint8))
cv2.imshow('diff_overflow', diff.astype(np.uint8))
with open('dist.csv', 'w') as outfile:
diff = im-imP
for i in range(-256, 256):
outfile.write('{},{}\n'.format(i, np.count_nonzero(diff==i)))
cv2.waitKey(0)
cv2.destroyAllWindows()
return md5.md5(im).hexdigest() + ' ' + md5.md5(imP).hexdigest()
if __name__ == '__main__':
print sys.argv[1] + '\t' + hashIm(sys.argv[1])
Распределение частот обновлено, чтобы отображать отрицательные значения.
Это то, что я видел до того, как внедрил изменения, рекомендованные Кэтри.
np.array(Image.open(im))
, а iirc imshow растягивает цвета, чтобы соответствовать диапазону (посмотрите на фактические значенияim-imP
, они, вероятно, будут очень маленькими) - person Nullman   schedule 22.04.2018np.array(Image.open(im))
даетdtype=np.uunt8
. Выложил график распределения значений вim-imP
. - person chew socks   schedule 22.04.2018virtualenv
, поэтому, по крайней мере, библиотеки Python должны быть в актуальном состоянии. - person chew socks   schedule 22.04.2018im = cv2.imread(im) imP = np.array(Image.open(im))
, и он отлично работает для меня, я получил cv2 версии 3.3.0 и подушку 4.3.0 на python 3.6.3 на win10 - person Nullman   schedule 22.04.2018cat chck.py
, в которой они расположены в правильном порядке. Интересно, что вы оба на Win10. Я посмотрю, смогу ли я сегодня попробовать это на коробке с Windows. - person chew socks   schedule 22.04.2018