Как определить количество шума, которое вы добавляете к изображению

Я смотрю на данные в градациях серого, которые существуют в трехмерном объеме, который можно импортировать как трехмерный массив numpy со значениями от -1 до 1. Данные были взяты в системе визуализации и изображают трехмерный объем с более высокими значениями и фоновым шумом как случайный ценности.

Чтобы протестировать программу выравнивания, я сейчас пытаюсь добавить шум разных уровней в этот массив numpy. Мой текущий метод для этого следующий:

def RandomNoise():
    """Function to make a numpy array of 100x100x100 of random noise"""
    NoiseArray = np.random.normal(-0.5,0.5,size=(100,100,100))

    return NoiseArray

Затем я просто изменяю значения -0,5 или 0,5, чтобы изменить количество создаваемого шума.

Затем я добавляю шум, выполнив:

Noise = RandomNoise()

Volumewithnoise = (np.clip((Volume + Noise) * (1 - Volume), -1, 1))

Хотя это действительно делает мое изображение зашумленным, я действительно не знаю, как каким-либо образом количественно оценить количество шума, который я добавляю относительно исходного изображения. Кто-нибудь знает, как это сделать лучше?

1
0
215
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В вашей функции есть ошибка, на самом деле random.normal - это функция гауссовского шума, а не равномерное распределение, поэтому [-0,5, 0,5] не означает, что шум находится между 0,5 и -0,5.

Вы должны сделать свою функцию такой

def RandomNoise( magnitude ):
    """Function to make a numpy array of 100x100x100 of random noise"""
    NoiseArray = np.random.normal(0, magnitude ,size=(100,100,100))

    return NoiseArray

Как вы можете прочитать в документы, случайная норма имеет среднее значение и стандартное отклонение. Если вы хотите имитировать шум, среднее значение должно быть равно нулю, а стандартное отклонение эквивалентно величине шума.

Таким образом, у вас есть один параметр для управления количеством шума.

Спасибо, я, должно быть, не понял эту функцию. Правильно ли я говорю, что это по существу построит кривую колокола в 0 y с величиной 0,5? Возможно, мне стоит просто использовать функцию random uniform.

user7373790 31.10.2018 14:42

Самый распространенный тип шума - нормальный (гауссовский). Так что я думаю, что вы используете правильный. Однако это может зависеть от приложения. Здесь вы можете увидеть функцию плотности создаваемого шума. homepage.stat.uiowa.edu/~mbognar/applets/normal.html Как вы говорите, это колоколообразная кривая, но величина не 0,5

Gabriel M 31.10.2018 15:10

Большое спасибо, это очень полезно. Я предполагаю, что значение сигмы - это, по сути, моя величина здесь.

user7373790 31.10.2018 15:14

Другие вопросы по теме