高斯滤波算法

这几天要对数据进行线性平滑滤波,想到了高斯滤波,但是有对高斯滤波没有理解,因此就研究了一下。在这里做个记录。

高斯滤波需要一个高斯函数就是正态分布的概率密度函数:

这个函数是用来生成高斯模板。

具体的一维高斯滤波做法。分为一下几个步骤:举例说明

例如对这一组数据进行滤波,data[18]={2  4 5 75  34  5 76 12 8 45 23 89 65 32 1 67 100 34}  这一组数据一共18个数据

1、计算处高斯模板,

    根据高斯函数计算高斯模板,我们可以自己设定模板维度是r = 4, 那么模板的长度是2*r-1 = 9,

    σ=0.8,σ越大相邻的点对该点影响越大,反之越小

    μ是均值,从0到2*r-1的数据种均值为r-1。

    代入高斯函数得到一个长度2*r-1的模板数组template[2*r-1];

    计算模板数组代码:

for(int i=0;i<2*r-1;i++)
{
    template[i] = exp((i-(k-1))*(i-(k-1))/2*σ*σ)/(σ*sqrt(2*Π));
}

模板计算完后,需要对模板进行归一化处理:

double z = 0;
for(int i=0;i<2*r-1;i++)
{
    z+=template[i];
}
for(int i=0;i<2*r-1;i++)
{
    template[i]/=z;
}

2、数据补零

      因为data数据的开始点和结束点也要滤波,但是开始点前没有点,因此要人为补零;data就变成18+2*(r-1)大小的数组,前r-1数据是0,后r-1的数据是0。

3、高斯滤波

     根据模板对data的中间18个点进行滤波。

  滤波代码:

for(int i=r-1;i<18+k-1;i++)
{
    double temp=0;
    for(int j=0;j<2*r-1;j++)
    { 
         temp+=(data[i-(r-1)+j]*template[j]);
    }
    data[i]=temp;
}

  这样计算完成后的data就是滤波后的数据。

这是完成高斯滤波的整个过程。当然这个一维高斯滤波只是我的个人的理解。

高斯分布就是说在接近均值μ的两边概率最大,越接近μ对μ的影响越大,所占的权重越大。反之越小。

上图是r=4,σ=2 的高斯滤波结果。

黄线是滤波前,红线是滤波后。

先记录到这,以后有了新感悟在写。

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值