今天介紹高光譜數據預處理算法中的:移動窗口平均平滑算法。
顧名思義,移動窗口平均平滑的意思就是平滑窗口在數據上移動求平均,從而對數據進行去噪。上一節我們講的標準化是對全體樣本數據的移動、縮放,從而消除各個樣本數據間的差異。而移動窗口平均平滑是對單個樣本數據進行平滑,消除數據中的噪音。下面,我將介紹該算法的原理:
上圖爲一光譜數據,我們要對其進行移動窗口平均平滑,首先確定窗口大小,本例中我們將窗口大小設爲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!!!