问题:如何使用matplotlib颜色图将NumPy数组转换为PIL图像
我有一个简单的问题,但找不到很好的解决方案。
我想获取一个代表灰度图像的NumPy 2D数组,并在应用一些matplotlib颜色图时将其转换为RGB PIL图像。
我可以使用以下pyplot.figure.figimage
命令获得合理的PNG输出:
dpi = 100.0
w, h = myarray.shape[1]/dpi, myarray.shape[0]/dpi
fig = plt.figure(figsize=(w,h), dpi=dpi)
fig.figimage(sub, cmap=cm.gist_earth)
plt.savefig('out.png')
尽管我可以修改它以获取所需的东西(可能使用StringIO可以获取PIL图像),但我想知道是否没有一种更简单的方法可以这样做,因为这似乎是图像可视化的一个非常自然的问题。假设是这样的:
colored_PIL_image = magic_function(array, cmap)
回答 0
一行代码很忙,但是这里是:
- 首先,请确保您的NumPy数组
myarray
使用处的最大值进行了规范化1.0
。 - 将颜色表直接应用于
myarray
。 - 重新调整
0-255
范围。 - 使用转换为整数
np.uint8()
。 - 使用
Image.fromarray()
。
这样就完成了:
from PIL import Image
from matplotlib import cm
im = Image.fromarray(np.uint8(cm.gist_earth(myarray)*255))
与plt.savefig()
:
与im.save()
:
回答 1
- 输入= numpy_image
- np.unit8->转换为整数
- convert(’RGB’)->转换为RGB
Image.fromarray->返回图像对象
from PIL import Image import numpy as np PIL_image = Image.fromarray(np.uint8(numpy_image)).convert('RGB') PIL_image = Image.fromarray(numpy_image.astype('uint8'), 'RGB')
回答 2
即使应用了注释中提到的更改,接受的答案中描述的方法对我也不起作用。但是下面的简单代码有效:
import matplotlib.pyplot as plt
plt.imsave(filename, np_array, cmap='Greys')
np_array可以是2D数组,其值从0..1浮点型到o2 0..255 uint8,在这种情况下,它需要cmap。对于3D阵列,cmap将被忽略。