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

5.9 KiB
Raw Permalink Blame History

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值 第二个表为三个曝光时间值 第三个表为波长

上述三个值中杨老师选取的中间哪一个 不知道为啥