示例#1
0
    def save_fine_data(self, modeCfg):
        """
        第二轮匹配,根据各通道的的mean和std计以为,角度和距离等进行精细化过滤
        """

        # 最终的公共匹配点数量
        idx = np.where(self.PubIdx > 0)
        if len(idx[0]) == 0:
            return
        print u'所有粗匹配点数目 ', len(idx[0])

        # 掩码清零
        self.MaskRough[:] = 0

        # 计算共同区域的距离差 #########
        disDiff = np.full_like(self.S1_Time, '-1', dtype='i2')
        a = np.power(self.S2_Lon[idx] - self.S1_Lon[idx], 2)
        b = np.power(self.S2_Lat[idx] - self.S1_Lat[idx], 2)
        disDiff[idx] = np.sqrt(a + b) * 100.

        idx_Rough = np.logical_and(disDiff < modeCfg.distdif_max, disDiff >= 0)
        idx1 = np.where(idx_Rough)
        print u'1. 距离过滤后剩余点 ', len(idx1[0])

        timeDiff = np.abs(self.S1_Time - self.S2_Time)

        idx_Rough = np.logical_and(idx_Rough, timeDiff <= modeCfg.timedif_max)
        idx1 = np.where(idx_Rough)
        print u'2. 时间过滤后剩余点 ', len(idx1[0])
        # 过滤太阳天顶角 ###############
        idx_Rough = np.logical_and(
            idx_Rough, self.S1_SoZ <= modeCfg.solzenith_max)
        idx_Rough = np.logical_and(
            idx_Rough, self.S2_SoZ <= modeCfg.solzenith_max)
        idx1 = np.where(idx_Rough)
        print u'3. 太阳天顶角过滤后剩余点 ', len(idx1[0])

        # 计算耀斑角 ###############
        glint1 = np.full_like(self.S1_SatZ, -999.)
        glint2 = np.full_like(self.S1_SatZ, -999.)

        glint1[idx] = sun_glint_cal(
            self.S1_SatA[idx], self.S1_SatZ[idx], self.S1_SoA[idx], self.S1_SoZ[idx])
        glint2[idx] = sun_glint_cal(
            self.S2_SatA[idx], self.S2_SatZ[idx], self.S2_SoA[idx], self.S2_SoZ[idx])

        idx_Rough = np.logical_and(idx_Rough, glint1 > modeCfg.solglint_min)
        idx_Rough = np.logical_and(idx_Rough, glint2 > modeCfg.solglint_min)
        print np.nanmin(glint1[idx]), np.nanmax(glint1[idx])
        print np.nanmin(glint2[idx]), np.nanmax(glint2[idx])
        idx1 = np.where(idx_Rough)
        print u'4. 太阳耀斑角过滤后剩余点 ', len(idx1[0])

        # 角度均匀性 #################
        SatZRaio = np.full_like(self.S1_Time, 9999)
        SatZ1 = np.cos(self.S1_SatZ[idx] * np.pi / 180.)
        SatZ2 = np.cos(self.S2_SatZ[idx] * np.pi / 180.)
        SatZRaio[idx] = np.abs(SatZ1 / SatZ2 - 1.)

        idx_Rough = np.logical_and(idx_Rough, SatZRaio <= modeCfg.angledif_max)
        idx1 = np.where(idx_Rough)
        print u'5. 卫星天顶角均匀性过滤后剩余点 ', len(idx1[0])

        idx_Rough = np.logical_and(
            idx_Rough, self.S1_SatZ <= modeCfg.satzenith_max)
        idx1 = np.where(idx_Rough)
        print u'6. FY卫星观测角(天顶角)滤后剩余点 ', len(idx1[0])
        self.MaskRough[idx1] = 1

        for Band1 in modeCfg.chan1:
            # 掩码清零
            self.MaskFine[Band1][:] = 0

            th_vaue_max = modeCfg.CH_threshold[Band1]['value_max']
            th1 = modeCfg.CH_threshold[Band1]['angledif_max']
            th2 = modeCfg.CH_threshold[Band1]['homodif_fov_max']
            th3 = modeCfg.CH_threshold[Band1]['homodif_env_max']
            th4 = modeCfg.CH_threshold[Band1]['homodif_fov_env_max']

            flag = 0

            # 可见光通道
            if hasattr(self, 'S1_FovRefMean') and Band1 in self.S1_FovRefMean.keys():
                flag = 'vis'
                homoFov1 = np.abs(
                    self.S1_FovRefStd[Band1] / self.S1_FovRefMean[Band1])
                homoEnv1 = np.abs(
                    self.S1_EnvRefStd[Band1] / self.S1_EnvRefMean[Band1])
                homoFovEnv1 = np.abs(
                    self.S1_FovRefMean[Band1] / self.S1_EnvRefMean[Band1] - 1)
                homoValue1 = self.S1_FovRefMean[Band1]

                homoFov2 = np.abs(
                    self.S2_FovRefStd[Band1] / self.S2_FovRefMean[Band1])
                homoEnv2 = np.abs(
                    self.S2_EnvRefStd[Band1] / self.S2_EnvRefMean[Band1])
                homoFovEnv2 = np.abs(
                    self.S2_FovRefMean[Band1] / self.S2_EnvRefMean[Band1] - 1)
                homoValue2 = self.S2_FovRefMean[Band1]

            condition = np.logical_and(self.MaskRough > 0, True)
            condition = np.logical_and(SatZRaio < th1, condition)
            idx = np.where(condition)
            print u'%s %s 角度均匀性过滤后,精匹配点个数 %d' % (Band1, flag, len(idx[0]))

            condition = np.logical_and(homoValue1 < th_vaue_max, condition)
            condition = np.logical_and(homoValue1 > 0, condition)
            idx = np.where(condition)
            print u'%s %s 饱和值过滤后,精匹配点个数 %d' % (Band1, flag, len(idx[0]))

            condition = np.logical_and(homoFov1 < th2, condition)
            idx = np.where(condition)
            print u'%s %s 靶区过滤后,精匹配点个数 %d' % (Band1, flag, len(idx[0]))

            condition = np.logical_and(homoEnv1 < th3, condition)
            idx = np.where(condition)
            print u'%s %s 环境过滤后,精匹配点个数 %d' % (Band1, flag, len(idx[0]))

            condition = np.logical_and(homoFovEnv1 < th4, condition)
            idx = np.where(condition)
            print u'%s %s 靶区环境过滤后,精匹配点个数 %d' % (Band1, flag, len(idx[0]))

            # sat 2过滤

            condition = np.logical_and(homoValue2 > 0, condition)
            condition = np.logical_and(homoValue2 < th_vaue_max, condition)
            idx = np.where(condition)
            print u'%s %s 饱和值2过滤后,精匹配点个数 %d' % (Band1, flag, len(idx[0]))

            condition = np.logical_and(homoFov2 < th2, condition)
            idx = np.where(condition)
            print u'%s %s 靶区2过滤后,精匹配点个数 %d' % (Band1, flag, len(idx[0]))

            condition = np.logical_and(homoEnv2 < th3, condition)
            idx = np.where(condition)
            print u'%s %s 环境2过滤后,精匹配点个数 %d' % (Band1, flag, len(idx[0]))

            condition = np.logical_and(homoFovEnv2 < th4, condition)
            idx = np.where(condition)
            print u'%s %s 靶区环境2过滤后,精匹配点个数 %d' % (Band1, flag, len(idx[0]))

            self.MaskFine[Band1][idx] = 1
示例#2
0
    def save_fine_data(self, modeCfg):
        """
        第二轮匹配,根据各通道的的mean和std计以为,角度和距离等进行精细化过滤
        """

        # 最终的公共匹配点数量
        idx = np.where(self.PubIdx > 0)
        if len(idx[0]) == 0:
            return
        print u'所有粗匹配点数目 ', len(idx[0])

        # 掩码清零
        self.MaskRough[:] = 0

        # 计算共同区域的距离差 #########
        disDiff = np.full_like(self.S1_Time, '-1', dtype='i2')
        a = np.power(self.S2_Lon[idx] - self.S1_Lon[idx], 2)
        b = np.power(self.S2_Lat[idx] - self.S1_Lat[idx], 2)
        disDiff[idx] = np.sqrt(a + b) * 100.

        idx_Rough = np.logical_and(disDiff < modeCfg.distdif_max, disDiff >= 0)
        idx1 = np.where(idx_Rough)
        print u'1. 距离过滤后剩余点 ', len(idx1[0])

        timeDiff = np.abs(self.S1_Time - self.S2_Time)

        idx_Rough = np.logical_and(idx_Rough, timeDiff <= modeCfg.timedif_max)
        idx1 = np.where(idx_Rough)
        print u'2. 时间过滤后剩余点 ', len(idx1[0])
        # 过滤太阳天顶角 ###############
        idx_Rough = np.logical_and(idx_Rough,
                                   self.S1_SoZ <= modeCfg.solzenith_max)
        idx_Rough = np.logical_and(idx_Rough,
                                   self.S2_SoZ <= modeCfg.solzenith_max)
        idx1 = np.where(idx_Rough)
        print u'3. 太阳天顶角过滤后剩余点 ', len(idx1[0])

        # 计算耀斑角 ###############
        glint1 = np.full_like(self.S1_SatZ, -999.)
        glint2 = np.full_like(self.S1_SatZ, -999.)

        glint1[idx] = sun_glint_cal(self.S1_SatA[idx], self.S1_SatZ[idx],
                                    self.S1_SoA[idx], self.S1_SoZ[idx])
        glint2[idx] = sun_glint_cal(self.S2_SatA[idx], self.S2_SatZ[idx],
                                    self.S2_SoA[idx], self.S2_SoZ[idx])

        idx_Rough = np.logical_and(idx_Rough, glint1 > modeCfg.solglint_min)
        idx_Rough = np.logical_and(idx_Rough, glint2 > modeCfg.solglint_min)

        idx1 = np.where(idx_Rough)
        print u'4. 太阳耀斑角过滤后剩余点 ', len(idx1[0])

        # 角度均匀性 #################
        SatZRaio = np.full_like(self.S1_Time, 9999)
        SatZ1 = np.cos(self.S1_SatZ[idx] * np.pi / 180.)
        SatZ2 = np.cos(self.S2_SatZ[idx] * np.pi / 180.)
        SatZRaio[idx] = np.abs(SatZ1 / SatZ2 - 1.)

        idx_Rough = np.logical_and(idx_Rough, SatZRaio <= modeCfg.angledif_max)
        idx1 = np.where(idx_Rough)
        print u'5. 卫星天顶角均匀性过滤后剩余点 ', len(idx1[0])

        idx_Rough = np.logical_and(idx_Rough,
                                   self.S1_SatZ <= modeCfg.satzenith_max)
        idx1 = np.where(idx_Rough)
        print u'6. FY卫星观测角(天顶角)滤后剩余点 ', len(idx1[0])
        self.MaskRough[idx1] = 1

        # 添加spec, 粗匹配后剩余的点是要记录光谱谱线的。。。2维转1维下标
        idx_1d = np.ravel_multi_index(idx1, (self.row, self.col))

        if modeCfg.write_spec:
            # 定义spec_MaskRough_value 然后记录需要保存的谱线
            if hasattr(self, 'S2_Spec_all'):
                for i in idx_1d:
                    self.S2_Spectral.append(self.S2_Spec_all[i])
                self.S2_Spectral = np.array(self.S2_Spectral)

                # 记录根据MaskRough表记录的格点信息
                self.S2_Spec_row = idx1[0]
                self.S2_Spec_col = idx1[1]

        for Band1 in modeCfg.chan1:
            # 掩码清零
            self.MaskFine[Band1][:] = 0

            th_vaue_max = modeCfg.CH_threshold[Band1]['value_max']
            th1 = modeCfg.CH_threshold[Band1]['angledif_max']
            th2 = modeCfg.CH_threshold[Band1]['homodif_fov_max']
            th3 = modeCfg.CH_threshold[Band1]['homodif_env_max']
            th4 = modeCfg.CH_threshold[Band1]['homodif_fov_env_max']

            th_cld1 = modeCfg.CH_threshold[Band1]['cld_angledif_max']
            th_cld2 = modeCfg.CH_threshold[Band1]['cld_homodif_fov_max']
            th_cld3 = modeCfg.CH_threshold[Band1]['cld_homodif_env_max']
            th_cld4 = modeCfg.CH_threshold[Band1]['cld_homodif_fov_env_max']

            flag = 0
            # 如果 rad和tbb都有就用rad 做均匀性判断
            if hasattr(self,
                       'S1_FovRadMean') and Band1 in self.S1_FovRadMean.keys():
                flag = 'ir'
                # 固定通道值用于检测红外晴空和云
                #                 irValue = self.FovTbbMean1[modeCfg.clear_band_ir]
                homoFov1 = np.abs(self.S1_FovRadStd[Band1] /
                                  self.S1_FovRadMean[Band1])
                homoEnv1 = np.abs(self.S1_EnvRadStd[Band1] /
                                  self.S1_EnvRadMean[Band1])
                homoFovEnv1 = np.abs(self.S1_FovRadMean[Band1] /
                                     self.S1_EnvRadMean[Band1] - 1)
                homoValue1 = self.S1_FovRadMean[Band1]

                homoFov2 = np.abs(self.S2_FovRadStd[Band1] /
                                  self.S2_FovRadMean[Band1])
                homoEnv2 = np.abs(self.S2_EnvRadStd[Band1] /
                                  self.S2_EnvRadMean[Band1])
                homoFovEnv2 = np.abs(self.S2_FovRadMean[Band1] /
                                     self.S2_EnvRadMean[Band1] - 1)
                homoValue2 = self.S2_FovRadMean[Band1]

            # 如果只有 tbb 就用tbb
            if hasattr(self,
                       'S1_FovTbbMean') and not hasattr(self, 'S1_FovRadMean'):
                if Band1 in self.S1_FovTbbMean.keys():
                    flag = 'ir'
                    # 固定通道值用于检测红外晴空和云
                    #                 irValue = self.FovTbbMean1[modeCfg.clear_band_ir]
                    homoFov1 = np.abs(self.FovTbbStd1[Band1] /
                                      self.FovTbbMean1[Band1])
                    homoEnv1 = np.abs(self.EnvTbbStd1[Band1] /
                                      self.EnvTbbMean1[Band1])
                    homoFovEnv1 = np.abs(self.FovTbbMean1[Band1] /
                                         self.EnvTbbMean1[Band1] - 1)
                    homoValue1 = self.FovTbbMean1[Band1]
                    homoFov2 = np.abs(self.FovTbbStd2[Band1] /
                                      self.FovTbbMean2[Band1])
                    homoEnv2 = np.abs(self.EnvTbbStd2[Band1] /
                                      self.EnvTbbMean2[Band1])
                    homoFovEnv2 = np.abs(self.FovTbbMean2[Band1] /
                                         self.EnvTbbMean2[Band1] - 1)
                    homoValue2 = self.FovTbbMean2[Band1]
            # 可见光通道
            if hasattr(self,
                       'S1_FovRefMean') and Band1 in self.S1_FovRefMean.keys():
                flag = 'vis'
                #                 visValue = self.FovRefMean1[modeCfg.clear_band_vis]
                homoFov1 = np.abs(self.S1_FovRefStd[Band1] /
                                  self.S1_FovRefMean[Band1])
                homoEnv1 = np.abs(self.S1_EnvRefStd[Band1] /
                                  self.S1_EnvRefMean[Band1])
                homoFovEnv1 = np.abs(self.S1_FovRefMean[Band1] /
                                     self.S1_EnvRefMean[Band1] - 1)
                homoValue1 = self.S1_FovRefMean[Band1]

                homoFov2 = np.abs(self.S2_FovRefStd[Band1] /
                                  self.S2_FovRefMean[Band1])
                homoEnv2 = np.abs(self.S2_EnvRefStd[Band1] /
                                  self.S2_EnvRefMean[Band1])
                homoFovEnv2 = np.abs(self.S2_FovRefMean[Band1] /
                                     self.S2_EnvRefMean[Band1] - 1)
                homoValue2 = self.S2_FovRefMean[Band1]

            # 云判识关闭状态 ####
            if (modeCfg.clear_min_ir == 0
                    and 'ir' in flag) or (modeCfg.clear_max_vis == 0
                                          and 'vis' in flag):

                condition = np.logical_and(self.MaskRough > 0, True)
                condition = np.logical_and(SatZRaio < th1, condition)
                idx = np.where(condition)
                print u'%s %s 云判识关闭,角度均匀性过滤后,精匹配点个数 %d' % (Band1, flag,
                                                           len(idx[0]))

                condition = np.logical_and(homoFov1 < th2, condition)
                idx = np.where(condition)
                print u'%s %s 云判识关闭,靶区过滤后,精匹配点个数 %d' % (Band1, flag, len(
                    idx[0]))

                condition = np.logical_and(homoEnv1 < th3, condition)
                idx = np.where(condition)
                print u'%s %s 云判识关闭,环境过滤后,精匹配点个数 %d' % (Band1, flag, len(
                    idx[0]))

                condition = np.logical_and(homoFovEnv1 < th4, condition)
                idx = np.where(condition)
                print u'%s %s 云判识关闭,靶区环境过滤后,精匹配点个数 %d' % (Band1, flag,
                                                          len(idx[0]))

                condition = np.logical_and(homoValue1 < th_vaue_max, condition)
                condition = np.logical_and(homoValue1 > 0, condition)
                idx = np.where(condition)
                print u'%s %s 云判识关闭,饱和值过滤后,精匹配点个数 %d' % (Band1, flag,
                                                         len(idx[0]))

                # sat 2过滤

                condition = np.logical_and(homoFov2 < th2, condition)
                idx = np.where(condition)
                print u'%s %s 云判识关闭,靶区2过滤后,精匹配点个数 %d' % (Band1, flag,
                                                         len(idx[0]))

                condition = np.logical_and(homoEnv2 < th3, condition)
                idx = np.where(condition)
                print u'%s %s 云判识关闭,环境2过滤后,精匹配点个数 %d' % (Band1, flag,
                                                         len(idx[0]))

                condition = np.logical_and(homoFovEnv2 < th4, condition)
                idx = np.where(condition)
                print u'%s %s 云判识关闭,靶区环境2过滤后,精匹配点个数 %d' % (Band1, flag,
                                                           len(idx[0]))

                condition = np.logical_and(homoValue2 > 0, condition)
                condition = np.logical_and(homoValue2 < th_vaue_max, condition)
                idx = np.where(condition)
                print u'%s %s 云判识关闭,饱和值2过滤后,精匹配点个数 %d' % (Band1, flag,
                                                          len(idx[0]))
                self.MaskFine[Band1][idx] = 1

            # 云判识开启状态 ####
            else:
                # 晴空判别
                if 'ir' in flag:
                    # 固定通道值用于检测可见晴空和云
                    irValue = self.S1_FovTbbMean[modeCfg.clear_band_ir]
                    condition = np.logical_and(self.MaskRough > 0,
                                               irValue >= modeCfg.clear_min_ir)
                elif 'vis' in flag:
                    # 固定通道值用于检测可见晴空和云
                    visValue = self.S1_FovRefMean[modeCfg.clear_band_vis]
                    condition = np.logical_and(
                        self.MaskRough > 0, visValue < modeCfg.clear_max_vis)
                    condition = np.logical_and(visValue > 0, condition)

                idx = np.where(condition)

                test_idx = np.where(self.MaskRough > 0)
                #                 print len(test_idx[0])
                #                 print modeCfg.clear_band_ir, modeCfg.clear_min_ir
                #                 print np.min(irValue[test_idx]), np.max(irValue[test_idx])
                print u'%s %s 云判识开启,晴空点个数 %d' % (Band1, flag, len(idx[0]))
                condition = np.logical_and(SatZRaio < th1, condition)
                idx = np.where(condition)
                print u'%s %s 云判识开启,晴空点中 角度 均匀过滤后, 精匹配点个数 %d' % (Band1, flag,
                                                                 len(idx[0]))
                condition = np.logical_and(homoFov1 < th2, condition)
                idx = np.where(condition)
                print u'%s %s 云判识开启,晴空点中 靶区1 均匀过滤后, 精匹配点个数 %d' % (Band1, flag,
                                                                  len(idx[0]))
                condition = np.logical_and(homoEnv1 < th3, condition)
                idx = np.where(condition)
                print u'%s %s 云判识开启,晴空点中 环境1 均匀过滤后, 精匹配点个数 %d' % (Band1, flag,
                                                                  len(idx[0]))
                condition = np.logical_and(homoFovEnv1 < th4, condition)
                idx = np.where(condition)
                print u'%s %s 云判识开启,晴空点中 靶区/环境 1 均匀过滤后, 精匹配点个数 %d' % (
                    Band1, flag, len(idx[0]))
                condition = np.logical_and(homoValue1 > 0, condition)
                condition = np.logical_and(homoValue1 < th_vaue_max, condition)

                idx = np.where(condition)
                print u'%s %s 云判识开启,晴空点中 饱和值1 均匀过滤后, 精匹配点个数 %d' % (Band1, flag,
                                                                   len(idx[0]))

                condition = np.logical_and(homoFov2 < th2, condition)
                idx = np.where(condition)
                print u'%s %s 云判识开启,晴空点中 靶区2 均匀过滤后, 精匹配点个数 %d' % (Band1, flag,
                                                                  len(idx[0]))
                condition = np.logical_and(homoEnv2 < th3, condition)
                idx = np.where(condition)
                print u'%s %s 云判识开启,晴空点中 环境2 均匀过滤后, 精匹配点个数 %d' % (Band1, flag,
                                                                  len(idx[0]))
                condition = np.logical_and(homoFovEnv2 < th4, condition)
                idx = np.where(condition)
                print u'%s %s 云判识开启,晴空点中 靶区/环境 2 均匀过滤后, 精匹配点个数 %d' % (
                    Band1, flag, len(idx[0]))
                condition = np.logical_and(homoValue2 > 0, condition)
                condition = np.logical_and(homoValue2 < th_vaue_max, condition)

                idx = np.where(condition)
                print u'%s %s 云判识开启,晴空点中 饱和值1 均匀过滤后, 精匹配点个数 %d' % (Band1, flag,
                                                                   len(idx[0]))
                idx_clear = np.where(condition)
                self.MaskFine[Band1][idx_clear] = 1

                # 云区判别
                if 'ir' in flag:
                    condition = np.logical_and(self.MaskRough > 0,
                                               irValue < modeCfg.clear_min_ir)
                    condition = np.logical_and(irValue > 0, condition)
                elif 'vis' in flag:
                    condition = np.logical_and(
                        self.MaskRough > 0, visValue >= modeCfg.clear_max_vis)

                idx = np.where(condition)
                print u'%s %s 云判识开启,云区点个数 %d' % (Band1, flag, len(idx[0]))

                condition = np.logical_and(SatZRaio < th_cld1, condition)
                idx = np.where(condition)
                print u'%s %s 云判识开启,云区点中 角度 均匀过滤后, 精匹配点个数 %d' % (Band1, flag,
                                                                 len(idx[0]))
                condition = np.logical_and(homoFov1 < th_cld2, condition)
                idx = np.where(condition)
                print u'%s %s 云判识开启,云区点中 靶区1 均匀过滤后, 精匹配点个数 %d' % (Band1, flag,
                                                                  len(idx[0]))
                condition = np.logical_and(homoEnv1 < th_cld3, condition)
                idx = np.where(condition)
                print u'%s %s 云判识开启,云区点中 环境1 均匀过滤后, 精匹配点个数 %d' % (Band1, flag,
                                                                  len(idx[0]))
                condition = np.logical_and(homoFovEnv1 < th_cld4, condition)
                idx = np.where(condition)
                print u'%s %s 云判识开启,云区点中 靶区/环境 1 均匀过滤后, 精匹配点个数 %d' % (
                    Band1, flag, len(idx[0]))
                condition = np.logical_and(homoValue1 > 0, condition)
                condition = np.logical_and(homoValue1 < th_vaue_max, condition)

                idx = np.where(condition)
                print u'%s %s 云判识开启,云区点中 饱和值1 均匀过滤后, 精匹配点个数 %d' % (Band1, flag,
                                                                   len(idx[0]))

                condition = np.logical_and(homoFov2 < th_cld2, condition)
                idx = np.where(condition)
                print u'%s %s 云判识开启,云区点中 靶区2 均匀过滤后, 精匹配点个数 %d' % (Band1, flag,
                                                                  len(idx[0]))
                condition = np.logical_and(homoEnv2 < th_cld3, condition)
                idx = np.where(condition)
                print u'%s %s 云判识开启,云区点中 环境2 均匀过滤后, 精匹配点个数 %d' % (Band1, flag,
                                                                  len(idx[0]))
                condition = np.logical_and(homoFovEnv2 < th_cld4, condition)
                idx = np.where(condition)
                print u'%s %s 云判识开启,云区点中 靶区/环境 2 均匀过滤后, 精匹配点个数 %d' % (
                    Band1, flag, len(idx[0]))
                condition = np.logical_and(homoValue2 > 0, condition)
                condition = np.logical_and(homoValue2 < th_vaue_max, condition)

                idx = np.where(condition)
                print u'%s %s 云判识开启,云区点中 饱和值1 均匀过滤后, 精匹配点个数 %d' % (Band1, flag,
                                                                   len(idx[0]))

                idx_cloud = np.where(condition)
                totalNums = len(idx_cloud[0]) + len(idx_clear[0])
                print u'%s %s 云判识开启,匹配点个数,晴空 %d 云区 %d 总计:%d' % (
                    Band1, flag, len(idx_clear[0]), len(
                        idx_cloud[0]), totalNums)
                self.MaskFine[Band1][idx_cloud] = 1
示例#3
0
    def save_fine_data(self, modeCfg):
        """
        第二轮匹配,根据各通道的的mean和std计以为,角度和距离等进行精细化过滤
        """

        # 最终的公共匹配点数量
        idx = np.where(self.PubIdx > 0)
        if len(idx[0]) == 0:
            return
        print u'所有粗匹配点数目 ', len(idx[0])

        # 掩码清零
        self.MaskRough[:] = 0

        # 计算共同区域的距离差 #########
        disDiff = np.full_like(self.MERSI_Lons, '-1', dtype='i2')
        a = np.power(self.MODIS_Lons[idx] - self.MERSI_Lons[idx], 2)
        b = np.power(self.MODIS_Lats[idx] - self.MERSI_Lats[idx], 2)
        disDiff[idx] = np.sqrt(a + b) * 100.

        idx_Rough = np.logical_and(disDiff < modeCfg.distdif_max, disDiff >= 0)
        idx1 = np.where(idx_Rough)
        print u'1. 距离过滤后剩余点 ', len(idx1[0])

        # 过滤太阳天顶角 ###############
        idx_Rough = np.logical_and(
            idx_Rough, self.MERSI_SoZ <= modeCfg.solzenith_max)
        idx1 = np.where(idx_Rough)
        print u'2. 太阳天顶角过滤后剩余点 ', len(idx1[0])

        # 计算耀斑角 ###############
        glint1 = np.full_like(self.MERSI_SatZ, -999.)

        glint1[idx] = sun_glint_cal(
            self.MERSI_SatA[idx], self.MERSI_SatZ[idx], self.MERSI_SoA[idx], self.MERSI_SoZ[idx])

        idx_Rough = np.logical_and(idx_Rough, glint1 > modeCfg.solglint_min)
        print np.nanmin(glint1[idx]), np.nanmax(glint1[idx])
        idx1 = np.where(idx_Rough)
        print u'3. 太阳耀斑角过滤后剩余点 ', len(idx1[0])

        idx_Rough = np.logical_and(
            idx_Rough, self.MERSI_SatZ <= modeCfg.satzenith_max)
        idx1 = np.where(idx_Rough)
        print u'4. FY卫星观测角(天顶角)滤后剩余点 ', len(idx1[0])
        self.MaskRough[idx1] = 1

        for Band1 in modeCfg.chan1:
            # 掩码清零
            self.MaskFine[Band1][:] = 0

            th_vaue_max = modeCfg.CH_threshold[Band1]['value_max']
            th2 = modeCfg.CH_threshold[Band1]['homodif_fov_max']

            flag = 0

            # 可见光通道
            if hasattr(self, 'MERSI_FovMean') and Band1 in self.MERSI_FovMean.keys():
                flag = 'vis'
                print '1111', Band1
                homoFov1 = np.abs(
                    self.MERSI_FovStd[Band1] / self.MERSI_FovMean[Band1])
                homoValue1 = self.MERSI_FovMean[Band1]

                homoFov2 = np.abs(
                    self.MODIS_FovStd[Band1] / self.MODIS_FovMean[Band1])
                homoValue2 = self.MODIS_FovMean[Band1]

            condition = np.logical_and(self.MaskRough > 0, True)
            condition = np.logical_and(homoValue1 < th_vaue_max, condition)
            condition = np.logical_and(homoValue1 > 0, condition)
            idx = np.where(condition)
            print u'%s %s 饱和值过滤后,精匹配点个数 %d' % (Band1, flag, len(idx[0]))

            condition = np.logical_and(homoFov1 < th2, condition)
            idx = np.where(condition)
            print u'%s %s 靶区过滤后,精匹配点个数 %d' % (Band1, flag, len(idx[0]))

            # sat 2过滤

            condition = np.logical_and(homoValue2 > 0, condition)
            condition = np.logical_and(homoValue2 < th_vaue_max, condition)
            idx = np.where(condition)
            print u'%s %s 饱和值2过滤后,精匹配点个数 %d' % (Band1, flag, len(idx[0]))

            condition = np.logical_and(homoFov2 < th2, condition)
            idx = np.where(condition)
            print u'%s %s 靶区2过滤后,精匹配点个数 %d' % (Band1, flag, len(idx[0]))

            self.MaskFine[Band1][idx] = 1