Как я могу Сохранить Изображение с помощью PIL?
Я только что сделал некоторую обработку изображений с помощью библиотеки изображений Python (PIL), используя сообщение, которое я нашел ранее для выполнения преобразований Фурье изображений, и я не могу заставить функцию сохранения работать. Весь код работает нормально, но он просто не будет сохранять полученное изображение:
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")
ошибка я получаю следующее:
save_handler = SAVE[string.upper(format)] # unknown format
KeyError: '.BMP'
Как я могу Сохранить Изображение с Pythons PIL?
4 ответа:
ошибка в отношении расширения файла была обработана, вы либо используете
bmp
(без точки), или передать имя вывода с расширением уже. Теперь для обработки ошибки вам нужно правильно изменить ваши данные в частотной области, чтобы сохранить их как целочисленное изображение,PIL
говорит вам, что он не принимает данные с плавающей точкой, чтобы сохранить как bmp.вот предложение (с другими незначительными изменениями, например, с помощью
fftshift
иnumpy.array
вместоnumpy.asarray
) для ведения преобразование для правильной визуализации: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')
вы должны быть в состоянии просто позволить PIL получить тип файла из расширения, т. е. использовать:
j.save("C:/Users/User/Desktop/mesh_trans.bmp")
Попробуйте удалить
.
до.bmp
(это не соответствуетBMP
как и ожидалось). Как вы можете видеть из ошибокsave_handler
это верхний корпусformat
вы предоставили, а затем ищете матч вSAVE
. Однако соответствующий ключ в этом объектеBMP
(вместо.BMP
).я мало что знаю о
PIL
, но из некоторых быстрых поисков вокруг кажется, что это проблема сmode
изображения. Изменение определенияj
to:j = Image.fromarray(b, mode='RGB')
казалось, работает для меня (однако обратите внимание, что я очень мало знаю о
PIL
, поэтому я бы предложил использовать решение @mmgp, поскольку он/она четко знает, что они делают :) ). Для типовmode
, я этой страницы - надеюсь, один из вариантов будет работать для вас.