高光谱预处理方法之MSC与SNV——matlab实现
???? 光譜多元散射校正(MSC)的目的:經過散射校正后得到的光譜數據可以有效的消除由于散射水平不同帶來的光譜差異,從而增強光譜與數據之間的相關性。
(1)求得所有光譜數據的平均值作為“理想光譜”;
? 計算平均光譜:
(2)將每個樣品的光譜與平均光譜進行一元線性回歸運算,求得各光譜相對于標準光譜的線性平移量(回歸常數)和傾斜偏移量(回歸系數),
? 一元線性回歸:
mi和bi分別表示各樣品近紅外光譜Ai與平均光譜A進行一元線性回歸后得到的相對偏移系數和平移量
(3)在每個樣品原始光譜中減去線性平移量同時除以回歸系數修正光譜的基線相對傾斜,這樣每個光譜的基線平移和偏移都在標準光譜的參考下予以修正,而和樣品成分含量所對應的光譜吸收信息在數據處理的全過程中沒有任何影響,所以提高了光譜的信噪比。
? 多元散射校正:
???? 缺點:首先要求建立一個待測樣品的“理想光譜”,但在實際應用中,“理想光譜”是很難得到的,但通由取所有光譜的平均光譜作為一個理想的標準光譜,用來修正各樣品近紅外光譜間的相對基線平移和偏移現象,是完全可以的。
?
????? 與MSC類似,變量標準化(standard normalized variate,SNV)也可以用來校正樣品間因散射而引起的光譜誤差。但兩者的算法有所不同。
??? SNV是原光譜減去該光譜的平均值𝜇μ后,再除以數據的標準偏差𝜎σ(標度化),實質是使原來的光譜數據標準正態化。
𝑍𝑖=𝑥𝑖?𝜇𝜎Z_i=(x_i-μ)/σ
???? 變量標準化的光譜數據均值為0,標準差為1。由于SNV是對每條光譜單獨進行校正,因此一般認為它的校正能力比MSC要稍微強點,尤其是樣品組之間差異較大的時候。
?Matlab實現MSC代碼:
data = xlsread('C:\Users\HASEE\Desktop\練習數據.xlsx') ;Xnir = data(2:end,1:end) ; [me, ] = mean(Xnir); [m, n] = size(Xnir); for i = 1:m p = polyfit(me, Xnir(i,:),1); Xmsc(i,:) = (Xnir(i,:) - p(2) * ones(1, n))./(p(1) * ones(1, n)); endsubplot(2,2,1) plot(data(1:1,:),Xnir); title("數據集的原始光譜圖") axis([935.0 1635.0,-inf,inf]) subplot(2,2,2) plot(data(1:1,:),Xmsc); title("經過MSC處理后的光譜圖") axis([935.0 1635.0,-inf,inf])? Matlab實現SNV代碼:
data = xlsread('C:\Users\HASEE\Desktop\練習數據.xlsx') ;Xnir = data(2:end,1:end) ; [me, ] = mean(Xnir); [m, n] = size(Xnir); % Xnir 為輸入光譜數據,行為樣本,列為波長點 Xm = mean(Xnir, 2); % 求均值,注意是對行求均值, dX = Xnir - repmat(Xm, 1, n); Xsnv = dX./ repmat(sqrt(sum(dX.^2,2)/n), 1, n) ; subplot(2,2,3) plot(data(1:1,:),Xnir); title("數據集的原始光譜圖") axis([935.0 1635.0,-inf,inf]) subplot(2,2,4) plot(data(1:1,:),Xsnv); title("經過SNV處理后的光譜圖") axis([935.0 1635.0,-inf,inf])?效果圖
總結
以上是生活随笔為你收集整理的高光谱预处理方法之MSC与SNV——matlab实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php--------对象(object
- 下一篇: CCNA day03 实验:三层交换机实