matplotlibカラーマップを適用してNumPy配列をPIL画像に変換する方法


133

単純な問題がありますが、適切な解決策が見つかりません。

グレースケールイメージを表す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)

回答:


221

かなり忙しいワンライナーですが、ここにあります:

  1. まず、NumPy配列が、myarrayの最大値で正規化されていることを確認します1.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()

ここに画像の説明を入力してください

im.save()

ここに画像の説明を入力してください


7
「カラーマップを直接適用するmyarray」部分を真っ直ぐカット!可能だとは知らなかった、ありがとう!
heltonbiker

34
LinearSegmentedColormap(cm.gist_earthがインスタンスである)に関するドキュメントを調べたところ、すでにuint8に変換されている "bytes"引数を使用して呼び出すことができることがわかりました。その後、ワンライナーはより静かになります:im = Image.fromarray(cm.gist_earth(myarray, bytes=True))
heltonbiker

1
@CiprianTomoiaga、配列の形状は必要な画像の大きさでなければなりません。たとえば、VGA画像は形状(1024,768)の配列から生成されます。これはモノクロ画像に適用されることに注意してください。通常、RGBイメージを配列に変換すると、3つのチャネルを持つため、その形状は(1024,768,3)になるため、これは重要です。
heltonbiker 2017年

5
エラーが発生しますNameError: name 'cm' is not defined
rnso '31

10
@msofrom matplotlib import cm
Quantum7

10
  • 入力= numpy_image
  • np.unit8->整数に変換します
  • convert( 'RGB')-> RGBに変換します
  • Image.fromarray->画像オブジェクトを返します

    from PIL import Image
    import numpy as np
    
    PIL_image = Image.fromarray(np.uint8(numpy_image)).convert('RGB')
    
    PIL_image = Image.fromarray(numpy_image.astype('uint8'), 'RGB')

5
問題が解決することを願っていますが、コードの説明を追加して、ユーザーが本当に望んでいることをユーザーが完全に理解できるようにしてください。
ジャイミルパテル

1
良い、更新された答え。以前のものは数年前のものです。
Catalina Chircu

7

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

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は無視されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.