¿Cómo puedo guardar una imagen con PIL?

Acabo de hacer un procesamiento de imágenes utilizando la biblioteca de imágenes de Python (PIL) utilizando una publicación que encontré anteriormente para realizar transformaciones de imágenes de Fourier y no puedo hacer que funcione la función de guardar. El código completo funciona bien, pero simplemente no guarda la imagen resultante:

from PIL import Image import numpy as np i = Image.open("C:/Users/User/Desktop/mesh.bmp") i = i.convert("L") a = np.asarray(i) b = np.abs(np.fft.rfft2(a)) j = Image.fromarray(b) j.save("C:/Users/User/Desktop/mesh_trans",".bmp") 

El error que recibo es el siguiente:

 save_handler = SAVE[string.upper(format)] # unknown format KeyError: '.BMP' 

¿Cómo puedo guardar una imagen con Pythons PIL?

El error con respecto a la extensión del archivo se ha manejado, o bien usa bmp (sin el punto), o pasa el nombre de salida con la extensión ya. Ahora para manejar el error que necesita para modificar correctamente sus datos en el dominio de frecuencia para guardarlos como una imagen entera, PIL está diciendo que no acepta datos flotantes para guardar como bmp.

Aquí hay una sugerencia (con otras modificaciones menores, como usar fftshift y numpy.array lugar de numpy.asarray ) para hacer la conversión para una visualización adecuada:

 import sys import numpy from PIL import Image img = Image.open(sys.argv[1]).convert('L') im = numpy.array(img) fft_mag = numpy.abs(numpy.fft.fftshift(numpy.fft.fft2(im))) visual = numpy.log(fft_mag) visual = (visual - visual.min()) / (visual.max() - visual.min()) result = Image.fromarray((visual * 255).astype(numpy.uint8)) result.save('out.bmp') 

Debería poder simplemente dejar que PIL obtenga el tipo de archivo de la extensión, es decir, usar:

 j.save("C:/Users/User/Desktop/mesh_trans.bmp") 

Intenta quitar el . antes de .bmp (no coincide con BMP como se esperaba). Como puede ver en el error, save_handler está en mayúsculas en el format que proporcionó y luego busca una coincidencia en SAVE . Sin embargo, la clave correspondiente en ese objeto es BMP (en lugar de .BMP ).

No sé mucho acerca de PIL , pero a partir de una búsqueda rápida, parece que es un problema con el mode de la imagen. Cambiando la definición de j a:

 j = Image.fromarray(b, mode='RGB') 

Parecía funcionar para mí (sin embargo, tenga en cuenta que tengo muy poco conocimiento de PIL , por lo que sugeriría usar la solución de @ mmgp, ya que él / ella sabe claramente lo que están haciendo :)). Para los tipos de mode , utilicé esta página; es de esperar que una de las opciones allí funcione para usted.

Sé que esto es antiguo, pero he encontrado que (mientras uso Pillow) abrir el archivo utilizando open(fp, 'w') y luego guardar el archivo funcionará. P.ej:

 with open(fp, 'w') as f: result.save(f) 

siendo fp la ruta del archivo, por supuesto.