2

私は次のようなnumpyndarrayを持っています:

[[0, 0.25, 1,  ...., 0.5, 0.23 ],
 [0.3, 0.75, 1, ..., 0.5, 0.37 ],
  ...,
  ...,
 [0, 0.25, 1,  ...., 0.5, 0.23 ],
 [0.3, 0.75, 1, ..., 0.5, 0.37 ]]

基本的に、すべての値は0〜1.0の範囲です。

これをビットマップとして視覚化したいのですが、現在、基本的にこれを行う非常に遅いループがあります。

for i, row in enumerate(data):
    for j, val in enumerate(row):
        yield val_to_rgb(val)

次に、3タプルのrgbコンポーネントを取得し、それにPIL putdataを実行して、PNGを作成します。

私はこれを何度も行う必要があり、このゲットーの方法は遅く、色付けは非常に醜いです。

私の質問はこれです:

生のRGB値を含む色付きの行列を生成する、適用できる一連の行列演算はありますか?

これは実際には2つの質問で構成されています。

  1. 上記のマトリックスからRGBタプルを取得するために適用できる最も効率的な変換は何ですか
  2. (0、1.0)値を色付きの表現に変換する「良い」方法はありますか?

編集:明確化-リアルタイムで表示するだけでなく、これをPNGとして保存したいと考えています。その理由は、これの多くがヘッドレスマシンで実行されており、事後に検査するためです。

現在のアルゴの出力はかなり厄介に見えます:

カラー化されたマトリックス

4

2 に答える 2

3

matplotlibには、すぐに使用できるimshow関数があります。

あなたがしていることは通常「ベクトル化」を介して行われます。関数を定義し、numpyに反復を実行させます。

vec = np.vectorize(val_to_rgb)
rgb_data = vec(data)
于 2012-12-25T16:28:25.850 に答える
2

私はPILにあまり詳しくありませんが、PILが形の乱雑な配列を飲み込んで、(rows, cols, 3)それを画像に変えると推測しています。したがって、関数を書き直してval_to_rgb、スカラーではなく配列で機能し、RGB値を図形の最後の次元に配置する必要があります。

たとえば、値をグレースケールとして解釈したいとします。0は黒、1は白です。スカラー入力を受け取る現在の関数は次のようになります。

def val_to_rgb(val) :
    return (int(val * 255),) * 3

ベクトル化された形式は次のようになります。

def vals_to_rgbs(vals) :
    ret = np.zeros(vals.shape + (3,),  dtype='uint8')
    ret[...] = vals.reshape(vals.shape + (1,)) * 255
    return ret

>>> vals_to_rgb(np.random.rand(10,10)).shape
(10, 10, 3)
>>> vals_to_rgb(np.random.rand(10,10)).dtype
dtype('uint8')

形を変えることは、放送にその魔法をさせることです。

Thinksはさらに複雑になる可能性があるため、特定の関数をベクトル化するためのヘルプが必要な場合はval_to_rgb、コードを投稿してください。喜んでそれを試してみます。

于 2012-12-25T16:50:31.340 に答える