python - 如何使用 NumPy 将单色噪声添加到 PyGame 表面?

标签 python 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

但这会在每个 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/

相关文章:

python - 计算一组字符串(推文)的相似度

python - 使用每个切片的百分位数过滤多维 numpy 数组

python - 这种修复插值可以在 Python 中变得更快吗?

python - pygame中移动 Sprite 之间的碰撞

python - 致命的 python 错误 : (pygame parachute) Segmentation Fault

python - 如何使循环运行特定次数

python - 在 pywin32 中打开 MS Word 文件

python - 使用keras加载模型并为其参数分配新值

python - 使用 Python 的子进程模块和 ffmpeg 运行 2-pass 视频转换

Python Numpy 泊松回归产生错误的数字