# SIF项目数据预处理 DarK_temp文件解析 第一行:温度数值 一般为4个 第二行:曝光时间 自己设定 一般为16个 第三行到 第三+1043行为第一个温度时各个曝光时间的暗电流 第3+1044至 3+1044+1043行 第二个温度所对应的各个曝光时间的暗电流 。。。。。。。。。 第3+n*1044至3+1044**n+1043。。。以此类推 个数与温度个数对应 数据预处理步骤如下所示 一步一步来 ## 1、暗电流校正 #### 1.1、暗电流不同积分时间调整 距离加权平均插值法 ```python def interp_IT_single(ilist, inttime, rawdata): dark_DN = dark_DN_list[ilist] minvalue = min(abs(dark_it - inttime * 1000.0))#所有暗电流曝光时间减去数据曝光时间的平均值 minpos = np.argmin(abs(dark_it - inttime * 1000.0))# 绝对值最小值位置 说白了就是寻找离其最近的值 if ((inttime * 1000 - dark_it[0]) * (inttime * 1000 - dark_it[-1]) < 0): tmp_it = dark_it.copy()#复制下 tmp_DN = dark_DN.copy()#复制下 tmp_it[minpos] = -9999999 #将距离最近的值设置程-999999 设置程最远的 minvalue1 = min(abs(tmp_it - inttime * 1000.0))#此时最近的值 也就是第二 minpos1 = np.argmin(abs(tmp_it - inttime * 1000.0))#对应的位置 wf = minvalue / abs(dark_it[minpos] - tmp_it[minpos1])#权重1 wf1 = minvalue1 / abs(dark_it[minpos] - tmp_it[minpos1])#权重2 dark = dark_DN[:, minpos] * wf1 + tmp_DN[:, minpos1] * wf#加权平均 真是无聊到头了 服气了 else: dark = dark_DN[:, minpos]#在两侧 时直接等于离最近的一端 dark_BG = np.mean(dark[idark]) #暗电流平均值 背景? 前4后4 DRIFT 应用 #DRIFT 应用 注意此时应用了Drift思想 target_BG = np.mean(rawdata[idark])#数据的平均值 前4后4 #Drift暗电流修正公式 target_dark = (dark - dark_BG) * dark_it[minpos] / inttime / 1000.0 + target_BG # 暗电流修正公式 终于找到公式了 气死我了!!!!!!!!! target = rawdata - target_dark#扣暗电流 同上 return (target, target_dark, target_BG) ``` #### 1.2、暗电流不同温度调整 ​ 距离加权平均插值法 ```python dark_Temp = dark_data['Temp'] #获取数据温度 nrecords = len(data['IT'])#数据个数 target = np.zeros((nbands, nrecords))#构造一个空数组 存放扣完暗电流数据 for k in range(len(Temp)): #每次处理5个数据 不用管 忽略 inttime = data['IT'][k] #获取k个数据的曝光时间 rawdata = data['DN'][:, k] #获取第k数据DN #开始处理 #数据温度小于在dark Temp 最小的一个温度 则取第一个温度对应的暗电流 if (Temp[k] <= dark_Temp[0]): #见曝光时间的调整 (target[:, k], data['DarkDN'][:, k], data['BG'][:, k]) = interp_IT_single(0, inttime, rawdata) #数据温度大于在dark Temp 最小的一个温度 则取最后一个温度对应的暗电流 elif (Temp[k] >= dark_Temp[-1]): (target[:, k], data['DarkDN'][:, k], data['BG'][:, k]) = interp_IT_single(-1, inttime, rawdata) else: #如果数据温度处在中间 如下: #获取离离数据温度最近的数据下标(小于数据温度的那个) iloc= np.argmin(np.abs(dark_Temp - Temp[k])) #获取离离数据温度第二最近的数据下标(大于数据温度的那个) #说白了就是找到大于数据温度的哪一个和小于数据温度的哪一个 思维太奇特了。。。。。 ilower, iupper = iloc, iloc+1 #用小于数据温度的暗电流求取一次 (l_tar, l_tar_dark, l_tar_BG) = interp_IT_single(ilower, inttime, rawdata) #用大于数据温度的暗电流求取一次 (u_tar, u_tar_dark, u_tar_BG) = interp_IT_single(iupper, inttime, rawdata) #求取小于温度所得暗电流(此时是扣完暗电流后的数据 意思一样)的权重 weight = (Temp[k] - dark_Temp[ilower]) / (dark_Temp[iupper] - dark_Temp[ilower]) #加权平均 target[:, k] = (1-weight)*l_tar + weight*u_tar #后面不用管 data['DarkDN'][:, k] = (1-weight)*l_tar_dark + weight*u_tar_dark data['BG'][:, k] = (1-weight)*l_tar_BG + weight*u_tar_BG ``` ​ #### 1.3、Drift暗电流修正 ​ 如下 ```python dark_BG = np.mean(dark[idark]) #暗电流平均值 背景? 前4后4 DRIFT 应用 #DRIFT 应用 注意此时应用了Drift思想 target_BG = np.mean(rawdata[idark])#数据的平均值 前4后4 #Drift暗电流修正公式 target_dark = (dark - dark_BG) * dark_it[minpos] / inttime / 1000.0 + target_BG ``` ​ ## 2、非线性数据校正 对扣除暗电流后的数据机型非线性数据校正 代码如下 ```python def nonlinear_correction(nl_coeff,DN): corrected_DN = DN/(nl_coeff[0]+nl_coeff[1]*DN+nl_coeff[2]*DN**2+ nl_coeff[3]*DN**3+nl_coeff[4]*DN**4+nl_coeff[5]*DN**5+ nl_coeff[6]*DN**6+nl_coeff[7]*DN**7) return corrected_DN ``` 其中 DN为扣除暗电流后的DN值 nl_coeff为 nonlinear.txt中读取的值 ## 3、数据辐射校正 $$ \frac{DN*Coe_{cal}*IT_{Cal}} {IT_{data}*1000} $$ $$ DN $$ : 扣除暗电流及进行线性校正后的DN值 $$ Coe_{cal} $$ : 模型参数 从main_QEP00000.py得到的两个xlxs文件中读取 $$ IT_{Cal} $$ : 定标文件的曝光时间 从xlxs中读取 $$ IT_{data} $$ : 数据的曝光时间 xlxs文件中第一个表为三列coe值 第二个表为三个曝光时间值 第三个表为波长 上述三个值中杨老师选取的中间哪一个 不知道为啥