SIMOrthoProgram-Orth_LT1AB-.../Ortho/tool/algorithm/polsarpro/createfeature.py

190 lines
10 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

from tool.algorithm.algtools.MetaDataHandler import Calibration
from tool.algorithm.polsarpro.AHVToPolsarpro import AHVToPolsarpro
from tool.algorithm.polsarpro.pspLeeRefinedFilterT3 import LeeRefinedFilterT3
from tool.algorithm.polsarpro.pspCloudePottierDecomposition import PspCloudePottierDecomposition
from tool.algorithm.polsarpro.pspFreemanDecomposition import PspFreemanDecomposition
from tool.algorithm.polsarpro.pspYamaguchiDecomposition import PspYamaguchiDecomposition
from tool.algorithm.polsarpro.pspTouziDecomposition import PspTouziDecomposition
from tool.algorithm.polsarpro.bin2tif import write_bin_to_tif
from tool.algorithm.polsarpro.pspHAAlphaDecomposition import PspHAAlphaDecomposition
from tool.algorithm.xml.AlgXmlHandle import InitPara
import logging
import os
import shutil
import glob
logger = logging.getLogger("mylog")
class CreateFeature:
"""
生产特征
"""
def __init__(self, debug = False, exe_dir = ''):
self._debug = debug
self._exe_dir = exe_dir
pass
def ahv_to_t3(self, workspace_processing_path, workspace_preprocessing_path, hh_hv_vh_vv_list, name='',FILTER_SIZE=3):
# 全极化tif转bin格式T3数据
atp = AHVToPolsarpro()
atp = AHVToPolsarpro(hh_hv_vh_vv_list)
lee_filter_path = os.path.join(workspace_processing_path, name, 'lee_filter\\') # workspace_processing_path + name + '\\lee_filter\\'
if self._debug == False:
t3_path = os.path.join(workspace_processing_path, name, 'psp_t3\\') # workspace_processing_path + name + '\\psp_t3\\'
# atp.ahv_to_polsarpro_t3(t3_path, tif_path)
polarization = ['HH', 'HV', 'VH', 'VV']
if os.path.exists(workspace_preprocessing_path + name + '\\'):
meta_xml_paths = list(glob.glob(os.path.join(workspace_preprocessing_path + name, '*.meta.xml')))
meta_dic = InitPara.get_meta_dic_new(meta_xml_paths, name)
calibration = Calibration.get_Calibration_coefficient(meta_dic['Origin_META'], polarization)
tif_path = atp.calibration(calibration, workspace_preprocessing_path, name)
atp.ahv_to_polsarpro_t3_veg(t3_path, tif_path)
# Lee滤波
leeFilter = LeeRefinedFilterT3()
leeFilter.api_lee_refined_filter_T3('', t3_path, lee_filter_path, 0, 0, atp.rows(), atp.cols(), FILTER_SIZE)
logger.info("refine_lee filter success!")
return lee_filter_path
def decompose(self,workspace_processing_path, name, t3_path, rows, cols, hh_hv_vh_vv_dic={},FeatureInput=['Freeman', 'Yamaguchi', 'Cloude']): # , 'Touzi'
"""
极化分解Freeman、Touzi、Yamaguchi、Cloude
:param t3_path: t3文件路径
:param rows: 影像行数
:return cols:影像列数
"""
# 计算特征组合
exeDir = self._exe_dir
outFolderDic = {}
if 'Freeman' in FeatureInput:
# freeman分解
freemanOutDir = os.path.join(workspace_processing_path, name + '\\freeman\\')
if self._debug == False:
freemDecom = PspFreemanDecomposition(exeDir, t3_path, freemanOutDir)
flag = freemDecom.api_freeman_decomposition_T3(0, 0, rows, cols)
if not flag:
logger.error('FreemanDecomposition err')
return False, None
outFolderDic['Freeman'] = freemanOutDir
# Touzi分解
if 'Touzi' in FeatureInput:
touziOutDir = os.path.join(workspace_processing_path, name + '\\touzi\\')
if not os.path.exists(touziOutDir):
os.makedirs(touziOutDir)
if self._debug == False:
# touzi分解耗时较长且对特征表达效果较差
p = PspTouziDecomposition(hh_hv_vh_vv_dic, touziOutDir)
p.Touzi_decomposition_multiprocessing()
outFolderDic['Touzi'] = touziOutDir
if 'Yamaguchi' in FeatureInput:
# Yamaguchi分解
yamaguchiOutDir = os.path.join(workspace_processing_path, name + '\\yamaguchi\\')
if self._debug == False:
yamaguchiDecom = PspYamaguchiDecomposition(exeDir, t3_path, yamaguchiOutDir)
flag = yamaguchiDecom.api_yamaguchi_4components_decomposition_T3(0, 0, rows, cols)
if not flag:
logger.error('CloudePottierDecomposition err')
return False, None
outFolderDic['Yamaguchi'] = yamaguchiOutDir
if 'Cloude' in FeatureInput:
# CloudePottier分解
cloudeOutDir = os.path.join(workspace_processing_path, name + '\\cloude\\')
if self._debug == False:
cloudeDecom = PspCloudePottierDecomposition(
exeDir, t3_path, cloudeOutDir)
flag = cloudeDecom.api_h_a_alpha_decomposition_T3(
0, 0, rows, cols)
if not flag:
logger.error('CloudePottierDecomposition err')
return False, None
outFolderDic['Cloude'] = cloudeOutDir
return True, outFolderDic
def creat_h_a_alpha_features(self, t3_path, out_dir):
logger.info('ahv transform to polsarpro T3 matrix success!')
logger.info('progress bar: 20%')
h_a_alpha_decomposition_T3_path = os.path.join(self._exe_dir, 'h_a_alpha_decomposition_T3.exe')
h_a_alpha_eigenvalue_set_T3_path = os.path.join(self._exe_dir, 'h_a_alpha_eigenvalue_set_T3.exe')
h_a_alpha_eigenvector_set_T3_path = os.path.join(self._exe_dir, 'h_a_alpha_eigenvector_set_T3.exe')
if self._debug == False:
haa = PspHAAlphaDecomposition(normalization=True)
haa.api_creat_h_a_alpha_features(h_a_alpha_out_dir=out_dir,
h_a_alpha_decomposition_T3_path=h_a_alpha_decomposition_T3_path ,
h_a_alpha_eigenvalue_set_T3_path=h_a_alpha_eigenvalue_set_T3_path ,
h_a_alpha_eigenvector_set_T3_path=h_a_alpha_eigenvector_set_T3_path,
polsarpro_in_dir=t3_path)
def cereat_features_dic(self,outFolderDic, feature_tif_dir):
if not os.path.exists(feature_tif_dir):
os.makedirs(feature_tif_dir)
feature_tif_paths = {}
for key in outFolderDic:
feature_bin_dic = outFolderDic[key]
if key == 'Touzi':
for path in list(glob.glob(os.path.join(feature_bin_dic, '*.tif'))):
name = os.path.split(path)[1].split('.')[0]
if self._debug == False:
shutil.copyfile(path, os.path.join(feature_tif_dir, name + '.tif')) # feature_tif_dir + '\\' + name + '.tif')
feature_tif_paths.update({name: os.path.join(feature_tif_dir, name + '.tif')}) # feature_tif_dir + '\\' + name + '.tif'
else:
feature_tif_paths.update(write_bin_to_tif(feature_tif_dir, feature_bin_dic))
return feature_tif_paths
@staticmethod
def decompose_single_tar(hh_hv_vh_vv_list, workspace_processing_path, workspace_preprocessing_path, name, exe_dir, rows, cols, FILTER_SIZE = 3, debug =False, FeatureInput=['Freeman', 'Yamaguchi', 'Cloude']):
hh_hv_vh_vv_dic = {}
hh_hv_vh_vv_dic.update({'HH': hh_hv_vh_vv_list[0]})
hh_hv_vh_vv_dic.update({'HV': hh_hv_vh_vv_list[1]})
hh_hv_vh_vv_dic.update({'VH': hh_hv_vh_vv_list[2]})
hh_hv_vh_vv_dic.update({'VV': hh_hv_vh_vv_list[3]})
t3_path = os.path.join(workspace_processing_path, name, "lee_filter") # workspace_processing_path + name + "\\lee_filter"
feature_tif_dir = os.path.join(workspace_processing_path, name, 'features') # workspace_processing_path + name + "\\features"
cfeature = CreateFeature(debug, exe_dir)
cfeature.creat_h_a_alpha_features(t3_path, feature_tif_dir)
t3_path = cfeature.ahv_to_t3(workspace_processing_path, workspace_preprocessing_path, hh_hv_vh_vv_list, name, FILTER_SIZE)
flag, outFolderDic = cfeature.decompose(workspace_processing_path, name, t3_path, rows, cols, hh_hv_vh_vv_dic, FeatureInput) # , 'Touzi'
cfeature.cereat_features_dic(outFolderDic, feature_tif_dir)
return feature_tif_dir
if __name__ == '__main__':
# # 实例1
# exe_dir = os.getcwd()
# dir = r'D:\MicroWorkspace\product\C-SAR\VegetationPhenology\Temporary\preprocessed/'
# hh_hv_vh_vv_list = [dir +'GF3_SAY_QPSI_011444_E118.9_N31.4_20181012_L1A_AHV_L10003515422_RPC_HH_preprocessed.tif',
# dir +'GF3_SAY_QPSI_011444_E118.9_N31.4_20181012_L1A_AHV_L10003515422_RPC_HV_preprocessed.tif',
# dir +'GF3_SAY_QPSI_011444_E118.9_N31.4_20181012_L1A_AHV_L10003515422_RPC_VH_preprocessed.tif',
# dir +'GF3_SAY_QPSI_011444_E118.9_N31.4_20181012_L1A_AHV_L10003515422_RPC_VV_preprocessed.tif']
#
# workspace_processing_path= r"D:\MicroWorkspace\product\C-SAR\VegetationPhenology\Temporary\processing/"
# name= 'GF3_SAY_QPSI_011444_E118.9_N31.4_20181012_L1A_AHV_L10003515422_RPC'
# hh_hv_vh_vv_dic = {}
# hh_hv_vh_vv_dic.update({'HH': hh_hv_vh_vv_list[0]})
# hh_hv_vh_vv_dic.update({'HV': hh_hv_vh_vv_list[1]})
# hh_hv_vh_vv_dic.update({'VH': hh_hv_vh_vv_list[2]})
# hh_hv_vh_vv_dic.update({'VV': hh_hv_vh_vv_list[3]})
# t3_path = workspace_processing_path + name + "\\lee_filter"
# feature_tif_dir = workspace_processing_path + name + "\\features"
#
# cfeature = CreateFeature(False, exe_dir)
#
# cfeature.creat_h_a_alpha_features(t3_path, feature_tif_dir)
#
# t3_path = cfeature.ahv_to_t3(workspace_processing_path, hh_hv_vh_vv_list, name, 3)
# flag, outFolderDic = cfeature.decompose(workspace_processing_path, name, t3_path, 997, 1227, hh_hv_vh_vv_dic, FeatureInput=['Freeman', 'Touzi', 'Yamaguchi', 'Cloude'])
#
# feature_tifs_dic = cfeature.cereat_features_dic(outFolderDic, feature_tif_dir)
pass