Добавьте белый шум на изображение на основе SNR - PullRequest
0 голосов
/ 23 января 2019

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

Исходное изображение (256, 128) Я использую пакет acoustics для добавления шума.

original = cv2.imread(path)
white = acoustics.generator.white(256*128).reshape(256, 128)
out = original + white*255

cv2.imwrite(path, out)

Мои вопросы:

  1. Учитывается ли log10(mean(original)/ std(original + white*255)) как SNR? (Согласно wiki )

  2. Если так, могу ли я просто изменить *255 этот номер, чтобы изменить SNR?

  3. Если нет, как я могу рассчитать значение SNR?

1 Ответ

0 голосов
/ 23 января 2019

Ключевым фактом является то, что (это математика, а не код)

SNR = mean(s) / std(n)

Умножение шума на некоторую константу A приводит к новому SNR - SNR_new

mean(s) / std(A*n) 
= mean(s) / (A * std(n)) 
= (1 / A) * (mean(s) / std(n)) 
= SNR / A
= SNR_new

Итак, работая в обратном направлении, я думаю, это правильный подход в python:

def add_noise(signal, snr):
    ''' 
    signal: np.ndarray
    snr: float

    returns -> np.ndarray
    '''

    # Generate the noise as you did
    noise = acoustics.generator.white(signal.size).reshape(*signal.shape)
    # For the record I think np.random.random does exactly the same thing

    # work out the current SNR
    current_snr = np.mean(signal) / np.std(noise)

    # scale the noise by the snr ratios (smaller noise <=> larger snr)
    noise *= (current_snr / snr)

    # return the new signal with noise
    return signal + noise
...