この質問は、私の質問に対してtcaswell(回答#2)によって提供された解決策の続きです:pyplot.imshow()オブジェクトをnumpy配列に変換する方法はありますか?
次のPythonコードを検討してください。
import pylab
import numpy as np
a = np.array( ( 30, 129 ) , dtype = np.float32 )
b = np.array( ( 30, 129 ) , dtype = np.int32 )
my_cm = pylab.cm.get_cmap('jet')
a_mapped_data = my_cm( a )
b_mapped_data = my_cm( b )
スペースを節約するために小さな配列を使用していますが、これは大きな配列を使用した場合でも見られます。
結果:
>>> a
array([ 30., 129.], dtype=float32)
>>> b
array([ 30, 129])
>>> a_mapped_data
array([[ 0.5, 0. , 0. , 1. ],
[ 0.5, 0. , 0. , 1. ]])
>>> b_mapped_data
array([[ 0. , 0. , 1. , 1. ],
[ 0.5028463 , 1. , 0.46489564, 1. ]])
ここでの動作が理解できないようです。値は同じですが、cm.get_map()
インスタンスはデータ型に対して異なる結果numpy.int32
を生成しています。numpy.float32
上記のコードに何か問題がありますか?これを手伝ってください。タイプnumpy.floatの2D配列をプロットする必要があります。
ありがとうございました
私はWindows7x64HomeBasicでpython2.7.332ビットを使用しています
編集: 私がしたのと同じ問題に直面している人のための解決策
以下のスクリプトは、入力データに対してカラーマップを実行し、スケールや境界線を使用せずに、pylab.imshow
または使用せずに、マップをそのまま画像に変換します。pylab.pcolor
貢献してくれたすべての人に感謝し、それがどのように行われるかを理解するのを助けてくれました。
import pylab
import numpy as np
a = np.random.random( (512, 512) )*100
# a is a 2D array of random data not in the range of 0.0 to 1.0
# normalize the data
normed_a = ( a - a.min() )/( a.max() - a.min() )
# now create an instance of pylab.cm.get_cmap()
my_cm = pylab.cm.get_cmap('jet_r')
# create the map
mapped_a = my_cm( normed_a )
# to display the map, opencv is being used
# import opencv
import cv2 as cv
# convert mapped data to 8 bit unsigned int
mapped_au8 = (255 * mapped_a).astype('uint8')
# show the image
cv.imshow( 'a', mapped_au8 )
cv.waitKey( 0 )
cv.destroyAllWindows()
編集:リターンタイプcm.get_cmap
のインスタンスはRGBA形式ですが、OpenCVはデフォルトでBGR形式で動作します。したがって、上記のコードのようにインスタンスの戻り値を変換して取得した画像を表示する前にcm.get_cmap()
、それをBGR形式に変換します(画像が表示される前に、opencvではデフォルトでALPHAチャネルが削除されるため、必要な場合を除いて、わざわざBGRAに変換しないでください) 。以下のコードはより良い説明を与えます:
mapped_au8 = (255 * mapped_a).astype('uint8')
#convert mapped_au8 into BGR fromat before display
mapped_u8 = cv.cvtColor( mapped_au8, cv.COLOR_RGBA2BGR )
# show the image
cv.imshow( 'a', mapped_au8 )
cv.waitKey( 0 )
cv.destroyAllWindows()