You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Pillow与OpenCV打开的图片哈希值不一致?技术咨询

Pillow与OpenCV处理JPEG图片的哈希值差异问题解析

最近我做了个实际测试:用从维基百科下载的一张树木JPEG图片(如下),分别用Pillow和OpenCV(cv2)进行读取后重新保存,对比两者的处理结果:

测试用树木原图

测试细节与现象

我用以下Python代码计算图片的MD5哈希值:

import hashlib

def get_md5(file_path):
    with open(file_path, 'rb') as f:
        return hashlib.md5(f.read()).hexdigest()

测试过程中发现了几个关键现象:

  • 视觉层面:两张处理后的图片完全看不出差异
  • 哈希校验:计算得到的MD5哈希值完全不匹配
  • 像素对比:将两张图片做像素相减后,得到的结果图并非纯黑色,说明存在细微的像素值差异

图片相减结果图

解决办法

如果先把原始JPEG格式的图片转换成PNG格式,再用这两个库分别处理保存,此时两者生成的图片哈希值就完全匹配了。

差异根源分析

另外还有一张图展示了这些像素值差异的频率分布,能更直观地看到差异的分布情况:

像素值差异频率分布图

正如Catree所指出的,这类差异的根源在于JPEG编码的实现细节差异——JPEG是有损压缩格式,Pillow和OpenCV在编码时采用的压缩参数、算法优化细节略有不同,导致生成的图片像素存在极其细微的差别,这些差别人眼无法分辨,但会直接改变文件的哈希值;而PNG作为无损压缩格式,编码逻辑更统一,所以转换格式后再处理,两个库生成的文件就不会出现这类差异了。


内容的提问来源于stack exchange,提问作者chew socks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:51:01