pygame でルックアップ カラー テーブルを作成しました (ここではグレー レベルのみ)。
LUT = np.empty([256,3],np.uint8)
for gg in range(0,256):
LUT[gg,:] = [gg,gg,gg]
次に、このルックアップ テーブルの各値を呼び出して、2D マトリックスから pygame の 3D ピクセル配列を埋め込みます (たとえば、ノイズを含めます)。
screenWidth = 800
screenHeight = 480
win = pygame.display.set_mode((screenWidth,screenHeight), 32)
buffer = pygame.surfarray.pixels3d(win)
I = (255*np.random.rand(screenWidth,screenHeight)).astype(int)
buffer = LUT[I,:]
見た目にはすべてが正しいように見えます。3D ピクセル配列が得られ、各値は期待どおりです。しかし、このピクセル配列はウィンドウ「win」には表示されません。作成しました(黒いままです)。私を困惑させるのは、同じピクセル配列を要素ごとに埋めていく場合です。
for rr in range(0,screenWidth):
for cc in range(0,screenHeight):
buffer[rr,cc,:] = LUT[I[rr,cc],:]
その後、問題なく動作しますが、かなり遅くなります。 2 つの手法で埋められたピクセル配列に違いは見つかりません (予想どおり、どちらも通常の (800,480,3) ユニット 8 配列です)。そして、それらを matplotlib imshow で表示すると、どちらの場合でも画像は問題なく表示されます。ありません誰もその理由を知りませんか?
なぜ set_mode の引数として 32 を渡すのですか。深さを 32 にしたいのですか?その場合は、2 番目の引数がフラグであるため、set_mode((screenWidth,screenHeight), 0, 32) を実行する必要があります。
– オリヴィエ・サムソン
2020 年 9 月 4 日 22:55
ありがとう、気づきませんでした。
– バカ
2020 年 9 月 4 日 23:41
最終的に別のライブラリを使用したため、それが機能するかどうかは確認していませんが、機能すると思います。
– バカ
2020 年 10 月 10 日 0:33
------------------------
ネストされたループ
for rr in range(0,screenWidth):
for cc in range(0,screenHeight):
buffer[rr,cc,:] = LUT[I[rr,cc],:]
次のように置き換えることができます:
buffer[:,:,:] = LUT[I,:]
buffer = LUT[I,:] はバッファの要素を変更しません。このステートメントは新しいバッファを生成し、新しい配列オブジェクト t を割り当てます。o 変数バッファ。バッファの要素はスライスによって設定する必要があります (numpy - 基本的なスライスとインデックス付けを参照)。
lutBuffer = LUT[I,:]
buffer[:,:,:] = lutBuffer