220

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

我想采用代表灰度图像的 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')

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

colored_PIL_image = magic_function(array, cmap)
4

3 回答 3

319

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

  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()

在此处输入图像描述

于 2012-06-10T08:55:47.260 回答
58
  • 输入 = 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')
    
于 2020-06-02T03:29:42.393 回答
11

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

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

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

于 2019-04-16T09:58:02.303 回答