Convertir una matriz de numpy 2D de valores de escala de grises en una imagen PIL

Supongamos que tengo una matriz de valores Numpy 2D en el rango de 0 a 1, que representa una imagen en escala de grises. ¿Cómo luego convierto esto en un objeto de imagen PIL? Todos los bashs hasta ahora han producido píxeles dispersos extremadamente extraños o imágenes en negro.

for x in range(image.shape[0]): for y in range(image.shape[1]): image[y][x] = numpy.uint8(255 * (image[x][y] - min) / (max - min)) #Create a PIL image. img = Image.fromarray(image, 'L') 

En el código anterior, la imagen de la matriz numpy está normalizada por (imagen [x] [y] – min) / (max – min), por lo que cada valor está en el rango de 0 a 1. Luego se multiplica por 255 y se convierte en un Entero de 8 bits. En teoría, esto debería procesarse a través de Image.fromarray con el modo L en una imagen en escala de grises, pero el resultado es un conjunto de píxeles blancos dispersos.

Creo que la respuesta es incorrecta. La función Image.fromarray (____, ‘L’) parece funcionar solo correctamente con una matriz de enteros entre 0 y 255. Para esto, uso la función np.uint8.

Puedes ver esto demostrado si intentas hacer un gradiente.

 import numpy as np from PIL import Image # gradient between 0 and 1 for 256*256 array = np.linspace(0,1,256*256) # reshape to 2d mat = np.reshape(array,(256,256)) # Creates PIL image img = Image.fromarray(np.uint8(mat * 255) , 'L') img.show() 

Hace un gradiente limpio

vs

 import numpy as np from PIL import Image # gradient between 0 and 1 for 256*256 array = np.linspace(0,1,256*256) # reshape to 2d mat = np.reshape(array,(256,256)) # Creates PIL image img = Image.fromarray( mat , 'L') img.show() 

Tiene el mismo tipo de artefactos.

Si entendí tu pregunta, quieres obtener una imagen en escala de grises usando PIL.

Si este es el caso, no necesita multiplicar cada píxel por 255.

Lo siguiente me funcionó.

 import numpy as np from PIL import Image # Creates a random image 100*100 pixels mat = np.random.random((100,100)) # Creates PIL image img = Image.fromarray(mat, 'L') img.show()