高光譜數據預處理算法——移動窗口平均平滑

今天介紹高光譜數據預處理算法中的:移動窗口平均平滑算法。

顧名思義,移動窗口平均平滑的意思就是平滑窗口在數據上移動求平均,從而對數據進行去噪。上一節我們講的標準化是對全體樣本數據的移動、縮放,從而消除各個樣本數據間的差異。而移動窗口平均平滑是對單個樣本數據進行平滑,消除數據中的噪音。下面,我將介紹該算法的原理:

上圖爲一光譜數據,我們要對其進行移動窗口平均平滑,首先確定窗口大小,本例中我們將窗口大小設爲5(窗口大小爲奇數)。因此,從頭選擇光譜數據上的五個點:x-2,x-1,x0,x1,x2,對其進行求平均,然後賦值給x0:

其中n爲窗口大小,這裏爲5。之後移動窗口,使窗口中心點遍歷整個光譜數據,即完成了移動窗口平均平滑。

這裏我們會發現,處理後的光譜數據會比原始光譜短,因此,我們在處理光譜數據之前,要先對光譜數據補零,然後進行擬合,從而使處理後的光譜數據與原光譜數據大小一致。

下面是實現代碼:

function pdata=moving_average(data,window)

%該函數實現對數據的移動窗口平均平滑
%data爲輸入的原始數據,window爲窗口大小,pdata爲輸出數據
%Author:等等登登-ande
%Email:[email protected]

[m,n] = size(data);	
pdata = zeros(m,n);	
%參數初始化
if nargin == 1
	window = 3;	 
elseif round(window/2) == window/2
	error('光譜窗口寬度必須是奇數')
end
%對原始數據進行補零
center = floor(window/2);
extdata = [zeros(m,center) data zeros(m,center)];
%對補零後的數據進行擬合
for k = 1:m
	start = polyfit(center+1:center+4,extdata(k,center+1:center+4),2);	
    extdata(k,1:center) = polyval(start,1:center);
	bend = polyfit(n-3+center:n+center,extdata(k,n-3+center:n+center),2);
	extdata(k,n+center+1:n+window-1) = polyval(bend,n+center+1:n+window-1);
end
%求平滑後的數據
for i = 1+center:n+center
	pdata(:,i-center) = mean(extdata(:,i-center:i+center)')';	
end

處理結果:

原始數據
平滑數據

Get better every day!!! 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章