如何使用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 个回答
0
通过 pygame.surfarray.pixels2d
返回的数组中的每个元素,都是通过把三个颜色通道合并成一个整数得到的。我不知道有没有简单的方法可以利用这个数组结构来快速进行简单的乘法运算。
不过,我觉得你最好的选择还是使用 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
的形状调整为 (X, Y, 1)
,而不是 (X, Y)
,这样就可以直接和形状为 (X, Y, 3)
的 screen_array
进行乘法运算。当这样做时,第三个维度的单个元素会和所有三个颜色通道相乘。这种处理问题的方法比使用 numpy.tile
更有效。