【问题标题】:Gaussian Smoothing, normalize or un-normailze高斯平滑,归一化或非归一化
【发布时间】:2018-08-23 04:56:25
【问题描述】:

为了平滑我的数据,我在 MATLAB 中使用高斯函数与我的数据进行卷积。但有一个细节不容忽视。比如我的原始数据是“DATA”,平滑后的数据是“SM_DATA”,一个简单的matlab代码是:

gauss=gausswin(100);
gauss_normalize=gauss/sum(gauss);
SM_DATA=conv(DATA,gauss,'same');

图像会是这样的:

但是,如果我删除第二行“gauss_normalize=gauss/sum(gauss);”图像会有很强的DC,见

谁能帮助解释为什么我应该使用 gauss_normalize 使用简单但专业的语言进行卷积?此外,这不是典型的标准化,对吧?因为典型的归一化会除以最大值而不是序列的总和,因此数据是从 0 到 1。

【问题讨论】:

  • 这是由于内核的离散化。最终,如果您的数据全部为1 并且您应用内核,那么您期望全部为1。为了确保发生这种情况,您需要确保内核在应用于所有1 的数据时返回1。直接的方法是规范化内核。

标签: matlab filtering signal-processing gaussian


【解决方案1】:

让我们看一下使用更简单过滤器的卷积:[1,1,1]

对于每个输出点,卷积会将过滤器值与该点周围的函数值相乘,并将结果相加:

out(i) = in(i-1) * 1 + in(i) * 1 + in(i+1) * 1;

显然,out(i) 的值大约是in(i) 的三倍,因为我们只是将三个输入值相加。

三个输入值的平均值为:

out(i) = ( in(i-1) + in(i) + in(i+1) ) / 3;

相同
out(i) = in(i-1) * 1/3 + in(i) * 1/3 + in(i+1) * 1/3;

也就是说,平均过滤器应该是[1,1,1]/3,而不是[1,1,1]。我们已将过滤器内核归一化以求和为 1 以计算平均值。当我们没有进行归一化时,信号的平均值会上升。

现在让我们将这一课应用于加权平均。权重为 w 的值 v 的加权平均值计算为

sumi ( v(i) w(i) ) / sumi ( w(i) )

或者,用 MATLAB 编写:

out(i) = ( in(i-1) * w(1) + in(i) * w(2) + in(i+1) * w(3) ) / sum(w);

如您所见,这看起来与上面的卷积相同,但内核权重不同。我们再次对内核权重进行归一化。

因此,如果您想使用高斯权重计算加权平均值,则需要将这些权重归一化以使之和为 1。如果不这样做,您就没有计算平均值,因此您不会保留直流分量(整个信号的平均值)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 2015-07-02
    • 2023-03-30
    • 2013-11-22
    • 1970-01-01
    相关资源
    最近更新 更多