Как сохранить изображение с помощью 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?
Ответы
Ответ 1
Ошибка в отношении расширения файла, вы используете либо 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')
Ответ 2
Вы должны просто позволить PIL получить тип файла из расширения, т.е. использовать:
j.save("C:/Users/User/Desktop/mesh_trans.bmp")
Ответ 3
Попробуйте удалить .
до .bmp
(он не соответствует BMP
, как ожидалось). Как вы можете видеть из ошибки, save_handler
представляет собой верхний регистр format
, который вы предоставили, а затем ищет соответствие в SAVE
. Однако соответствующий ключ в этом объекте BMP
(вместо .bmp
).
Я не очень много знаю о PIL
, но из-за быстрого поиска вокруг это кажется проблемой с mode
изображения. Изменение определения j
на:
j = Image.fromarray(b, mode='RGB')
Казалось, что я работаю для меня (однако обратите внимание, что у меня мало знаний о PIL
, поэтому я бы предложил использовать решение @mmgp, поскольку он/она ясно знает, что они делают:)). Для типов mode
я использовал эту страницу - надеюсь, один из вариантов там будет работать для вас.
Ответ 4
Я знаю, что это старый, но я обнаружил, что открытие файла с помощью open(fp, 'w')
, а затем сохранение файла будет работать. Например:
j.save(open(fp, 'w'))
fp
- путь к файлу, конечно.
(Это с подушкой)