Как я могу Сохранить Изображение с помощью 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   65  

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, я этой страницы - надеюсь, один из вариантов будет работать для вас.

Я знаю, что это старый, но я нашел, что (при использовании подушки) открытие файла с помощью open(fp, 'w') и тогда сохранение файла будет работать. Например:

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

fp быть путь к файлу, конечно.