Оценка дисперсии шума на изображении с помощью Matlab - PullRequest
1 голос
/ 03 августа 2011

В Matlab я добавляю шум к изображению с известной дисперсией.Я знаю, что могу сделать это с помощью следующего:

var = 0.01;
i   = im2double(imread('lena.bmp'));
i_n = imnoise(i, 'gaussian',0,var);

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

k = [1 4 6 4 1]'*[1 4 6 4 1];
kk = k ./sum(sum(k));

var_est = median(median(abs(i_n - imfilter(i_n,kk))))

   var_est(:,:,1) =

   0.0631


   var_est(:,:,2) =

   0.0620


   var_est(:,:,3) =

   0.0625

чтобы получить достаточно близкий результат, например, допустимая ошибка 50%.Что я делаю неправильно?

Ответы [ 2 ]

2 голосов
/ 03 августа 2011

Ваш подход в этом случае оказывается неадекватным, поскольку при использовании imnoise вы действительно добавляете приблизительную версию белого шума, которая демонстрирует компоненты на всех частотах.При использовании фильтра верхних частот вы ограничиваете частотные составляющие шума, тем самым снижая точность своей оценки.

Действительно, оценка шума только из одного изображения, как вы упомянули, не является простой проблемой.Однако есть некоторые подходы, например, вы можете использовать медианное абсолютное отклонение , которое позволяет получить и приблизить дисперсию ваших данных (в данном случае для интенсивности пикселей под вашим ядром)

1 голос
/ 03 августа 2011

Вы можете рассчитать дисперсию отфильтрованного изображения верхних частот.Не используйте var в качестве имени переменной, потому что это имя функции Matlab, которая вычисляет дисперсию.

v = var; % use v instead of var for your variance variable
clear var; % clear your variable "var" so we can use the var function
est_variance = var(reshape(i_n - imfilter(i_n,kk), [], 1));
...