add sif
This commit is contained in:
151
SIF定标.md
Normal file
151
SIF定标.md
Normal file
@ -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值 第二个表为三个曝光时间值 第三个表为波长
|
||||
|
||||
上述三个值中杨老师选取的中间哪一个 不知道为啥
|
||||
|
Reference in New Issue
Block a user