Python - pygameでカラールックアップテーブルを使用する

okwaves2024-01-25  11

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

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。