我创建并查看了一个随机图像。然后,这个图像被编码为一个jpg文件与opencv。然而,解码后,这个图像的颜色已经略有改变。这种行为是没有看到使用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图像。
原件:
的数据
JPG
的
PNG
的
再次编辑512x512图像
Original 512x512
JPG 512x512的
PNG 512x512的
2条答案
按热度按时间s1ag04yj1#
JPG
是一种有损压缩。它实际上是通过修改颜色的方式来工作的,这种方式应该是“无害”的。PNG
是一种无损压缩,所以你可以在编码/解码后得到确切的结果。您可以通过指定
IMWRITE_JPEG_QUALITY
参数来控制JPG
可以自由修改图像的程度,如下所示:字符串
值越大,压缩越少,结果越接近原始值。例如,
100
应完全不压缩,结果与原始值相同。khbbv19g2#
我不知道为什么你的PNG图像有正确的颜色,因为在我的情况下,它也受到影响。无论如何,这应该适用于任何扩展。
OpenCV使用BRG而不是RGB,所以它会反转红色和蓝色。要纠正这个问题,请确保在编码之前重新转换图像颜色:
字符串
注意,
img_array
是cv2.imread()产生的NumPy数组