numpy 为什么cv2.imencode('jpg',.)看起来会改变图像的颜色?

laximzn5  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(199)

我创建并查看了一个随机图像。然后,这个图像被编码为一个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

s1ag04yj

s1ag04yj1#

JPG是一种有损压缩。它实际上是通过修改颜色的方式来工作的,这种方式应该是“无害”的。PNG是一种无损压缩,所以你可以在编码/解码后得到确切的结果。
您可以通过指定IMWRITE_JPEG_QUALITY参数来控制JPG可以自由修改图像的程度,如下所示:

cv2.imencode(('.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, 90])

字符串
值越大,压缩越少,结果越接近原始值。例如,100应完全不压缩,结果与原始值相同。

khbbv19g

khbbv19g2#

我不知道为什么你的PNG图像有正确的颜色,因为在我的情况下,它也受到影响。无论如何,这应该适用于任何扩展。
OpenCV使用BRG而不是RGB,所以它会反转红色和蓝色。要纠正这个问题,请确保在编码之前重新转换图像颜色:

correct_color = cv2.cvtColor(img_array , cv2.COLOR_BGR2RGB)
encode_image = cv2.imencode('.jpg', correct_color)

字符串
注意,img_array是cv2.imread()产生的NumPy数组

相关问题