到目前为止,我已经想出了以下内容:
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
但这会在每个 channel 上增加单独的噪声。
我知道我也可以使用 pygame.surfarray.pixels3d
然后使用 numpy.tile
噪声数组,但这对我来说太慢了(好吧,我我现在做的也很慢,但没关系)。
最佳答案
pygame.surfarray.pixels2d
返回的数组中的每个元素都是通过将 3 个 channel 打包成一个整数获得的数字,我不知道有什么简单的方法可以利用数组结构来进行快速简单的乘法运算。
但是,我仍然认为最好的选择是使用 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
reshape 为形状 (X, Y, 1)
而不是 (X, Y),这允许与 screen_array
直接相乘> 对象,形状为 (X, Y, 3)
。发生这种情况时,第三个轴的单个元素将与所有 3 个 channel 相乘。这种解决问题的方法比使用 numpy.tile
更有效。
关于python - 如何使用 NumPy 将单色噪声添加到 PyGame 表面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8580872/