轉自: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)就可以得到模板的值了。
2.高斯濾波是如何實現的?
其實思想很簡單,高斯分布的特點是在均值μ \muμ兩邊的概率都很大,離之越遠的概率越小,所以高斯函數用在濾波上體現的思想就是:離某個點越近的點對其產生的影響越大,所以讓其權重大,越遠的產生的影響越小,讓其權重越小。
舉個例子,有如下一個序列,對其中的6進行操作,模板為[1,2,1]:
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 ,對每個數據都進行這樣的操作,就是所謂的高斯濾波了。
有一個問題,如果是開頭和結尾怎么辦?
一種做法是補0:
0 1 2 3 5 6 3 1 7 5 3 8
|
1 2 1
1
2
3
另一種做法就是不讓模板超出信號的范圍,此處采用后一種做法。
3.matlab代碼
高斯濾波函數Gaussianfilter:
% 功能:對一維信號的高斯濾波,頭尾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中點擊運行按鈕,即可看到結果。
結果:
---------------------
作者:itsc
來源:CSDN
原文:https://blog.csdn.net/shanchuan2012/article/details/53071159
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!