SNR определяется по-разному , но я думаю, что для вашего приложения его точное определение не имеет значения.В общем, это отношение уровня сигнала и уровня шума.«Сила» здесь намеренно оставлена неоднозначной, часто используются мощность сигнала и шум, но амплитуда также является жизнеспособной.
Давайте теперь предположим, что ОСШ - это мощность сигнала изображения, деленная на мощностьшумовой сигнал.Сила шума - это просто его дисперсия.Вы сравниваете изображение до и после шумоподавления, поэтому, вероятно, мощность сигнала не меняется.Мы можем игнорировать его и установить его на 1. Теперь наше SNR просто определяется как 1/var(noise)
.
Итак, вам нужно оценить дисперсию шума и сравнить ее до и после шумоподавления.Вы хотите, чтобы эта дисперсия уменьшилась (поскольку SNR затем увеличивается).
Как правило, непросто оценить дисперсию шума изображения, если не знать, как выглядит изображение без шума.,Вы можете думать о зашумленном изображении как
image = noiseless_image + noise.
Таким образом, дисперсия изображения - это дисперсия шума + дисперсия бесшумного изображения.Если вы не знаете последнее, вы не можете получить первое.
Но есть хитрости.Самый простой способ, если вы хотите выполнить небольшую ручную работу для каждого сравниваемого изображения, - это наметить плоскую область фона (обычно будет работать небольшая область неба).Очень важно, что в этом регионе нет естественного изменения интенсивности.Теперь просто вычислите дисперсию пикселей в этой области.
Для этой цели было опубликовано несколько полностью автоматических методов.Мне известен один из них Дж. Иммеркера: «Быстрая оценка дисперсии шума», Computer Vision and Image Understanding 64 (2): 300-302, 1996. Библиотека DIPlib (я автор) имеет реализацию .Вы можете использовать его из Python следующим образом:
var = dip.EstimateNoiseVariance(img)
(с img
либо объектом изображения из библиотеки, либо массивом Numpy, либо любым другим объектом, который предоставляет буфер).Но, поскольку пока нет официального выпуска версии библиотеки с привязками Python, вам придется самостоятельно выбирать и компилировать библиотеку, если вы хотите использовать эту реализацию.Но, учитывая, что это довольно простой метод, вы можете подумать о его реализации самостоятельно.
Вот псевдокод для метода:
mask = gradient magnitude of img
Apply Gaussian smoothing (sigma = 3) to mask
If the image has more than one channel:
mask = max over the channels
Compute the Otsu threshold value for mask
mask = pixels where mask < threshold
error = discrete Laplace of in: apply convolution with [1,-2,1;-2,4,-2;1,-2,1]
MSE = the mean square value of the pixels in error that fall within mask, on a per-channel basis
If the image has more than one channel:
MSE = mean over MSE values for each channel
variance = MSE / 36