1. ホーム
  2. python

[解決済み] PILで画像を保存するにはどうすればよいですか?

2022-03-02 17:14:37

質問

Python image library (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で画像を保存するにはどうすればよいですか?

どのように解決するのですか?

ファイル拡張子に関するエラーが発生した場合、以下のいずれかの方法で対処してください。 BMP (ドットなし) または拡張子付きの出力名を渡します。さて、このエラーを処理するには、整数イメージとして保存されるように、周波数領域のデータを適切に修正する必要があります。 PIL は、BMPとして保存するためのfloatデータを受け付けないことを告げています。

以下はその提案です(その他、細かい修正、例えば 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')