转自:https://blog.csdn.net/shanchuan2012/article/details/53071159 函数
1.从正态分布提及测试
咱们生成的高斯模板就是从这个公式来的。例如要生成一个大小为3,标准差为1的模板,则只须要代公式计算(此处均值μ \muμ为0,不为0将其平移便可):f(−1) f(-1)f(−1) 、f(0) f(0)f(0)、f(1) f(1)f(1)就能够获得模板的值了。.net
2.高斯滤波是如何实现的?
其实思想很简单,高斯分布的特色是在均值μ \muμ两边的几率都很大,离之越远的几率越小,因此高斯函数用在滤波上体现的思想就是:离某个点越近的点对其产生的影响越大,因此让其权重大,越远的产生的影响越小,让其权重越小。3d
举个例子,有以下一个序列,对其中的6进行操做,模板为[1,2,1]:blog
1 2 3 5 6 3 1 7 5 3 8
|
1 2 1
1
2
3
那么结果为:(5∗1+6∗2+3∗1)/(1+2+1)=5 (5*1+6*2+3*1)/(1+2+1)=5(5∗1+6∗2+3∗1)/(1+2+1)=5 ,对每一个数据都进行这样的操做,就是所谓的高斯滤波了。it
有一个问题,若是是开头和结尾怎么办?io
一种作法是补0:function
0 1 2 3 5 6 3 1 7 5 3 8
|
1 2 1
1
2
3
另外一种作法就是不让模板超出信号的范围,此处采用后一种作法。模板
3.matlab代码
高斯滤波函数Gaussianfilter:test
% 功能:对一维信号的高斯滤波,头尾r/2的信号不进行滤波
% r :高斯模板的大小推荐奇数
% sigma :标准差
% y :须要进行高斯滤波的序列
function y_filted = Gaussianfilter(r, sigma, y)
% 生成一维高斯滤波模板
GaussTemp = ones(1,r*2-1);
for i=1 : r*2-1
GaussTemp(i) = exp(-(i-r)^2/(2*sigma^2))/(sigma*sqrt(2*pi));
end
% 高斯滤波
y_filted = y;
for i = r : length(y)-r+1
y_filted(i) = y(i-r+1 : i+r-1)*GaussTemp';
end
测试代码:
% 测试数据
x = 1:50;
y = x + rand(1,50)*10;
% 设置高斯模板大小和标准差
r = 3;
sigma = 1;
y_filted = Gaussianfilter(r, sigma, y);
% 做图对比
plot(x, y, x, y_filted);
title('高斯滤波');
legend('滤波前','滤波后','Location','northwest')
如何使用?
新建2个m文件,一个命名为Gaussianfilter,把第一段代码复制进去;另外一个命名为testgauss,把第二段代码复制进去,保存。在testgauss中点击运行按钮,便可看到结果。
结果: