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?
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')
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")
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.
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.