如何用PIL保存图像?

2021-01-26 06:13:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚刚使用Python图像库(PIL)做了一些图像处理,使用我之前找到的一篇文章来执行图像的傅立叶变换,但是我无法让save函数工作。整个代码运行良好,但它不会保存结果图像:

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'

我怎样才能用Python皮保存图像?

3条回答
网友
1楼 ·

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

j.save("C:/Users/User/Desktop/mesh_trans.bmp")
网友
2楼 ·

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

这里有一个建议(通过其他一些小的修改,比如使用fftshiftnumpy.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')
网友
3楼 ·

尝试在.bmp之前删除.(它与预期的BMP不匹配)。从错误中可以看到,save_handler是您提供的format的上框,然后在SAVE中查找匹配项。但是,该对象中对应的键是BMP(而不是.BMP)。

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

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

似乎对我有用(但是请注意,我对PIL的知识非常少,所以我建议使用@mmgp的解决方案,因为他/她清楚地知道他们在做什么:))。对于mode的类型,我使用了this页面-希望其中一个选项对您有用。

相关问题