Отображать массив как растровое изображение в python

У меня есть массив numpy в Python, и я хотел бы отображать его на экране в виде растрового изображения. Каков самый простой способ сделать это? Он не должен быть особенно причудливым или иметь приятный интерфейс, все, что мне нужно сделать, это отобразить содержимое массива в виде растрового изображения в шкале серого.

Я пытаюсь перевести некоторый код моего IDL на Python с помощью NumPy и в основном ищут замену команд tv и tvscl в IDL.

Ответ 1

В зависимости от ваших потребностей, matplotlib imshow или glumpy, вероятно, лучшие варианты.

Matplotlib бесконечно более гибкий, но медленнее (анимация в matplotlib может быть чрезвычайно ресурсоемкой, даже когда вы все делаете правильно). Тем не менее, у вас будет действительно замечательная полнофункциональная библиотека графиков в вашем распоряжении.

Glumpy отлично подходит для быстрого отображения на основе OpenGL и анимации массива 2D numpy, но гораздо более ограничен в том, что он делает. Если вам нужно оживить серию изображений или отображать данные в реальном времени, это гораздо лучший вариант, чем matplotlib.

Использование matplotlib (используя API-интерфейс pyplot вместо pylab):

import matplotlib.pyplot as plt
import numpy as np

# Generate some data...
x, y = np.meshgrid(np.linspace(-2,2,200), np.linspace(-2,2,200))
x, y = x - x.mean(), y - y.mean()
z = x * np.exp(-x**2 - y**2)

# Plot the grid
plt.imshow(z)
plt.gray()
plt.show()

Использование glumpy:

import glumpy
import numpy as np

# Generate some data...
x, y = np.meshgrid(np.linspace(-2,2,200), np.linspace(-2,2,200))
x, y = x - x.mean(), y - y.mean()
z = x * np.exp(-x**2 - y**2)

window = glumpy.Window(512, 512)
im = glumpy.Image(z.astype(np.float32), cmap=glumpy.colormap.Grey)

@window.event
def on_draw():
    im.blit(0, 0, window.width, window.height)
window.mainloop()

Ответ 2

Используя ipython в интерактивном режиме pylab, вы можете сделать:

$ ipython pylab
In [1]: imshow(your_array)

или не в режиме pylab:

$ ipython
In [1]: from pylab import *
In [2]: imshow(your_array)
In [3]: pylab.show()

или без объекта пространства имен pylab:

$ ipython
In [1]: import matplotlib.pyplot as pyplot
In [2]: pyplot.imshow(your_array)
In [3]: pyplot.show()

Ответ 3

Быстрое добавление: для отображения с помощью matplotlib, если вы хотите, чтобы изображение отображалось "растровое", то есть пикселированное без сглаживания, тогда вы должны включить опцию интерполяции = "ближайший" в вызове imshow.