本文主要是介绍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()
结果:
这篇关于python实现土壤光谱曲线包络线去除的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!