2011-08-02 46 views
1

在Matlab内,我将噪声添加到具有已知方差的图像中。我知道我可以用下面的方法做到这一点:使用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%的错误是可以容忍的。我在做什么不正确?

+1

我不确定这个公式真的是你需要的。你能提供一个你找到它的来源吗?是否在纸上? – Phonon

+0

@Phonon - 我现在在寻找一个参考,我非常确定我在一篇论文中读到它。直觉上我认为它是有道理的,即在高通滤波之后,你留下了噪声和边缘细节,因为噪声在数量上占主导地位,所以中值应该是对噪声方差的合理估计 – trican

+0

aha我意识到了问题所在。 。应该有一个额外的比例因子1/0.675 - 然后给出一个非常合理的esimtate 0.00926 – trican

回答

2

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

确实如您所说,仅从一幅图像中估计噪声并不是一个简单的问题。但是有一些方法,例如你可以使用median absolute deviation,它可以让你获得并近似数据上的色散(在这种情况下,你的内核的像素强度)

+0

感谢您的回答,您的解释对我来说很有意义。不过,我仍然不确定我得到的答案。假设我正确地理解了你,我做了以下操作:i_median(:,:,1)= medfilt2(i_n(:,:,1)); i_median(:,:,2)= medfilt2(i_n(:,:,2)); i_median(:,:,3)= medfilt2(i_n(:,:,3)); var_est = median(median(median(abs(i_n-i_median))))。这给出了0.0590的答案 - 这看起来不正确吗? – trican

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)); 
+0

感谢您的回复kristi - 我显然做错了,因为当我尝试上述我越来越est_variance = 199.0065?!?唯一的变化是我打开uint8中的图像,并且只在方差命令之前进行双重转换,即est_variance = var(double(reshape(i_n - imfilter(i_n,kk),[],1))) 。这就是说我已经使用上面的im2double重试了它,并且我得到了0.0085。这是正确的,特别是考虑到@msotaquira在上面提出的观点。 – trican