From 28428670b7bb7645f290efd56663fa38cb6b91ad Mon Sep 17 00:00:00 2001 From: xin Date: Tue, 24 Nov 2020 15:05:55 +0800 Subject: [PATCH] add sif --- SIF定标.md | 151 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 SIF定标.md diff --git a/SIF定标.md b/SIF定标.md new file mode 100644 index 0000000..19b018a --- /dev/null +++ b/SIF定标.md @@ -0,0 +1,151 @@ +# 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值 第二个表为三个曝光时间值 第三个表为波长 + +上述三个值中杨老师选取的中间哪一个 不知道为啥 +