python - 为什么cv2.imencode ('jpg',…)似乎改变了图像的颜色?

标签 python image numpy opencv image-processing

我创建并查看随机图像。然后,此图像使用opencv编码为jpg文件。但是,在解码此图像后,颜色已略有变化。使用png进行编码无法看到此行为。谁能解释为什么会这样?是jpeg压缩的负面结果吗?难道我做错了什么?下面的代码示例来重新创建它。

import cv2
import numpy as np

random_image = np.random.randint(255, size=(4,4,3), dtype=np.uint8)    
cv2.imshow('Image', random_image)
cv2.waitKey()

_, img_encoded = cv2.imencode('.jpg', random_image)
img_string = img_encoded.tostring()
npimg = np.fromstring(img_string, dtype=np.uint8)
img = cv2.imdecode(npimg, 1)
cv2.imshow('Image', img)
cv2.waitKey()

# Does not happen with png
_, img_encoded = cv2.imencode('.png', random_image)
img_string = img_encoded.tostring()
npimg = np.fromstring(img_string, dtype=np.uint8)
img = cv2.imdecode(npimg, 1)
cv2.imshow('Image', img)
cv2.waitKey()

编辑以添加一些4x4图像。
原版的:
Original Image
JPG格式
JPG
PNG
PNG
再次编辑512x512图片
Original 512x512
JPG 512x512
PNG 512x512

最佳答案

JPG是有损压缩。实际上,它通过以对眼睛“无害”的方式修改颜色来起作用。 PNG是一种无损压缩,因此您可以在编码/解码后获得确切的压缩效果。
通过指定JPG参数,您可以控制有多少IMWRITE_JPEG_QUALITY可以自由修改图像:

cv2.imencode(('.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, 90])
较高的值表示较少的压缩,结果更接近原始。例如,100应该完全没有压缩,并且结果与原始结果相同。

关于python - 为什么cv2.imencode ('jpg',…)似乎改变了图像的颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64342838/

相关文章:

css - 将侧边按钮图像添加到按钮

python - 如何在numpy中向量化傅立叶级数部分和

html - 在固定的 div 大小内安装带有文本的图像

python - 在 python 中使用 subprocess.run 以管理员身份运行进程

python - GAE开发服务器重启后保留全文搜索索引?

python - 从模块访问全局变量

android - 拍摄覆盖范围内的照片

python - 在 Keras(tf 后端)中返回标量点积真的那么难吗?

python - 我将如何使用 Dask 对 NumPy 数组的切片执行并行操作?

python - SSL 错误 : bad record mac - Managing multiple connections with PostgreSQL and Python multiprocessing