用Matlab估计图像中的噪声方差

时间:2011-08-02 20:39:12

标签: matlab image-processing noise

在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 个答案:

答案 0 :(得分:2)

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

实际上,正如您所提到的,仅从一个图像进行噪声估计并不是一个简单的问题。但是有一些方法,例如你可以使用median absolute deviation来获取和近似数据的色散(在这种情况下是你内核下的像素强度)

答案 1 :(得分: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));