高光谱数据预处理之移动窗口平均平滑算法

 本文转自:      https://blog.csdn.net/qq_35166974/article/details/88058945 

今天介绍高光谱数据预处理算法中的:移动窗口平均平滑算法。

顾名思义,移动窗口平均平滑的意思就是平滑窗口在数据上移动求平均,从而对数据进行去噪。上一节我们讲的标准化是对全体样本数据的移动、缩放,从而消除各个样本数据间的差异。而移动窗口平均平滑是对单个样本数据进行平滑,消除数据中的噪音。下面,我将介绍该算法的原理:

上图为一光谱数据,我们要对其进行移动窗口平均平滑,首先确定窗口大小,本例中我们将窗口大小设为5(窗口大小为奇数)。因此,从头选择光谱数据上的五个点:x-2,x-1,x0,x1,x2,对其进行求平均,然后赋值给x0:

其中n为窗口大小,这里为5。之后移动窗口,使窗口中心点遍历整个光谱数据,即完成了移动窗口平均平滑。

这里我们会发现,处理后的光谱数据会比原始光谱短,因此,我们在处理光谱数据之前,要先对光谱数据补零,然后进行拟合,从而使处理后的光谱数据与原光谱数据大小一致。

下面是实现代码:


 
 
   
   
   
   
  1. function pdata=moving_average(data,window)
  2. %该函数实现对数据的移动窗口平均平滑
  3. %data为输入的原始数据,window为窗口大小,pdata为输出数据
  4. %Author:等等登登-ande
  5. %Email: 18356768364@163.com
  6. [m,n] = size(data);
  7. pdata = zeros(m,n);
  8. %参数初始化
  9. if nargin == 1
  10. window = 3;
  11. elseif round(window/ 2) == window/ 2
  12. error( '光谱窗口宽度必须是奇数')
  13. end
  14. %对原始数据进行补零
  15. center = floor(window/ 2);
  16. extdata = [zeros(m,center) data zeros(m,center)];
  17. %对补零后的数据进行拟合
  18. for k = 1 :m
  19. start = polyfit(center+ 1 :center+ 4,extdata(k,center+ 1 :center+ 4), 2);
  20. extdata(k, 1 :center) = polyval(start, 1 :center);
  21. bend = polyfit(n- 3+ center:n+center,extdata(k,n- 3+ center:n+center), 2);
  22. extdata(k,n+center+ 1 :n+window- 1) = polyval(bend,n+center+ 1 :n+window- 1);
  23. end
  24. %求平滑后的数据
  25. for i = 1+ center:n+center
  26. pdata( :,i-center) = mean(extdata( :,i- center:i+center) ')';
  27. end

处理结果:

高光谱数据预处理之移动窗口平均平滑算法_第1张图片 原始数据
高光谱数据预处理之移动窗口平均平滑算法_第2张图片 平滑数据

Get better every day!!! 

你可能感兴趣的:(高光谱技术)