使用OpenCV读写JPG图像后两次读取的数组总和不一致是什么原因?
JPG图像读写后数组总和不一致的成因
- 核心原因是 JPEG属于有损压缩格式:你调用
cv2.imwrite存储为.jpg后缀的文件时,OpenCV默认会启用JPEG有损压缩逻辑,会主动丢弃部分人眼难以感知的图像细节来缩小文件体积,这个压缩过程是不可逆的。因此写入后再读取得到的img2数组,和原始img1数组的像素值会存在差异,总和sum1和sum2自然不相等。 - 即便你手动将JPEG压缩质量拉到最高,比如使用代码
cv2.imwrite('test2.jpg', img1, [int(cv2.IMWRITE_JPEG_QUALITY), 100])写入,也无法完全消除数值差异:JPEG压缩标准本身内置了不可逆的量化环节,哪怕质量参数设置为100,也只是最大程度降低损失,不会做到和原始像素值完全一致。 - 如果需要保证读写前后数组完全一致,请选择无损格式存储,比如BMP、PNG(无损压缩模式)、TIFF等,这类格式不会修改原始像素数值,读写后的数组总和会完全相等。
内容的提问来源于stack exchange,提问作者Shindou
相关产品推荐
相关产品推荐

