如何使用matplotlib色彩映射将Numpy数组转换为PIL图像

时间:2012-06-09 23:48:27

标签: python numpy matplotlib python-imaging-library color-mapping

我有一个简单的问题,但找不到合适的解决方案。

我想拍摄一个代表灰度图像的numpy二维数组,并在应用一些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)

感谢阅读!

3 个答案:

答案 0 :(得分:154)

相当繁忙的一个班轮,但现在是:

  1. 首先确保您的numpy数组myarray使用1.0处的最大值进行标准化。
  2. 将色彩映射直接应用于myarray
  3. 重新调整为0-255范围。
  4. 使用np.uint8()转换为整数。
  5. 使用Image.fromarray()
  6. 你已经完成了:

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

    plt.savefig()

    enter image description here

    im.save()

    enter image description here

答案 1 :(得分:21)

  • input = 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 :(得分:1)

即使应用了注释中提到的更改,接受的答案中描述的方法对我也不起作用。但是下面的简单代码行得通

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

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