这几天要对数据进行线性平滑滤波,想到了高斯滤波,但是有对高斯滤波没有理解,因此就研究了一下。在这里做个记录。
高斯滤波需要一个高斯函数就是正态分布的概率密度函数:
这个函数是用来生成高斯模板。
具体的一维高斯滤波做法。分为一下几个步骤:举例说明
例如对这一组数据进行滤波,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 的高斯滤波结果。
黄线是滤波前,红线是滤波后。
先记录到这,以后有了新感悟在写。