问题:如何使用PIL保存图像?
我刚刚使用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'
如何使用Pythons PIL保存图像?
回答 0
解决了与文件扩展名有关的错误,您可以使用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
您应该能够简单地让PIL从扩展名中获取文件类型,即使用:
j.save("C:/Users/User/Desktop/mesh_trans.bmp")
回答 2
尝试删除.
之前的.bmp
(它BMP
与预期的不匹配)。正如您从错误中看到的那样,save_handler
就是format
您提供的大写字母,然后在中寻找匹配项SAVE
。但是,该对象中的对应键为BMP
(而不是.BMP
)。
我不太了解PIL
,但是通过一些快速搜索,似乎mode
图像的问题。将的定义更改j
为:
j = Image.fromarray(b, mode='RGB')
似乎为我工作(但是请注意,我对的了解很少PIL
,因此我建议使用@mmgp的解决方案,因为他/她清楚地知道他们在做什么:)))。对于的类型mode
,我使用了此页面-希望那里的一种选择适合您。
回答 3
我知道这很旧,但是我发现(在使用Pillow的同时)通过使用open(fp, 'w')
然后保存文件来打开文件是可行的。例如:
with open(fp, 'w') as f:
result.save(f)
fp
当然是文件路径。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。