2010-04-17 21 views
109

he creado una matriz de esta manera:¿Cómo convierto una matriz numpy a (y visualizo) una imagen?

import numpy as np 
data = np.zeros((512,512,3), dtype=np.uint8) 
data[256,256] = [255,0,0] 

Lo que yo quiero esto que hacer es mostrar un único punto rojo en el centro de una imagen de 512x512. (Al menos para empezar ... Creo que puedo averiguar el resto a partir de ahí)

+1

Véase también http://stackoverflow.com/questions/902761/saving-a-numpy-array-as- una imagen, aunque esa impuso la restricción de que PIL no podría ser utilizado. –

Respuesta

96

Se podría utilizar para crear PIL (y pantalla) de una imagen:

from PIL import Image 
import numpy as np 

w, h = 512, 512 
data = np.zeros((h, w, 3), dtype=np.uint8) 
data[256, 256] = [255, 0, 0] 
img = Image.fromarray(data, 'RGB') 
img.save('my.png') 
img.show() 
+0

Esto funciona maravillosamente. Gracias. – jlswint

+2

Parece que hay un error. Usted crea una matriz con el tamaño '(w, h, 3)', pero debe ser '(h, w, 3)', porque la indexación en PIL difiere de la indización en numpy. Hay una pregunta relacionada: http: // stackoverflow.com/questions/33725237/image-fromarray-changes-size – user502144

+0

@ user502144: Gracias por señalar mi error. Debería haber creado una matriz de forma '(h, w, 3)'. (Ahora está arreglado, arriba.) La longitud del primer eje se puede considerar como el número de filas en el conjunto y la longitud del segundo eje, el número de columnas. Entonces '(h, w)' corresponde a una matriz de "altura" 'h' y" ancho "' w'. 'Image.fromarray' convierte esta matriz en una imagen de altura' h' y ancho 'w'. – unutbu

0

Usando pygame, puede abrir una ventana, obtener la superficie como una matriz de píxeles y manipular como desee desde allí. Sin embargo, tendrá que copiar su matriz numpy en la matriz de superficie, que será mucho más lenta que realizar operaciones gráficas reales en las propias superficies de los pygames.

40

ruta más corta es utilizar scipy, así:

from scipy.misc import toimage 
toimage(data).show() 

Esto también requiere que se instale PIL o Pillow.

Un enfoque similar también requiere PIL o almohada pero que puede invocar un visor diferente es:

from scipy.misc import imshow 
imshow(data) 
+0

¿Entonces este método es incompatible con Python 3.5 ...? – bordeo

+0

@bordeo, ¿por qué sería incompatible con 3.5? Es solo una importación y un par de llamadas a funciones. –

+0

PIL es incompatible con 3.5 (no se instalará) – bordeo

145

¿Usted acaba de decir esto?

from matplotlib import pyplot as plt 
plt.imshow(data, interpolation='nearest') 
plt.show() 
+2

Esto es más exacto que PIL. PIL vuelve a escalar/normaliza los valores de la matriz, mientras que pyplot usa los valores RGB reales tal como están. – GaryO

+2

Gracias! merecer la insignia de la mejor respuesta! –

+9

Quizás sea bueno saberlo: si desea visualizar imágenes en escala de grises, es aconsejable llamar a 'plt.gray()' una vez en su código para cambiar todos los gráficos siguientes a escala de grises. No es lo que el OP quiere, pero es bueno saberlo. – Cerno

Cuestiones relacionadas