如何将 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') -> 转换为 RGBImage.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 图像的主要内容,如果未能解决你的问题,请参考以下文章