Подтвердить что ты не робот

Как преобразовать массив Numpy в изображение PIL с использованием matplotlib colormap

У меня есть простая проблема, но я не могу найти хорошее решение.

Я хочу взять многомерный 2D-массив, который представляет изображение в градациях серого и преобразовать его в изображение RGB PIL, применяя некоторые цветовые карты matplotlib.

Я могу получить разумный вывод PNG с помощью команды pyplot.figure.figimage:

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)

Спасибо за чтение!

4b9b3361

Ответ 1

Довольно занят один лайнер, но вот он:

  1. Во-первых, убедитесь, что ваш массивный массив myarray нормализован с максимальным значением 1.0.
  2. Примените myarray цветов непосредственно к 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():

enter image description here

с im.save():

enter image description here

Ответ 2

Метод, описанный в принятом ответе, не работал для меня даже после применения изменений, упомянутых в его комментариях. Но ниже простой код работал

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

np_array может быть либо 2D-массивом со значениями от 0..1 float o2 0..255 uint8, и в этом случае ему нужен cmap. Для трехмерных массивов cmap будет игнорироваться.