Python:如何使用 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.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)
>>>