问题:如何使用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保存图像?
I have just done some image processing using the Python image library (PIL) using a post I found earlier to perform fourier transforms of images and I can’t get the save function to work. The whole code works fine but it just wont save the resulting image:
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")
The error I get is the following:
save_handler = SAVE[string.upper(format)] # unknown format
KeyError: '.BMP'
How can I save an image with 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')
The error regarding the file extension has been handled, you either use BMP
(without the dot) or pass the output name with the extension already. Now to handle the error you need to properly modify your data in the frequency domain to be saved as an integer image, PIL
is telling you that it doesn’t accept float data to save as BMP.
Here is a suggestion (with other minor modifications, like using fftshift
and numpy.array
instead of numpy.asarray
) for doing the conversion for proper visualization:
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")
You should be able to simply let PIL get the filetype from extension, i.e. use:
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
,我使用了此页面-希望那里的一种选择适合您。
Try removing the .
before the .bmp
(it isn’t matching BMP
as expected). As you can see from the error, the save_handler
is upper-casing the format
you provided and then looking for a match in SAVE
. However the corresponding key in that object is BMP
(instead of .BMP
).
I don’t know a great deal about PIL
, but from some quick searching around it seems that it is a problem with the mode
of the image. Changing the definition of j
to:
j = Image.fromarray(b, mode='RGB')
Seemed to work for me (however note that I have very little knowledge of PIL
, so I would suggest using @mmgp’s solution as s/he clearly knows what they are doing :) ). For the types of mode
, I used this page – hopefully one of the choices there will work for you.
回答 3
我知道这很旧,但是我发现(在使用Pillow的同时)通过使用open(fp, 'w')
然后保存文件来打开文件是可行的。例如:
with open(fp, 'w') as f:
result.save(f)
fp
当然是文件路径。
I know that this is old, but I’ve found that (while using Pillow) opening the file by using open(fp, 'w')
and then saving the file will work. E.g:
with open(fp, 'w') as f:
result.save(f)
fp
being the file path, of course.