web-dev-qa-db-ja.com

PILで画像を保存するにはどうすればいいですか?

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

96
user1999274

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

適切な視覚化のための変換を行うための提案(numpy.arrayの代わりにfftshiftおよび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')
116
mmgp

あなたは単にPILに拡張子からファイルタイプを取得させることができます。

j.save("C:/Users/User/Desktop/mesh_trans.bmp")
26
wim

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

PILについてはあまり知りませんが、簡単に調べてみると、これは画像のmodeに関する問題であるようです。 jの定義を次のように変更します。

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

(私はPILについてはほとんど知識がないので、@ mmgpのソリューションを使用することをお勧めします) modeの型には、 this pageを使いました - うまくいけば、そこにある選択肢のうちの1つがうまくいくでしょう。

6
RocketDonkey

これは古いことを私は知っていますが、私は(枕を使用している間)open(fp, 'w')を使用してファイルを開き、次にファイルを保存することがうまくいくことを発見しました。例えば:

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

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

4
necko