Files
Documnt/SIF定标.md
2020-11-24 15:05:55 +08:00

152 lines
5.9 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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值 第二个表为三个曝光时间值 第三个表为波长
上述三个值中杨老师选取的中间哪一个 不知道为啥