2011-12-20 2 views
3

は、これまでのところ私は、次のを作ってみた:NumPyを使ってPyGame表面にモノクロームノイズを追加するには?

screen_array = pygame.surfarray.pixels2d(self.screen) 
noise_small = numpy.random.random((self.width/4,self.height/4)) * 0.2 + 0.4 
noise_big = noise_small .repeat(4, 0).repeat(4, 1) 
screen_array *= noise_big 

しかし、これはすべてのチャンネルに独立したノイズを付加します。

私はpygame.surfarray.pixels3dを使用し、次にノイズアレイをnumpy.tileとすることもできますが、それはあまりにも遅いです(私が今やっていることはかなり遅いですが、それは気にしません)。

+1

@JohnRiselvato私はそれを手に入れていないかもしれませんが、それは私の質問にどのように関連していますか?つまりグレースケールで – Llamageddon

+1

、[ウィキリンク](http://en.wikipedia.org/wiki/Monochrome) – Llamageddon

+0

私は 'pygame.surfarray.pixels3d'の関数名は、それが画像についてです意味と音ではないと信じて... – Llamageddon

答えて

0

によって返される配列の各要素は、3つのチャネルを1つの整数にパックした数であり、配列構造を利用して高速かつ単純な乗算を行う簡単な方法はわかりませんこれとともに。

しかし、私はまだpygame.surfarray.pixels3dを使用し、numpy.tileは使用しないことをお勧めします。

screen_array = pygame.surfarray.pixels3d(self.screen) 
    noise_small = numpy.random.random((self.width/4,self.height/4)) * 0.2 + 0.4 
    noise_big = noise_small .repeat(4, 0).repeat(4, 1) 
    screen_array *= noise_big[:, :, numpy.newaxis] 

[:, :, numpy.newaxis]に注意してください。これにより、noise_bigの形状は、screen_arrayオブジェクトとの直接的な乗算を可能にする形状((X, Y, 3))の代わりに、形状が(X, Y, 1)でなく(X、Y)であるように再構成されます。その場合、3つ目の軸の1つの要素に3つのチャネルすべてが乗算されます。問題に取り組むこの方法は、numpy.tileを使用するよりも効率的です。

関連する問題