【问题标题】:Estimating the variance of noise in an image with Matlab用 Matlab 估计图像中噪声的方差
【发布时间】:2011-10-18 14:24:00
【问题描述】:

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

【问题讨论】:

  • 我不确定这个公式是否真的是你需要的。你能提供一个你找到它的来源吗?是在纸上吗?
  • @Phonon - 我现在正在寻找参考资料,我很确定我不久前在一篇论文中读过它。直觉上我认为这是有道理的,即在高通滤波之后,你会留下噪声和边缘细节,因为噪声在数量上占主导地位,中值应该是噪声方差的合理估计
  • aha 我意识到问题出在哪里......应该有一个额外的比例因子 1/0.675 - 然后给出一个非常合理的估计值 0.00926
  • 所以你成功了吗?如果您这样做了,您应该将其发布为答案,以便其他人可以过来查看它。
  • @Phonon 它似乎并不总是给出合理的答案 - 所以我会等着看其他人是否有 cmets

标签: matlab image-processing noise


【解决方案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));

【讨论】:

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

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

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

【讨论】:

  • 感谢您的回答,您的解释对我来说很有意义。但是我仍然不确定我得到的答案。假设我理解正确,我做了以下事情: i_median(:,:,1) = medfilt2(i_n(:,:,1)); i_median(:,:,2) = medfilt2(i_n(:,:,2)); i_median(:,:,3) = medfilt2(i_n(:,:,3)); var_est = 中位数(中位数(中位数(abs(i_n - i_median))))。这给出了 0.0590 的答案 - 这似乎也不正确?
猜你喜欢
  • 2011-01-27
  • 2019-11-29
  • 2014-10-25
  • 1970-01-01
  • 2022-08-04
  • 1970-01-01
  • 2020-05-01
  • 2019-02-27
相关资源
最近更新 更多