scatter()
ファンクションは、x
とy
引数に渡す配列の各値のペアに対して1ポイントをプロットします。あなたの例では、これらの配列の値は[0, 1, 2, ..., my_img.shape[0]-1]
と[0, 1, 2, ..., my_img.shape[1]-1]
となります。最高でも、これは対角線をプロットし、x
とy
のサイズが同じでない場合(つまり、画像が四角形でない場合)、scatter()
はx and y must be the same size
というエラーを投げます。
画像内のすべてのピクセルをプロットするには、すべてのピクセルの座標をscatter()
に渡す必要があります。配列内のすべての要素の座標を取得する方法の1つはindicies()
コマンドnumpy
です。それぞれのピクセルに格納されているRGB値ではなく、一番外側の値のインデックスのみが必要なので、最初の2つの値を渡します。
y, x = np.indices(my_img.shape[:2])
今x
とy
は、2次元画像内の全ての点の座標を表す2次元配列です。
もう1つのことは、イメージの配列のサイズをNx3に変更することです(Nはイメージ内のピクセルの総数の長さです)。これは配列の.reshape()
メソッドで行われます。再構築するために渡された-1
colors = my_img.reshape((-1,3))
は、あなたが明示的にピクセルの数を渡す必要はありませんので、自動的にその大きさを計算するreshape()
に指示します。
今scatter()
コマンドは次のとおりです。
ax.scatter(x, y, c=colors)
ax.invert_yaxis() #make y=0 appear at the top, similar to imshow()
は最後に、あなたは、カラーマップを適用します。色のRGB値を渡す場合、scatter()
とimshow()
はcmap
パラメータを無視します。 matplotlib Image tutorialに示すように、RGB値を単一の値に変換する必要があります。
注:この方法でプロットを描くのは遅く、大きな画像には適していません。
非常に良い答えです。しかし、画像にはいくつかのカラーチャンネルがあり、散布図の色は画像の色に対応すると暗黙のうちに仮定します。その質問がカラーマップを使用しているのを見て、ここの画像は単純な2D配列であると仮定できるので、解をもっと簡単にすることができると思います。 'y、x = np.indices(my_img.shape); ax.scatter(x、y、c = my_img) '。 – ImportanceOfBeingErnest