如何使用PIL保存图像?

use*_*274 103 python save python-imaging-library

我刚刚使用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")
Run Code Online (Sandbox Code Playgroud)

我得到的错误如下:

save_handler = SAVE[string.upper(format)] # unknown format
    KeyError: '.BMP'
Run Code Online (Sandbox Code Playgroud)

如何使用Pythons PIL保存图像?

mmg*_*mgp 126

已经处理了有关文件扩展名的错误,您可以使用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')
Run Code Online (Sandbox Code Playgroud)


wim*_*wim 27

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

j.save("C:/Users/User/Desktop/mesh_trans.bmp")
Run Code Online (Sandbox Code Playgroud)

  • 是的,您应该将数组转换为“numpy.uint8”数据类型而不是浮点数。 (2认同)

Roc*_*key 6

尝试删除.之前.bmp(它没有BMP按预期匹配).正如您从错误中看到的那样,您提供的save_handler是上限format,然后寻找匹配SAVE.但是,该对象中的相应键是BMP(而不是.BMP).

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

j = Image.fromarray(b, mode='RGB')
Run Code Online (Sandbox Code Playgroud)

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