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