画像のフーリエ変換を実行するために先ほど見つけた投稿を使用して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で画像を保存するにはどうすればいいですか?
ファイル拡張子に関するエラーは処理されました、あなたは(ドットなしで)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')
あなたは単にPILに拡張子からファイルタイプを取得させることができます。
j.save("C:/Users/User/Desktop/mesh_trans.bmp")
.
の前に.bmp
を削除してみてください(予想通りBMP
と一致しません)。エラーからわかるように、save_handler
は提供したformat
を大文字にして、SAVE
で一致を探しています。ただし、そのオブジェクトの対応するキーは(.BMP
ではなく)BMP
です。
PIL
についてはあまり知りませんが、簡単に調べてみると、これは画像のmode
に関する問題であるようです。 j
の定義を次のように変更します。
j = Image.fromarray(b, mode='RGB')
(私はPIL
についてはほとんど知識がないので、@ mmgpのソリューションを使用することをお勧めします) mode
の型には、 this pageを使いました - うまくいけば、そこにある選択肢のうちの1つがうまくいくでしょう。
これは古いことを私は知っていますが、私は(枕を使用している間)open(fp, 'w')
を使用してファイルを開き、次にファイルを保存することがうまくいくことを発見しました。例えば:
with open(fp, 'w') as f:
result.save(f)
fp
はもちろんファイルパスです。