1

在 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% 的误差是可以容忍的。我在做什么不正确?

4

2 回答 2

2

在这种情况下,您的方法结果不足,因为在使用 imnoise 时,您实际上是在添加一个近似版本的白噪声,它显示所有频率的分量。使用高通滤波器时,您会削减噪声的频率分量,从而降低估计的准确性。

实际上,正如您所提到的,仅从一张图像进行噪声估计并不是一个简单的问题。但是有一些方法,例如,您可以使用中值绝对偏差,让您获得和近似数据的离散度(在这种情况下,您的内核下的像素强度)

于 2011-08-03T08:46:12.497 回答
1

您可以计算高通滤波图像的方差。不要使用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));
于 2011-08-03T16:59:33.213 回答