我从维基百科下载了一个测试图片(下面看到的树),用Python中的
最后一张图片显示了像素值差异的频率分布情况。
正如Catree所指出的那样,我的减法操作导致整数溢出。我更新了代码,在减法操作之前将其转换为
这是我使用的代码:
Pillow
和OpenCV
(使用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建议的更改之前,这就是我看到的。
np.array(Image.open(im))
,并且如果我没记错的话,imshow会拉伸颜色以满足范围(查看im-imP
的实际值,它们可能非常小)。 - Nullmanim = cv2.imread(im)
和imP = np.array(Image.open(im))
),并且对我来说运行得很好。我在Win10上使用Python 3.6.3,cv2版本为3.3.0,pillow版本为4.3.0。 - Nullman