我从Wikipedia(下面的树)下载了一个测试图像,用python比较Pillow和{}(使用cv2)。从视觉上看,这两幅图像看起来是一样的,但它们各自的md5哈希值不匹配;如果我减去这两幅图像,结果甚至不接近纯黑(下图为原始图像)。原始图像是JPEG格式。如果我先把它转换成PNG,散列就匹配了。在
最后一幅图像显示了像素值差异的频率分布。在
正如Catree指出的那样,我的减法导致了整数溢出。我更新到在减法之前转换成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])
更新频率分布以显示负值。在
这是我在实现Catree推荐的更改之前看到的。在