问题描述
在使用 matplotlibs imsave() 和 imread() 函数保存和加载数据时,我观察到了一些奇怪的行为。我保存的 RGB 值与重新加载图片时得到的值不同。
import numpy as np
from matplotlib import image
s_pic = np.zeros((1,1,3))
s_pic[0,0] = 0.123
s_pic[0,1] = 0.456
s_pic[0,2] = 0.789
image.imsave('pic.png',s_pic)
l_pic = image.imread('pic.png')
print(l_pic[0,0])
print(l_pic[0,1])
print(l_pic[0,2])
我得到的输出是:
0.12156863
0.45490196
0.7882353
有人可以解释为什么 RGB 值在此过程中会发生变化吗?我已经检查了 matplotlib 文档,但找不到这个问题的答案。
解决方法
谁能解释一下为什么 RGB 值在这个过程中会发生变化?
RGB 值是 0-255 范围内的整数。您的浮动被解释为:
>>> .123 * 255
31.365
>>> int(.123 * 255)
31
正在向该像素写入 31。然后反过来..
>>>
>>> 31 / 255
0.12156862745098039
>>>
深入研究传递给 imsave()
的数组使用 source for imsave() 转换为 RGBA 值的 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)
>>>