8

2D numpy 配列を視覚化する必要があります。これにはpyplotを使用しています。コードは次のとおりです。

import cv2 as cv
import numpy as np
from matplotlib import pyplot

img = pyplot.imshow( radiance_val )
#radiance_val is a 2D numpy array of size = ( 512, 512 ) 
#filled with np.float32 values

pyplot.show()

期待通りの出力を得ています。

私の質問は、上記のコードの「img」をpyplotタイプからnumpyタイプに変換する方法はありますか。ビジュアライゼーションを opencv イメージとしてロードし、さらに処理を実行できるようにするために、これが必要です。私はpython 2.7、32ビットを使用しています。

親切に助けて

ありがとうございました


編集1:Thorsten Kranzの解決策の後

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
import PIL
from cStringIO import StringIO

frame1 = plt.gca()
frame1.axes.get_xaxis().set_visible(False)
frame1.axes.get_yaxis().set_visible(False)
plt.imshow(np.random.random((10,10)))

buffer_ = StringIO()
plt.savefig( buffer_, format = "png", bbox_inches = 'tight', pad_inches = 0 )
buffer_.seek(0)

image = PIL.Image.open( buffer_ )

ar = np.asarray(image)
cv.imshow( 'a', ar )
cv.waitKey(0)
cv.destroyAllWindows()

ここでは、プログラムの終了後に MS VC++ ランタイム ライブラリからランタイム エラーが発生しています。私のより良い推測は、開いている「buffer_」が原因であるということです。しかし、私は必要な出力を得ています。


編集 2: を使用してバッファを閉じる

buffer_.close()

実行時エラーを解決しませんでした


最終編集:解決策

4

4 に答える 4

11

本当にマーカーの目盛りなどが必要でない限り、

im._rgba_cache

numpyカラーマップされたデータであるMxNx4 配列に直接アクセスできます。

カラーマップされたデータだけが必要な場合は、imshow完全にバイパスして、データを自分で直接カラーマップできます (カラーマップを選択するためのガイドを参照してください)。

my_cm = maplotlib.cm.get_cmap('Reds')
normed_data = (data - np.min(data)) / (np.max(data) - np.min(data))
mapped_data = my_cm(normed_data)

0と の間にマップされた MxNx4 配列が返されます1

mapped_datau8 = (255 * my_cm(normed_data)).astype('uint8')

また

mapped_data = my_cm(normed_data, bytes=True)

unsigned int に変換します。

matplotlibには、さまざまな正規化コードが含まれています。こちらを参照してください

get_cmapドキュメントカラーマップ ギャラリー

編集: https://stackoverflow.com/a/14880947/380231で指摘された修正された見落とし

于 2013-02-14T14:30:24.913 に答える
5

メソッドの戻り値またはプロット全体を変換しますか?

後者については、次のことを試してください。

  • を使用して、プロットを StringIO バッファー イメージに保存します。savefig
  • PIL または opencv を使用して、このバッファからイメージをロードします
  • それをnumpy配列に変換します

以下のサンプルを参照してください。

import numpy as np
import matplotlib.pyplot as plt
import PIL
from cStringIO import StringIO

plt.imshow(np.random.random((20,20)))
buffer_ = StringIO()
plt.savefig(buffer_, format = "png")
buffer_.seek(0)
image = PIL.Image.open(buffer_)
ar = np.asarray(image)
buffer_.close()

savefig-*argsを調べて**kwargs、dpi、背景色、透明度、パディングなどのその他のオプションを確認してください。

軸やラベルなどのない色分けされた画像が必要な場合でも、同じことを行います。

plt.subplots_adjust(0,0,1,1)

軸を図全体に拡張します。プロットに注意してaspectください。そうしないと、mpl が軸を再び縮小する可能性があります。

于 2013-02-14T08:04:57.370 に答える