python实现土壤光谱曲线包络线去除

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#去除包络线
def ToEnvelope(x,data):data=np.array(data)LocMaxInd=np.where(np.diff(np.sign(np.diff(data)))<0)[0]+1#找到所有极大值的位置LocMax=data[LocMaxInd]#找到所有极大值#找到最大值的位置MaxInd=LocMaxInd[np.where(LocMax==LocMax.max())]output_x=[MaxInd[0]]#该数组记录包络线最大值在input_x中的索引output_y=[LocMax.max()]#该数组记录选取构成包络线的最大值# 计算最大值右边的包络线Ind_right = np.where(LocMax == LocMax.max())[0][0]  # 最大值在极大值列表中的位置while Ind_right != len(LocMax) - 1:JJ = Ind_rightk_arr = {}for i in np.arange(JJ + 1, len(LocMax)):k_arr[i] = (LocMax[i] - LocMax[JJ]) / (LocMaxInd[i] - LocMaxInd[JJ])  # 计算斜率Ind_right = list(k_arr.keys())[list(k_arr.values()).index(max(list(k_arr.values())))]output_x.append(LocMaxInd[Ind_right])output_y.append(LocMax[Ind_right])if len(x) not in output_x:#将终点加入output_x.append(len(x) - 1)output_y.append(data[-1])# 计算最大值左边的包络线Ind_left = np.where(LocMax == LocMax.max())[0][0]  # 最大值在极大值列表中的位置while Ind_left != 0:JJ = Ind_leftk_arr = {}for i in np.arange(JJ):k_arr[i] = (LocMax[i] - LocMax[JJ]) / (LocMaxInd[i] - LocMaxInd[JJ])  # 计算斜率Ind_left = list(k_arr.keys())[list(k_arr.values()).index(min(list(k_arr.values())))]output_x.insert(0, LocMaxInd[Ind_left])output_y.insert(0, LocMax[Ind_left])if 0 not in output_x:#将初始点加入output_x.insert(0, 0)output_y.insert(0, data[0])output_x = x[output_x]  # 找到包络线点的下标return output_x,output_y
Envelope_x,Envelope_y=ToEnvelope(band_length,SS)#去除包络线之后的点值
#包络线插值
from scipy.interpolate import interp1d
FF=interp1d(Envelope_x,Envelope_y,kind='slinear')#线性插值
Y_pred=FF(band_length)
plt.plot(band_length,SS,label='0')
plt.plot(band_length,Y_pred,label='02')#线性插值
plt.legend()

结果:
后面的就根据原光谱除以


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部