web-dev-qa-db-ja.com

解像度を維持しながらimshowのような画像を保存する

matplotlib.pyplot.imshowで視覚化している(n、m)配列があります。このデータを何らかのタイプのラスターグラフィックスファイル(PNGなど)に保存して、次のようにします。

  1. 色はimshowで示されるものです
  2. 基礎となる配列の各要素は、保存されたイメージ内の正確に1ピクセルです。つまり、基礎となる配列が(n、m)エレメントである場合、イメージはNxMピクセルになります。 (imshowinterpolation='nearest'には興味がありません。)
  3. 保存された画像には、配列内のデータに対応するピクセルを除いて何もありません。 (つまり、エッジ、軸などの周りに空白はありません)

これどうやってするの?

interpolation='nearest'を使用し、matplotlibに(しぶしぶ)軸、空白などを強制的にオフにすることで、これを行うことができるコードを見てきました。 PIL?結局のところ、私は基礎となるデータを持っています。基になる配列の各要素のRGB値を取得できる場合は、PILで保存できます。 imshowからRGBデータを抽出する方法はありますか?配列の値をRGB値にマッピングする独自のコードを作成できますが、ホイールを再発明したくありません。その機能はmatplotlibに既に存在するからです。

19
lnmaurer

すでに推測したように、図を作成する必要はありません。基本的に3つのステップが必要です。データを正規化し、カラーマップを適用し、画像を保存します。 matplotlibは、必要なすべての機能を提供します。

import numpy as np
import matplotlib.pyplot as plt

# some data (512x512)
import scipy.misc
data = scipy.misc.lena()

# a colormap and a normalization instance
cmap = plt.cm.jet
norm = plt.Normalize(vmin=data.min(), vmax=data.max())

# map the normalized data to colors
# image is now RGBA (512x512x4) 
image = cmap(norm(data))

# save the image
plt.imsave('test.png', image)

上記のコードは単一のステップを説明していますが、imsaveに3つのステップすべてを実行させることもできます(imshowと同様):

plt.imsave('test.png', data, cmap=cmap)

結果(test.png):

enter image description here

28
hitzg