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

hel*_*ker 108 python numpy matplotlib color-mapping python-imaging-library

我有一个简单的问题,但无法找到一个好的解决方案.

我想拍摄一个代表灰度图像的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')
Run Code Online (Sandbox Code Playgroud)

虽然我可以调整它以获得我想要的东西(可能使用StringIO来获取PIL图像),我想知道是否有更简单的方法来做到这一点,因为它似乎是一个非常自然的图像可视化问题.让我们说,像这样:

colored_PIL_image = magic_function(array, cmap)
Run Code Online (Sandbox Code Playgroud)

谢谢阅读!

fra*_*xel 185

相当繁忙的一个班轮,但这里是:

  1. 首先确保你的numpy数组,myarray使用最大值at进行标准化1.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))
Run Code Online (Sandbox Code Playgroud)

plt.savefig():

在此输入图像描述

im.save():

在此输入图像描述

  • 研究有关LinearSegmentedColormap(cm.gist_earth是一个实例)的文档,我发现可以用"bytes"参数调用它,该参数已经将它转换为uint8.然后,单行程变得更安静:`im = Image.fromarray(cm.gist_earth(myarray,bytes = True))` (31认同)
  • @mso`来自matplotlib import cm` (10认同)
  • "将色彩映射直接应用于'myarray`"部分直接切入内心!我不知道有可能,谢谢! (7认同)
  • 我收到错误`NameError:name'cm'未定义` (5认同)
  • @CiprianTomoiaga,数组的形状应该是你想要的图像尺寸。例如,VGA 图像将从形状为 (1024,768) 的数组生成。您应该注意到这适用于单色图像。这很重要,因为通常当您将 RGB 图像转换为数组时,其形状为(1024,768,3),因为它具有三个通道。 (2认同)

Ara*_*_gn 42

  • 输入 = 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')
    
    Run Code Online (Sandbox Code Playgroud)

  • 希望它能解决问题,但请添加对代码的解释,以便用户能够完全理解他/她真正想要的内容。 (6认同)
  • 很好,更新了答案。前面的都是好几年前的了。 (2认同)
  • 在没有“RGB”参数的情况下对我来说效果很好,以保持相同的图像通道 (2认同)

Shi*_*hah 10

即使在应用其评论中提到的更改后,已接受答案中描述的方法对我也不起作用。但下面的简单代码有效:

import matplotlib.pyplot as plt
plt.imsave(filename, np_array, cmap='Greys')
Run Code Online (Sandbox Code Playgroud)

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