2016-09-02 9 views
2

numpyとcv2を使用してpyqtプロジェクトを作成しています。基本的には、バイナリnumpyマスク(1024, 1024)を使用して、4チャンネル単色画像(1024, 1024, 4)を作成します。この場合、マスクからの1はすべてピンクで、すべて0は見えません。次に、イメージを変換し、QSceneでオーバーレイとして表示して、別のイメージのいくつかのピクセルを強調表示します。1チャネルnumpy行列を4チャネル単色画像に変換する方法

私の現在のアプローチは仕事をしていますが、遅すぎるので、numpyがもっと便利なものを提供すると確信しています。

color = (255, 0, 238, 100) 
r = (mask * color[0]).reshape((w*h)) 
g = (mask * color[1]).reshape((w*h)) 
b = (mask * color[2]).reshape((w*h)) 
a = (mask * color[3]).reshape((w*h)) 

rgba = np.dstack((r, g, b, a)).reshape((w, h, 4)) 
transposed = np.transpose(rgba, axes=[1, 0, 2]) 

マスクオーバーレイを表示するには、より良い方法がありますか?私はnumpyを使用することを主張しませんが、私は色を設定することが重要です、私はいくつかの色が必要になりますように。

答えて

3

はい!そのように、それをクリーンアップし、one-linerを持っているNumPy broadcastingを使用する -

transposed = mask.T[...,None]*color 

説明:

  1. 使用mask.Tを最後に行われnp.transpose操作を行うこと。
  2. 転置配列で[...,None]を使用すると、基本的にすべての寸法が前面にプッシュされ、最終軸としてシングルトン・ディメンション(length=1で暗く)が作成されます。この新しい軸を導入するために、np.newaxis - Noneの別名を使用しました。したがって、colorの要素に合わせた最後の軸に沿って転置された配列のブロードキャストを実現します。
  3. 最後に、実際にはbroadcastedの操作である要素ごとの乗算自体を実行します。

あなたは開始時に、新たな軸部分の作成を行い、その後、np.transposeまたはnp.swapaxesを使用し、これはあなたの元のコードに近いだろうことができます。だから、代わりに私たちは持っている可能性があり:

transposed = mask[:,:,None].transpose(1,0,2)*color 

と、

transposed = mask[:,:,None].swapaxes(0,1)*color 
関連する問題