在Pillow和OpenCV中打开的图像不匹配

嚼袜子

我从Wikipedia(如下所示的树)下载了测试图像,以在python中进行比较PillowOpenCV(使用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])

一棵树的原始照片(摘自Wikipedia“ Tree”文章)

频率分布更新为显示负值。

更新差异


这是我实施Catree建议的更改之前所看到的。

区别

距离

卡特里

原始图像是JPEG。

JPEG解码可能会产生不同的结果,具体取决于libjpeg版本,编译器优化和平台等。

检查PillowOpenCV正在使用哪个版本的libjpeg

有关更多信息,请参见此答案:JPEG图像在多个设备上此处具有不同的像素值

顺便说一句,(im-imP)产生uint8溢出(如果没有在频率图表中看到它,那么就不可能有这么大的大像素差异)。int在进行频率计算之前,请尝试强制类型转换。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章