Подтвердить что ты не робот

Как сохранить изображение с помощью 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?

4b9b3361

Ответ 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 - путь к файлу, конечно. (Это с подушкой)