我刚刚使用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保存图像?
答案 0 :(得分:111)
已处理有关文件扩展名的错误,您可以使用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')
答案 1 :(得分:25)
你应该能够简单地让PIL从扩展名中获取文件类型,即使用:
j.save("C:/Users/User/Desktop/mesh_trans.bmp")
答案 2 :(得分:6)
尝试删除.
之前的.bmp
(它与预期的BMP
不匹配)。正如您从错误中看到的那样,save_handler
是您提供的format
的上限,然后在SAVE
中查找匹配项。但是,该对象中的相应键是BMP
(而不是.BMP
)。
我对PIL
并不是很了解,但是从一些快速搜索来看,这似乎与图像的mode
有关。将j
的定义更改为:
j = Image.fromarray(b, mode='RGB')
似乎为我工作(但请注意,我对PIL
知之甚少,所以我建议使用@mmgp的解决方案,因为他/她清楚地知道他们在做什么:))。对于mode
的类型,我使用了this页面 - 希望其中一个选项适合您。
答案 3 :(得分:4)
我知道这是旧的,但我发现(使用Pillow时)使用open(fp, 'w')
打开文件,然后保存文件将起作用。 E.g:
with open(fp, 'w') as f:
result.save(f)
fp
当然是文件路径。