Acabo de hacer un procesamiento de imágenes usando la biblioteca de imágenes de Python (PIL) usando una publicación que encontré anteriormente para realizar transformaciones de Fourier de imágenes y no puedo hacer que la función de guardar funcione. Todo el código funciona bien, pero 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 obtengo es el siguiente:
save_handler = SAVE[string.upper(format)] # unknown format
KeyError: '.BMP'
¿Cómo puedo guardar una imagen con Pythons PIL?
fuente
fft2
lugar de,rfft2
ya que para datos discretos no veo el sentido de usar la última. El resto es puramente cosmético, es decir, no podría visualizar correctamente la transformada de Fourier sin aplicarle un factor logarítmico. Entonces, la normalización es para mantener las cosas simples para la conversión al rango [0, 255].visual = (visual - visual.min()) / (visual.max() - visual.min())
será predeterminado sivisual
no hay variación (poco probable, pero vale la pena detectarlo)Debería poder simplemente dejar que PIL obtenga el tipo de archivo de la extensión, es decir, use:
fuente
numpy.uint8
dtype en lugar de flotar.Intente eliminar el
.
antes del.bmp
(no coincideBMP
como se esperaba). Como puede ver en el error,save_handler
está en mayúsculas loformat
que proporcionó y luego está buscando una coincidencia enSAVE
. Sin embargo, la clave correspondiente en ese objeto esBMP
(en lugar de.BMP
).No sé mucho sobre
PIL
, pero por una búsqueda rápida, parece que es un problema conmode
la imagen. Cambiar la definición dej
a:Pareció funcionar para mí (sin embargo, tenga en cuenta que tengo muy poco conocimiento
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 demode
, utilicé esta página; con suerte, una de las opciones allí funcionará para usted.fuente
Sé que esto es antiguo, pero descubrí que (mientras usaba Pillow) abrir el archivo usando
open(fp, 'w')
y luego guardar el archivo funcionará. P.ej:fp
siendo la ruta del archivo, por supuesto.fuente
format
parámetro debe usarse si se usa un objeto de archivo ensave
. ¿No es esto necesario?