Python:如何使用 matplotlib.image.imsave() 将精确的 numpy 数组数据保存到图像

Python: How to save EXACT numpy array data to image using matplotlib.image.imsave()

我在使用 matplotlibs imsave() 和 imread() 函数保存和加载数据时观察到一些奇怪的行为。我保存的 RGB 值与我再次加载图片时得到的不同。

import numpy as np
from matplotlib import image

s_pic = np.zeros((1, 1, 3))

s_pic[0,0,0] = 0.123
s_pic[0,0,1] = 0.456
s_pic[0,0,2] = 0.789

image.imsave('pic.png', s_pic)

l_pic = image.imread('pic.png')

print(l_pic[0,0,0])
print(l_pic[0,0,1])
print(l_pic[0,0,2])

我得到的输出是:

0.12156863
0.45490196
0.7882353

谁能解释一下为什么RGB值会在这个过程中发生变化?我已经查看了 matplotlib 文档,但找不到这个问题的答案。

Can somebody explain why the RGB values change in this process?

RGB 值是 0-255 范围内的整数。您的浮动被解释为:

>>> .123 * 255
31.365
>>> int(.123 * 255)
31

31 正在写入该像素。然后反过来..

>>>
>>> 31 / 255
0.12156862745098039
>>>

深入研究 source for imsave() the array passed to imsave() is converted to RGBA values using matplotlib.cm.ScalarMappable().to_rgba(bytes=True)

>>> from matplotlib import cm
>>> sm = cm.ScalarMappable()
>>> rgba = sm.to_rgba(s_pic, bytes=True)
>>> rgba
array([[[ 31, 116, 201, 255]]], dtype=uint8)
>>>