¿Cómo guardar una matriz como una imagen en escala de grises con matplotlib / numpy?

Estoy tratando de guardar una serie de dimensiones de 128×128 píxeles en una imagen en escala de grises. Simplemente pensé que la función pyplot.imsave haría el trabajo pero no lo es, de alguna manera convierte mi matriz en una imagen RGB. Intenté forzar el mapa de colores a gris durante la conversión, pero aunque la imagen guardada aparece en escala de grises, todavía tiene una dimensión de 128x128x4. Aquí hay un ejemplo de código que escribí para mostrar el comportamiento:

import numpy as np import matplotlib.pyplot as plt import matplotlib.image as mplimg from matplotlib import cm x_tot = 10e-3 nx = 128 x = np.arange(-x_tot/2, x_tot/2, x_tot/nx) [X, Y] = np.meshgrid(x,x) R = np.sqrt(X**2 + Y**2) diam = 5e-3 I = np.exp(-2*(2*R/diam)**4) plt.figure() plt.imshow(I, extent = [-x_tot/2, x_tot/2, -x_tot/2, x_tot/2]) print I.shape plt.imsave('image.png', I) I2 = plt.imread('image.png') print I2.shape mplimg.imsave('image2.png',np.uint8(I), cmap = cm.gray) testImg = plt.imread('image2.png') print testImg.shape 

En ambos casos los resultados de la función “imprimir” son (128,128,4).

¿Alguien puede explicar por qué la función imsave está creando esas dimensiones a pesar de que mi matriz de entrada es de un tipo de luminancia? Y, por supuesto, ¿alguien tiene una solución para guardar la matriz en un formato de escala de grises estándar?

¡Gracias!

Con PIL debería funcionar así.

 import Image I8 = (((I - I.min()) / (I.max() - I.min())) * 255.9).astype(np.uint8) img = Image.fromarray(I8) img.save("file.png") 

No quise usar PIL en mi código y, como se señaló en la pregunta, tuve el mismo problema con pyplot, donde incluso en escala de grises, el archivo se guarda en la matriz MxNx3.

Como la imagen real en el disco no era importante para mí, terminé escribiendo la matriz tal como estaba y volviéndola a leer “tal cual” utilizando los métodos de guardar y cargar de numpy:

 np.save("filename", image_matrix) 

Y:

 np.load("filename.npy")