142 votes

Comment puis-je sauvegarder une image avec le LIP ?

Je viens de faire un peu de traitement d'image en utilisant la bibliothèque d'image Python (PIL) en utilisant un post que j'ai trouvé plus tôt pour effectuer des transformées de Fourier d'images et je n'arrive pas à faire fonctionner la fonction de sauvegarde. L'ensemble du code fonctionne bien mais l'image résultante n'est pas enregistrée :

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 puis-je sauvegarder une image avec Pythons PIL ?

169voto

mmgp Points 9153

L'erreur concernant l'extension du fichier a été traitée, vous utilisez soit BMP (sans le point) ou passez le nom de la sortie avec l'extension déjà existante. Maintenant, pour gérer l'erreur, vous devez modifier correctement vos données dans le domaine de la fréquence pour les enregistrer sous forme d'image entière, PIL vous dit qu'il n'accepte pas les données flottantes pour l'enregistrement en BMP.

Voici une suggestion (avec d'autres modifications mineures, comme l'utilisation de fftshift y numpy.array au lieu de numpy.asarray ) pour faire 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')

37voto

wim Points 35274

Vous devriez pouvoir laisser PIL obtenir le type de fichier à partir de l'extension, c'est-à-dire utiliser :

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

6voto

RocketDonkey Points 16205

Essayez de retirer le . avant le .bmp (il ne s'agit pas d'une correspondance BMP comme prévu). Comme vous pouvez le voir dans l'erreur, le save_handler c'est la mise en majuscule de la format que vous avez fourni, puis en recherchant une correspondance dans SAVE . Cependant, la clé correspondante dans cet objet est BMP (au lieu de .BMP ).

Je ne sais pas grand-chose sur PIL mais d'après une recherche rapide, il semble que ce soit un problème avec le système d'exploitation de l'entreprise. mode de l'image. Changer la définition de j à :

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

Cela a semblé fonctionner pour moi (notez toutefois que je n'ai que très peu de connaissances en matière d'environnement). PIL Je suggère donc d'utiliser la solution de @mmgp qui sait clairement ce qu'il fait :) ). Pour les types de mode J'ai utilisé este Nous espérons que l'un des choix proposés vous conviendra.

4voto

necko Points 556

Je sais que c'est vieux, mais j'ai trouvé que (en utilisant Pillow) l'ouverture du fichier en utilisant open(fp, 'w') et ensuite enregistrer le fichier fonctionnera. Par exemple

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X