在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%的错误是可以忍受的。我做错了什么?
答案 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));