142

我刚刚使用 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

4 回答 4

169

已处理有关文件扩展名的错误,您可以使用BMP(不带点)或传递带有扩展名的输出名称。现在要处理错误,您需要正确修改频域中的数据以保存为整数图像,PIL告诉您它不接受浮点数据以保存为 BMP。

这是一个建议(有其他小的修改,比如使用fftshiftandnumpy.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')
于 2013-01-23T03:42:52.343 回答
36

您应该能够简单地让 PIL 从扩展名中获取文件类型,即使用:

j.save("C:/Users/User/Desktop/mesh_trans.bmp")
于 2013-01-22T06:48:02.653 回答
6

尝试删除.之前的.bmp(它BMP与预期不匹配)。正如您从错误中看到的那样,您提供的save_handler是大写的format,然后在SAVE. 但是,该对象中的相应键是BMP(而不是.BMP)。

我不太了解PIL,但从一些快速搜索来看,似乎是mode图像的问题。将定义更改j为:

j = Image.fromarray(b, mode='RGB')

似乎对我有用(但请注意,我对此知之甚少PIL,所以我建议使用@mmgp 的解决方案,因为她/他清楚地知道他们在做什么:))。对于 的类型mode,我使用了这个页面——希望那里的选择之一对你有用。

于 2013-01-22T06:33:35.870 回答
4

我知道这很旧,但我发现(在使用 Pillow 时)通过使用打开文件open(fp, 'w')然后保存文件将起作用。例如:

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

fp当然是文件路径。

于 2017-05-10T14:46:31.807 回答