【问题标题】:How to convert a NumPy array to PIL image applying matplotlib colormap如何将 NumPy 数组转换为应用 matplotlib 颜色图的 PIL 图像
【发布时间】:2012-06-13 11:47:15
【问题描述】:

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

我想获取一个表示灰度图像的 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)

【问题讨论】:

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


【解决方案1】:

相当繁忙的单线,但这里是:

  1. 首先确保您的 NumPy 数组 myarray 使用最大值 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))

plt.savefig():

im.save():

【讨论】:

  • “将颜色图直接应用于myarray”部分直击人心!我不知道这是可能的,谢谢!
  • 研究有关 LinearSegmentedColormap 的文档(其中 cm.gist_earth 是一个实例),我发现可以使用已经将其转换为 uint8 的“字节”参数来调用它。然后,单线变得安静了很多:im = Image.fromarray(cm.gist_earth(myarray, bytes=True))
  • @CiprianTomoiaga,数组的形状应该是你想要的图像尺寸。例如,VGA 图像将从形状为 (1024,768) 的数组生成。您应该注意到这适用于单色图像。这很重要,因为通常当您将 RGB 图像转换为数组时,它的形状例如是 (1024,768,3),因为它具有三个通道。
  • 我收到错误NameError: name 'cm' is not defined
  • @mso from matplotlib import cm
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:
    • 输入 = 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')
      

    【讨论】:

    • 希望它能解决问题,但请添加对代码的解释,以便用户完全理解他/她真正想要的。
    • 好,更新的答案。以前的都是几年前的。
    • 完美答案!
    猜你喜欢
    • 1970-01-01
    • 2010-09-27
    • 2017-06-25
    • 2019-11-29
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多