2015-07-21 1 views
9

У меня есть массив (n, m), который я визуализировал с помощью matplotlib.pyplot.imshow. Я хотел бы сохранить эти данные в некотором типе растровых графических файлов (например, PNG), так что:Сохранение imshow-like изображения при сохранении разрешения

  1. Цвета являются те, которые отображаются с imshow
  2. Каждый элемент массива подстилающей точно один пиксель в сохраненном изображении - это означает, что если базовый массив является (n, m) элементами, то изображение NxM пикселей. (Меня не интересует interpolation='nearest' в imshow.)
  3. В сохраненном изображении нет ничего, кроме пикселей, соответствующих данным в массиве. (Например, нет белого пространства вокруг краев, осей и т. Д.)

Как это сделать?

Я видел код, способный сделать это, используя interpolation='nearest' и заставляя matplotlib (неохотно) отключать оси, пробелы и т. Д. Однако должен быть какой-то способ сделать это более непосредственно - возможно, с PIL? В конце концов, у меня есть основные данные. Если я могу получить значение RGB для каждого элемента базового массива, тогда я могу сохранить его с помощью PIL. Есть ли способ извлечь данные RGB из imshow? Я могу написать свой собственный код для сопоставления значений массива с значениями RGB, но я не хочу изобретать колесо, поскольку эта функция уже существует в matplotlib.

ответ

13

Как вы уже догадались, нет необходимости создавать фигуру. Вам в основном нужны три шага. Нормализуйте свои данные, примените цветовой код, сохраните изображение. Matplotlib предоставляет все необходимые функциональные возможности:

import numpy as np 
import matplotlib.pyplot as plt 

# some data (512x512) 
import scipy.misc 
data = scipy.misc.lena() 

# a colormap and a normalization instance 
cmap = plt.cm.jet 
norm = plt.Normalize(vmin=data.min(), vmax=data.max()) 

# map the normalized data to colors 
# image is now RGBA (512x512x4) 
image = cmap(norm(data)) 

# save the image 
plt.imsave('test.png', image) 

Хотя код выше объясняет отдельные шаги, вы можете также позволить imsave сделать все три этапа (по аналогии с imshow):

plt.imsave('test.png', data, cmap=cmap) 

Результат (test.png):

enter image description here

+2

Благодарим вас за разъяснение всех этапов. Я могу использовать 'LogNorm' вместо' Normalize', а 'imshow' может принимать функцию нормализации в качестве аргумента, тогда как' imsave', по-видимому, не может. Однако ваше объяснение позволит мне обойти это ограничение. – lnmaurer