离散高斯滤波器的标准偏差
Standard deviation of a discrete Gaussian filter
我在 MATLAB 中创建了一个高斯滤波器,如下所示:
f = fspecial('gaussian', [1, 3], 2);
这创建了一个具有高斯分布的 1×3 过滤器。但是,当我执行 std(f)
时,我得到了一个不同的值,而不是 2.
为什么我没有得到标准差值 2?
您的 f
是正态分布的样本。它的值不是正态分布的。它的二阶空间中心矩应该是4(sigma值的平方),但是样本的标准差不会。
(将分布本身的采样与给定分布的随机值采样进行对比,后者的 std(f)
接近分布的标准差)。
二阶中心矩可以计算如下:
x = 1:numel(f);
m1 = sum(x.*f)/sum(f); % 1st order moment
m2 = sum((x-m1).^2.*f)/sum(f); % 2nd order central moment
尽管如此,如果您绘制采样 f
,您会发现它根本不像高斯分布!这是因为它被截断了,你采样的三个点都聚集在靠近峰值的地方,尾部没有样本。您需要对更大的区域进行采样。我总是建议在每一侧抽样到 3*sigma:
sigma = 2;
sz = ceil(3*sigma) * 2 + 1;
f = fspecial('gaussian', [1, sz], sigma)
我在 MATLAB 中创建了一个高斯滤波器,如下所示:
f = fspecial('gaussian', [1, 3], 2);
这创建了一个具有高斯分布的 1×3 过滤器。但是,当我执行 std(f)
时,我得到了一个不同的值,而不是 2.
为什么我没有得到标准差值 2?
您的 f
是正态分布的样本。它的值不是正态分布的。它的二阶空间中心矩应该是4(sigma值的平方),但是样本的标准差不会。
(将分布本身的采样与给定分布的随机值采样进行对比,后者的 std(f)
接近分布的标准差)。
二阶中心矩可以计算如下:
x = 1:numel(f);
m1 = sum(x.*f)/sum(f); % 1st order moment
m2 = sum((x-m1).^2.*f)/sum(f); % 2nd order central moment
尽管如此,如果您绘制采样 f
,您会发现它根本不像高斯分布!这是因为它被截断了,你采样的三个点都聚集在靠近峰值的地方,尾部没有样本。您需要对更大的区域进行采样。我总是建议在每一侧抽样到 3*sigma:
sigma = 2;
sz = ceil(3*sigma) * 2 + 1;
f = fspecial('gaussian', [1, sz], sigma)