5.9 KiB
5.9 KiB
SIF项目数据预处理
DarK_temp文件解析
第一行:温度数值 一般为4个
第二行:曝光时间 自己设定 一般为16个
第三行到 第三+1043行为第一个温度时各个曝光时间的暗电流
第3+1044至 3+1044+1043行 第二个温度所对应的各个曝光时间的暗电流
。。。。。。。。。
第3+n*1044至3+1044**n+1043。。。以此类推 个数与温度个数对应
数据预处理步骤如下所示 一步一步来
1、暗电流校正
1.1、暗电流不同积分时间调整
距离加权平均插值法
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、暗电流不同温度调整
距离加权平均插值法
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暗电流修正
如下
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、非线性数据校正
对扣除暗电流后的数据机型非线性数据校正
代码如下
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值 第二个表为三个曝光时间值 第三个表为波长
上述三个值中杨老师选取的中间哪一个 不知道为啥