web-dev-qa-db-fra.com

Comment puis-je enregistrer une image avec PIL?

Je viens d'effectuer un traitement d'image à l'aide de la bibliothèque d'images Python (PIL) à l'aide d'un message que j'ai trouvé précédemment pour effectuer des transformations d'image de Fourier et je ne parviens pas à faire fonctionner la fonction de sauvegarde. Tout le code fonctionne bien mais cela ne sauvegardera pas l'image résultante:

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")

L'erreur que je reçois est la suivante:

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

Comment enregistrer une image avec Pythons PIL?

96
user1999274

L'erreur concernant l'extension de fichier a été gérée, vous utilisez soit bmp (sans le point), soit transmettez déjà le nom de sortie avec l'extension. Maintenant, pour gérer l’erreur, vous devez modifier correctement vos données dans le domaine fréquentiel afin de les enregistrer sous la forme d’une image entière. PIL vous indique qu’il n’accepte pas les données flottantes à enregistrer en bmp.

Voici une suggestion (avec d’autres modifications mineures, comme l’utilisation de fftshift et numpy.array au lieu de numpy.asarray) pour effectuer la conversion pour une visualisation correcte:

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')
119
mmgp

Vous devriez pouvoir laisser simplement PIL obtenir le type de fichier à partir d’une extension, c’est-à-dire utiliser:

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

Essayez de supprimer le . avant le .bmp (il ne correspond pas à BMP comme prévu). Comme vous pouvez le constater, le save_handler est supérieur au format que vous avez fourni, puis recherche une correspondance dans SAVE. Cependant, la clé correspondante dans cet objet est BMP (au lieu de .BMP).

Je ne connais pas grand chose à propos de PIL, mais d'après certaines recherches rapides, il semble que c'est un problème avec le mode de l'image. Changer la définition de j en:

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

Cela semblait fonctionner pour moi (à noter toutefois que je connais très peu de PIL, je vous suggère donc d'utiliser la solution de @ mmgp car il sait clairement ce qu'il fait :)). Pour les types de mode, j'ai utilisé this page - j'espère que l'un des choix disponibles fonctionnera pour vous.

6
RocketDonkey

Je sais que c'est vieux, mais j'ai constaté que (lors de l'utilisation de Pillow), ouvrir le fichier en utilisant open(fp, 'w') puis en enregistrant le fichier fonctionnera. Par exemple:

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

fp étant le chemin du fichier, bien sûr.

4
necko