Оценка отношения сигнал / шум изображения - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь снять шум с изображения.Я хочу знать, понизил ли это шум или нет, посмотрев на значение SNR.Теперь, как я могу оценить SNR изображения в Python?

1 Ответ

0 голосов
/ 24 сентября 2018

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
...