如何将 NumPy 数组转换为应用 matplotlib 颜色图的 PIL 图像

Posted

技术标签:

【中文标题】如何将 NumPy 数组转换为应用 matplotlib 颜色图的 PIL 图像【英文标题】:How to convert a NumPy array to PIL image applying matplotlib colormap 【发布时间】: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)

【问题讨论】:

完整的工作代码,你可以参考:Is there any good color map to convert gray-scale image to colorful ones using python's PIL? 【参考方案1】:

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

    首先确保您的 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():

【讨论】:

“将颜色图直接应用于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')

【讨论】:

希望它能解决问题,但请添加对代码的解释,以便用户完全理解他/她真正想要的。 好,更新的答案。以前的都是几年前的。 完美答案!

以上是关于如何将 NumPy 数组转换为应用 matplotlib 颜色图的 PIL 图像的主要内容,如果未能解决你的问题,请参考以下文章

如何将 numpy 数组列表转换为单个 numpy 数组?

如何将numpy数组列表转换为numpy数组

如何将 2D float numpy 数组转换为 2D int numpy 数组?

如何将 PIL 图像转换为 numpy 数组?

如何将csv文件转换为numpy数组格式?

如何将 Numpy 数组转换为 Panda DataFrame