高光谱预处理方法之MSC与SNV——matlab实现

     光谱多元散射校正(MSC的目的:经过散射校正后得到的光谱数据可以有效的消除由于散射水平不同带来的光谱差异,从而增强光谱与数据之间的相关性。

(1)求得所有光谱数据的平均值作为“理想光谱

  计算平均光谱:

(2)每个样品的光谱与平均光谱进行一元线性回归运算,求得各光谱相对于标准光谱的线性平移量(回归常数)倾斜偏移量(回归系数)

  一元线性回归

mibi分别表示各样品近红外光谱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));
end

subplot(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])

 效果图

  • 31
    点赞
  • 239
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 52
    评论
SNV(Standard Normal Variate)光谱预处理是一种常用的光谱预处理方法,可以消除光谱中的散射和背景噪音,提高光谱的信噪比。 在Python中,可以使用scikit-learn库来进行SNV光谱预处理。以下是一个简单的SNV光谱预处理的Python代码示例: ```python import numpy as np from sklearn.preprocessing import StandardScaler def snv_spectra_preprocessing(spectra): # 计算每个波长的平均值 mean_spectrum = np.mean(spectra, axis=0) # 对光谱数据进行中心化 centered_spectra = spectra - mean_spectrum # 计算每个波长的标准差 std_spectrum = np.std(centered_spectra, axis=0) # 计算每个样本的标准差 std_samples = np.std(centered_spectra, axis=1) # 对光谱数据进行缩放,除以每个波长的标准差,乘以每个样本的标准差 snv_spectra = centered_spectra / std_spectrum * std_samples[:, np.newaxis] return snv_spectra # 使用示例 spectra = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 示例光谱数据,假设包含3个样本,每个样本有3个波长 snv_spectra = snv_spectra_preprocessing(spectra) print(snv_spectra) ``` 在上述代码中,`snv_spectra_preprocessing`函数接受一个包含光谱数据的二维数组作为输入。该函数首先计算每个波长的平均值和标准差,然后对光谱数据进行中心化操作,再对数据进行缩放操作以实现SNV预处理。最后,返回经过SNV预处理后的光谱数据。 在示例中,我们定义了一个3x3的光谱数据矩阵,然后调用`snv_spectra_preprocessing`函数进行SNV光谱预处理,并打印预处理后的光谱数据。 请注意,上述代码中只是对光谱数据进行了简单的SNV处理,实际应用中可能需要更复杂的处理步骤,例如使用不同的波长范围、对数转换等。根据具体问题和数据,可以对代码进行调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 52
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

running鸿

感谢感谢各位,祝各位学习进步

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值