如何转换一个NumPy数组到PIL图像应用matplotlib色彩

我有一个简单的问题,但我找不到一个好的解决办法。

我想取一个NumPy 2D数组,它表示灰度图像,并将其转换为RGB PIL图像,同时应用一些matplotlib颜色地图。

我可以通过使用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)
466235 次浏览

这是一个非常繁忙的单行语句,但它是这样的:

  1. 首先确保你的NumPy数组myarray1.0处用最大值归一化。
  2. 将颜色映射直接应用到myarray
  3. 重新缩放到0-255范围。
  4. 使用np.uint8()转换为整数。
  5. 使用Image.fromarray()

这样就完成了:

from PIL import Image
from matplotlib import cm
im = Image.fromarray(np.uint8(cm.gist_earth(myarray)*255))

plt.savefig():

Enter image description here

im.save():

Enter image description here

在已接受的答案中描述的方法,即使在应用其评论中提到的更改后,也不适合我。但下面的简单代码是可行的:

import matplotlib.pyplot as plt
plt.imsave(filename, np_array, cmap='Greys')

np_array可以是一个2D数组,其值为0..1浮o2 0..255 uint8,在这种情况下,它需要cmap。对于3D数组,cmap将被忽略。

  • input = numpy_image

  • < p > np。uint8→转换为整数

  • < p >转换(RGB)→转换为RGB

  • < p > 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')