web-dev-qa-db-ja.com

matplotlibカラーマップを適用してNumpy配列をPILイメージに変換する方法

私は単純な問題を抱えていますが、それに対する良い解決策を見つけることができません。

グレースケールイメージを表すnumpy 2D配列を取得し、matplotlibカラーマップの一部を適用しながらそれをRGB PILイメージに変換します。

pyplot.figure.figimageコマンドを使用して、適切なPNG出力を取得できます。

dpi = 100.0
w, h = myarray.shape[1]/dpi, myarray.shape[0]/dpi
fig = plt.figure(figsize=(w,h), dpi=dpi)
fig.figimage(sub, cmap=cm.Gist_earth)
plt.savefig('out.png')

私はこれを私が望むものを得るために適応させることができますが(おそらくStringIOを使用してPIL画像を取得します)、画像の視覚化の非常に自然な問題のように見えるので、それを行う簡単な方法はないのでしょうか?このようなことを言ってみましょう:

colored_PIL_image = magic_function(array, cmap)

読んでくれてありがとう!

88
heltonbiker

非常に忙しい1つのライナーですが、ここにあります:

  1. まず、numpy配列myarray1.0の最大値で正規化されていることを確認します。
  2. カラーマップをmyarrayに直接適用します。
  3. 0-255範囲に再スケーリングします。
  4. np.uint8()を使用して、整数に変換します。
  5. Image.fromarray()を使用します。

これで完了です。

from PIL import Image
from matplotlib import cm
im = Image.fromarray(np.uint8(cm.Gist_earth(myarray)*255))

plt.savefig()で:

enter image description here

im.save()で:

enter image description here

168
fraxel

承認済みの回答に記載されている方法は、コメントに記載されている変更を適用した後でも機能しませんでした。しかし、以下の簡単なコードが機能しました

import matplotlib.pyplot as plt
plt.imsave(filename, np_array, cmap='Greys')

np_arrayは、0..1 floats o2 0..255 uint8の値を持つ2D配列のいずれかで、その場合はcmapが必要です。 3D配列の場合、cmapは無視されます。

2
Shital Shah