PIL /枕头图像输出比所需的RGB值更红

时间:2014-12-28 12:21:47

标签: python matplotlib pillow

我一直试图将matplotlib的matshow功能等同于PIL图像。在这个过程中,我意识到我通过应用色彩图生成的颜色总是比数学显示版本中的颜色略红。

这是我编写的快速测试代码,用于测试和验证方案:

import matplotlib
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image

data = np.ones((5,5))*0.5
cmap = matplotlib.cm.jet

#generate PIL image
m = matplotlib.cm.ScalarMappable(norm=None, cmap=cmap)
colormapped = m.to_rgba(data)*255
print(colormapped)
outputImage = Image.fromarray(np.uint8(colormapped))
outputImage.show()
print(list(outputImage.getdata()))

#generate matplotlib figure
fig = plt.figure()
ax = fig.add_axes((0,0,1,1))
ax.set_axis_off()
ax.matshow(data, cmap=cmap)
plt.show()

数据是一个填充0.5的5x5矩阵,根据喷射色图,应该会产生纯蓝色的图像。

当我打印出由to_rgba()函数和Image.getdata()函数生成的矩阵时,我得到所需的值(0,0,127.5)。但是,当我显示图像(或将其保存为.png)时,PIL版本为" redder"根据MS Paint(并在Photoshop上验证),matshow版本具有所需的值(0,0,127),而PIL版本的值为(31,0,111)。

我认为这与PIL /枕头渲染图像的方式有关。但是,我该如何解决这个问题呢?布鲁斯需要保持蓝色! (绿色通道也受到影响,但距离不远 - 例如,(136,136,136)变为(145,134,116)

我在Win8 x64上的Anaconda 2.0.1下的Python 3.4.1上执行此操作。以下是我使用的软件包版本: numpy:1.9.1 枕头:2.5.1 matplotlib:1.4.2

1 个答案:

答案 0 :(得分:0)

如果没有PIL的“outputImage.show()”,保存为PNG时图像似乎可以正确呈现。视觉输出不正确,在显示视觉输出后保存时,保存的图像反映原始输出呈现的内容。

此外,我只能使用PIL 2.5.1在Python 3.4.1下的Win8机器上重现此问题。在带有PIL 1.1.7的Win8中的Python 2.7.9中,使用show()命令时显示的图像无法渲染(它一直说文件丢失)并且保存的图像被正确着色。