it-swarm.com.de

Wie kann ich ein Bild mit PIL speichern?

Ich habe gerade einige Bildbearbeitungen mit der Python= Bildbibliothek (PIL) mit einem Beitrag durchgeführt, den ich zuvor gefunden habe, um Fourier-Transformationen von Bildern durchzuführen, und ich kann die Speicherfunktion nicht zum Funktionieren bringen Code funktioniert einwandfrei, speichert aber das resultierende Bild nicht:

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

Der Fehler, den ich erhalte, ist der folgende:

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

Wie kann ich mit Pythons PIL ein Bild speichern?

96
user1999274

Der Fehler bezüglich der Dateierweiterung wurde behoben. Verwenden Sie entweder bmp (ohne Punkt) oder übergeben Sie den Ausgabenamen bereits mit der Erweiterung. Um den Fehler zu beheben, müssen Sie Ihre Daten in der Frequenzdomäne ordnungsgemäß ändern, damit sie als Ganzzahlbild gespeichert werden. PIL weist Sie darauf hin, dass keine Float-Daten zum Speichern als BMP akzeptiert werden.

Hier ist ein Vorschlag (mit anderen geringfügigen Änderungen, wie der Verwendung von fftshift und numpy.array anstatt numpy.asarray) für die Konvertierung zur korrekten Visualisierung:

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

Sie sollten in der Lage sein, PIL einfach den Dateityp von der Erweiterung abrufen zu lassen, d. H.

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

Entfernen Sie das . Vor dem .bmp (es stimmt nicht wie erwartet mit BMP überein). Wie Sie aus dem Fehler ersehen können, ist der save_handler steht für das format, das Sie angegeben haben, und sucht dann nach einer Übereinstimmung in SAVE. Der entsprechende Schlüssel in diesem Objekt ist jedoch BMP (anstelle von .BMP).

Ich weiß nicht viel über PIL, aber von einigen schnellen Suchen scheint es, dass es ein Problem mit dem mode des Bildes ist. Ändern der Definition von j in:

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

Schien für mich zu arbeiten (beachte jedoch, dass ich nur sehr wenige Kenntnisse über PIL habe, daher würde ich die Verwendung der @ mmgp-Lösung empfehlen, da er/sie genau weiß, was sie tun :)). Für die Arten von mode habe ich this page verwendet - hoffentlich funktioniert eine der Auswahlmöglichkeiten für Sie.

6
RocketDonkey

Ich weiß, dass dies alt ist, aber ich habe festgestellt, dass (bei Verwendung von Pillow) das Öffnen der Datei mit open(fp, 'w') und das anschließende Speichern der Datei funktionieren. Z.B:

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

fp ist natürlich der Dateipfad.

4
necko