Как добавить монохромный шум на поверхность PyGame, используя NumPy? - PullRequest
3 голосов
/ 20 декабря 2011

До сих пор я придумал следующее:

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 голосов
/ 18 января 2012

Каждый элемент в массиве, возвращаемый 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), что позволяет прямое умножение с объектом screen_array, имеющим форму (X, Y, 3). Когда это происходит, один элемент третьей оси умножается на все 3 канала. Этот способ решения проблемы более эффективен, чем использование numpy.tile.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...