142

画像のフーリエ変換を実行するために以前に見つけた投稿を使用して、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 で画像を保存するにはどうすればよいですか?

4

4 に答える 4

169

ファイル拡張子に関するエラーは処理されました。BMP(ドットなしで) 使用するか、既に拡張子を付けた出力名を渡します。エラーを処理するには、周波数領域でデータを適切に変更して整数イメージとして保存する必要があります。PILこれは、BMP として保存する float データを受け入れないことを示しています。

適切な視覚化のために変換を行うための提案 ( の代わりにfftshiftandを使用するなど、その他のマイナーな変更を加えたもの) を次に示します。numpy.arraynumpy.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')
于 2013-01-23T03:42:52.343 に答える
36

PILに拡張子からファイルタイプを取得させることができるはずです。つまり、次を使用します。

j.save("C:/Users/User/Desktop/mesh_trans.bmp")
于 2013-01-22T06:48:02.653 に答える
6

.の前の を削除してみてください.bmp(期待どおりに一致しませんBMP)。エラーからわかるように、save_handlerは指定した を大文字にformatして、 で一致を探していSAVEます。ただし、そのオブジェクトの対応するキーはBMP(ではなく.BMP) です。

についてはよくわかりませんが、PILざっと検索するとmode、画像の問題のようです。の定義を次のように変更しますj

j = Image.fromarray(b, mode='RGB')

私にとってはうまくいくように見えました(ただし、私はについての知識がほとんどないことに注意してください. PIL@mmgpのソリューションを使用することをお勧めします. のタイプについては、このmodeページを使用しました。ここにある選択肢の 1 つが役立つことを願っています。

于 2013-01-22T06:33:35.870 に答える
4

これが古いことは知っていますが、(Pillow を使用しているときに) を使用してファイルを開き、ファイルをopen(fp, 'w')保存すると機能することがわかりました。例えば:

with open(fp, 'w') as f:
    result.save(f)

fpもちろん、ファイルパスです。

于 2017-05-10T14:46:31.807 に答える