diff --git a/json_schemas/schema_MultiSlc.json b/json_schemas/schema_MultiSlc.json index 94b232ea36e02c7f9a9fa7d94d1e244b8b5d7676..67d27d8a45306414419c4f22de3428fc5e2d881b 100644 --- a/json_schemas/schema_MultiSlc.json +++ b/json_schemas/schema_MultiSlc.json @@ -5,7 +5,8 @@ "type": "object", - "allOf": [{"required": ["Global", "Pre_Processing", "Metadata_Correction", "DIn_SAR"]}], + "allOf": [{"required": ["Global", "Pre_Processing", "Metadata_Correction", "DIn_SAR", + "Post_Processing"]}], "properties": { @@ -121,14 +122,35 @@ "Interferogram_mlran": {"type": "number"}, "Interferogram_mlazi": {"type": "number"}, "Activate_Interferogram": {"type": "string", "default": "yes"}, - "Activate_Ortho": {"type": "string"}, - "Spacingxy": {"type": "number", "default": 0.0001}, "roi": {"type": "string"} } } }, "additionalProperties": false, "required": ["parameter"] + }, + + "Post_Processing": + { + "type": "object", + "properties": + { + "parameter": + { + "type": "object", + "required": ["Activate_Ortho"], + "additionalProperties": false, + "properties": {"Activate_Ortho": {"type": "string"}, + "Spacingxy": {"type": "number", "default": 0.0001}, + "Activate_Filtering": {"type": "string"}, + "Filtered_Interferogram_mlran": {"type": "number"}, + "Filtered_Interferogram_mlazi": {"type": "number"}, + "Filtering_parameter_alpha": {"type": "number"} + } + } + }, + "additionalProperties": false, + "required": ["parameter"] } } } diff --git a/json_schemas/schema_MultiSlc_IW.json b/json_schemas/schema_MultiSlc_IW.json index 774f1cd9372bdabfc37e0dd30ae8b562e21549c1..cad9e7759b7f62cd1c2b401f685b4ec24a37b522 100644 --- a/json_schemas/schema_MultiSlc_IW.json +++ b/json_schemas/schema_MultiSlc_IW.json @@ -5,7 +5,7 @@ "type": "object", - "allOf": [{"required": ["Global", "Pre_Processing", "DIn_SAR"]}], + "allOf": [{"required": ["Global", "Pre_Processing", "DIn_SAR", "Post_Processing"]}], "properties": { @@ -93,8 +93,6 @@ "Grid_Gap": {"type": "number"}, "Interferogram_gain": {"type": "number"}, "Activate_Interferogram": {"type": "string", "default": "yes"}, - "Activate_Ortho": {"type": "string"}, - "Spacingxy": {"type": "number", "default": 0.0001}, "roi": {"type": "string"}, "ESD_iter" : {"type": ["integer","string"]} } @@ -102,6 +100,29 @@ }, "additionalProperties": false, "required": ["parameter"] + }, + + "Post_Processing": + { + "type": "object", + "properties": + { + "parameter": + { + "type": "object", + "required": ["Activate_Ortho"], + "additionalProperties": false, + "properties": {"Activate_Ortho": {"type": "string"}, + "Spacingxy": {"type": "number", "default": 0.0001}, + "Activate_Filtering": {"type": "string"}, + "Filtered_Interferogram_mlran": {"type": "number"}, + "Filtered_Interferogram_mlazi": {"type": "number"}, + "Filtering_parameter_alpha": {"type": "number"} + } + } + }, + "additionalProperties": false, + "required": ["parameter"] } } } diff --git a/python_src/SAR_MultiSlc.py b/python_src/SAR_MultiSlc.py index fe7d6c901795ba4986d1fe3b43df854aa6733efa..e79d633f0d4c23b03e6620b08ad2d8db9e07b72e 100644 --- a/python_src/SAR_MultiSlc.py +++ b/python_src/SAR_MultiSlc.py @@ -51,6 +51,7 @@ import h5py from processings import Pre_Processing from processings import Ground from processings import DInSar +from processings import Post_Processing import utils.DiapOTB_applications as diapOTBApp from utils import func_utils @@ -80,6 +81,7 @@ if __name__ == "__main__": dict_PreProcessing = dataConfig['Pre_Processing'] dict_Metadata_Correction = dataConfig['Metadata_Correction'] dict_DInSAR = dataConfig['DIn_SAR'] + dict_PostProcessing = dataConfig['Post_Processing'] # ====== Check extension (if .h5 => HDF5 file => Cosmo Sensor) master_ext = dict_Global['in']['Master_Image'].split(".")[-1:] @@ -161,19 +163,10 @@ if __name__ == "__main__": fine_metadata_file = dict_Metadata_Correction['out']['fine_metadata_file'] # ====== DIn_SAR - spacingxy = "0.0001" - if "Spacingxy" in dict_DInSAR['parameter']: - spacingxy = str(dict_DInSAR['parameter']['Spacingxy']) roi = None if 'roi' in dict_DInSAR['parameter']: roi = dict_DInSAR['parameter']['roi'] version_interferogram = dict_DInSAR['parameter']['Activate_Interferogram'] - ortho_interferogram = "no" - if 'Activate_Ortho' in dict_DInSAR['parameter']: - ortho_interferogram = dict_DInSAR['parameter']['Activate_Ortho'] - if roi: - ortho_interferogram = "yes" - print("ortho_interferogram", ortho_interferogram) geoGrid_gridstep_range = dict_DInSAR['parameter']['GridStep_range'] geoGrid_gridstep_azimut = dict_DInSAR['parameter']['GridStep_azimut'] geoGrid_threshold = dict_DInSAR['parameter']['Grid_Threshold'] @@ -191,6 +184,34 @@ if __name__ == "__main__": if "Interferogram_mlazi" in dict_DInSAR['parameter'] : ml_interf_azimut = int(dict_DInSAR['parameter']['Interferogram_mlazi']) + # ====== Post_Processing + spacingxy = "0.0001" + if "Spacingxy" in dict_PostProcessing['parameter']: + spacingxy = str(dict_PostProcessing['parameter']['Spacingxy']) + + ortho_interferogram = "no" + if 'Activate_Ortho' in dict_PostProcessing['parameter']: + ortho_interferogram = dict_PostProcessing['parameter']['Activate_Ortho'] + if roi: + ortho_interferogram = "yes" + print("ortho_interferogram", ortho_interferogram) + + activateFiltering = "false" + if "Activate_Filtering" in dict_PostProcessing['parameter'] : + activateFiltering = dict_PostProcessing['parameter']['Activate_Filtering'] + + ml_interf_filt_range = 3 + if "Filtered_Interferogram_mlran" in dict_PostProcessing['parameter'] : + ml_interf_filt_range = int(dict_PostProcessing['parameter']['Filtered_Interferogram_mlran']) + + ml_interf_filt_azimut = 3 + if "Filtered_Interferogram_mlazi" in dict_PostProcessing['parameter'] : + ml_interf_filt_azimut = int(dict_PostProcessing['parameter']['Filtered_Interferogram_mlazi']) + + interf_filt_alpha = 0.7 + if "Filtering_parameter_alpha" in dict_PostProcessing['parameter'] : + interf_filt_alpha = dict_PostProcessing['parameter']['Filtering_parameter_alpha'] + if (geoGrid_threshold < 0) or (geoGrid_threshold > 1): func_utils.log(logging.CRITICAL, "Error, Wrong Threshold for fine deformation grid") @@ -202,6 +223,12 @@ if __name__ == "__main__": "If Ortho is required, please activate interferogram estimation in your json file") quit() + # ====== Check if interferogram is activated for filtering + if func_utils.str2bool(activateFiltering) and version_interferogram == "no": + func_utils.log(logging.CRITICAL, "Error, Impossible to have filering without interferogram\n" + "If Filtering is required, please activate interferogram estimation in your json file") + quit() + # ====== Check if images exist func_utils.check_ifExist(srtm_shapefile) func_utils.check_ifExist(hgts_path) @@ -265,10 +292,21 @@ if __name__ == "__main__": func_utils.log(logging.INFO, "gain_interfero : {param}".format(param=gain_interfero)) func_utils.log(logging.INFO, "ml_interf_range : {param}".format(param=ml_interf_range)) func_utils.log(logging.INFO, "ml_interf_azimut : {param}".format(param=ml_interf_azimut)) - func_utils.log(logging.INFO, "Spacingxy : {param}".format(param=spacingxy)) func_utils.log(logging.INFO, "roi : {param}".format(param=roi)) func_utils.log(logging.INFO, "Activate_Interferogram : {param}".format(param=version_interferogram)) + + # Post_Processing + func_utils.log(logging.INFO, " Post_Processing : ") func_utils.log(logging.INFO, "Activate_Ortho : {param}".format(param=ortho_interferogram)) + if func_utils.str2bool(ortho_interferogram): + func_utils.log(logging.INFO, "spacingxy : {param}".format(param=spacingxy)) + func_utils.log(logging.INFO, "activateFiltering : {param}".format(param=activateFiltering)) + if func_utils.str2bool(activateFiltering): + func_utils.log(logging.INFO, "ml_interf_filt_range : {param}".format(param=ml_interf_filt_range)) + func_utils.log(logging.INFO, "ml_interf_filt_azimut : {param}".format(param=ml_interf_filt_azimut)) + func_utils.log(logging.INFO, "interf_filt_alpha : {param}".format(param=interf_filt_alpha)) + + # Retrieve some information about our master image @@ -528,6 +566,27 @@ if __name__ == "__main__": func_utils.printOnStd("\n Post Processing chain \n") func_utils.log(logging.INFO, "Post Processing chain") + # Phase Filtering (if required) + if func_utils.str2bool(activateFiltering): + # Default paramater + step = 16 + sizetiles = 64 + + paramPost = {} + paramPost['slave_CoRe_Name'] = slave_Image_CoRe + paramPost['ml_filt_interf_range'] = ml_interf_filt_range + paramPost['ml_filt_interf_azimut'] = ml_interf_filt_azimut + paramPost['geoGrid_gridstep_range'] = geoGrid_gridstep_range + paramPost['geoGrid_gridstep_azimut'] = geoGrid_gridstep_azimut + paramPost['ml_filt_interf_gain'] = gain_interfero + paramPost['filt_alpha'] = interf_filt_alpha + + Post_Processing.filtering(master_Image, master_Image_base, slave_Image, + slave_Image_base, master_data_dir, output_dir, paramPost, + "Others", output_dir) + + + # === Multilook on Coregistrated Slave func_utils.silentremove(output_dir, slave_Image_ML) slave_Image_ML = os.path.splitext(slave_Image_base)[0] + "_ml" + str(ml_azimut) + str(ml_range) + ".tif" @@ -603,7 +662,12 @@ if __name__ == "__main__": # Remove .tif.aux.xml files into output_dir aux_files = func_utils.get_AllFilesWithExt(output_dir, ".tif.aux.xml") for i_file in aux_files : - func_utils.silentremove(output_dir, i_file) + if i_file == "filfPhaCoh.tif.aux.xml": + filt_dir = os.path.join(output_dir, "filt") + func_utils.silentremove(filt_dir, i_file) + else : + func_utils.silentremove(output_dir, i_file) + if light_version is True: diff --git a/python_src/SAR_MultiSlc_IW.py b/python_src/SAR_MultiSlc_IW.py index fee8b494dd02ac5d03456a6794c063f22534cdc0..03965645ef96069b1174219b180019ca66e4eeed 100644 --- a/python_src/SAR_MultiSlc_IW.py +++ b/python_src/SAR_MultiSlc_IW.py @@ -50,6 +50,7 @@ import errno from processings import Pre_Processing from processings import Ground from processings import DInSar +from processings import Post_Processing import utils.DiapOTB_applications as diapOTBApp from utils import func_utils @@ -86,6 +87,7 @@ if __name__ == "__main__": dict_PreProcessing = dataConfig['Pre_Processing'] dict_Ground = dataConfig['Ground'] dict_DInSAR = dataConfig['DIn_SAR'] + dict_PostProcessing = dataConfig['Post_Processing'] # ====== Get elements from dictionaries # ====== Global @@ -146,18 +148,11 @@ if __name__ == "__main__": version_interferogram = "yes" if "Activate_Interferogram" in dict_DInSAR['parameter']: version_interferogram = dict_DInSAR['parameter']['Activate_Interferogram'] - ortho_interferogram = None - if 'Activate_Ortho' in dict_DInSAR['parameter']: - ortho_interferogram = dict_DInSAR['parameter']['Activate_Ortho'] + roi = None if 'roi' in dict_DInSAR['parameter']: roi = dict_DInSAR['parameter']['roi'] - if roi: - ortho_interferogram = "yes" - print("ortho_interferogram", ortho_interferogram) - spacingxy = '0.0001' - if "Spacingxy" in dict_DInSAR['parameter']: - spacingxy = str(dict_DInSAR['parameter']['Spacingxy']) + geoGrid_gridstep_range = dict_DInSAR['parameter']['GridStep_range'] geoGrid_gridstep_azimut = dict_DInSAR['parameter']['GridStep_azimut'] geoGrid_threshold = dict_DInSAR['parameter']['Grid_Threshold'] @@ -178,12 +173,48 @@ if __name__ == "__main__": esd_AutoMode = True esd_NbIter = 10 # 10 iterations maximum for automatic mode + + # ====== Post_Processing + spacingxy = "0.0001" + if "Spacingxy" in dict_PostProcessing['parameter']: + spacingxy = str(dict_PostProcessing['parameter']['Spacingxy']) + + ortho_interferogram = None + if 'Activate_Ortho' in dict_PostProcessing['parameter']: + ortho_interferogram = dict_PostProcessing['parameter']['Activate_Ortho'] + if roi: + ortho_interferogram = "yes" + print("ortho_interferogram", ortho_interferogram) + + activateFiltering = "false" + if "Activate_Filtering" in dict_PostProcessing['parameter'] : + activateFiltering = dict_PostProcessing['parameter']['Activate_Filtering'] + + ml_interf_filt_range = 3 + if "Filtered_Interferogram_mlran" in dict_PostProcessing['parameter'] : + ml_interf_filt_range = int(dict_PostProcessing['parameter']['Filtered_Interferogram_mlran']) + + ml_interf_filt_azimut = 3 + if "Filtered_Interferogram_mlazi" in dict_PostProcessing['parameter'] : + ml_interf_filt_azimut = int(dict_PostProcessing['parameter']['Filtered_Interferogram_mlazi']) + + interf_filt_alpha = 0.7 + if "Filtering_parameter_alpha" in dict_PostProcessing['parameter'] : + interf_filt_alpha = dict_PostProcessing['parameter']['Filtering_parameter_alpha'] + + # ====== Check if interferogram is activated for ortho interferogram if ortho_interferogram == "yes" and version_interferogram == "no": func_utils.log(logging.CRITICAL, "Error, Impossible to have ortho interferogram without interferogram\n" "If Ortho is required, please activate interferogram estimation in your json file") quit() + # ====== Check if interferogram is activated for filtering + if func_utils.str2bool(activateFiltering) and version_interferogram == "no": + func_utils.log(logging.CRITICAL, "Error, Impossible to have filering without interferogram\n" + "If Filtering is required, please activate interferogram estimation in your json file") + quit() + # ====== Check Threshold if (geoGrid_threshold < 0) or (geoGrid_threshold > 1) : func_utils.log(logging.CRITICAL, "Error, Wrong Threshold for fine deformation grid") @@ -254,12 +285,22 @@ if __name__ == "__main__": func_utils.log(logging.INFO, "ml_geoGrid_azimut : {param}".format(param=ml_geoGrid_azimut)) func_utils.log(logging.INFO, "gain_interfero : {param}".format(param=gain_interfero)) func_utils.log(logging.INFO, "Activate_Interferogram : {param}".format(param=version_interferogram)) - func_utils.log(logging.INFO, "Activate_Ortho : {param}".format(param=ortho_interferogram)) func_utils.log(logging.INFO, "roi : {param}".format(param=roi)) - func_utils.log(logging.INFO, "Spacingxy : {param}".format(param=spacingxy)) func_utils.log(logging.INFO, "esd_NbIter : {param}".format(param=esd_NbIter)) func_utils.log(logging.INFO, "esd_AutoMode : {param}".format(param=esd_AutoMode)) + # Post_Processing + func_utils.log(logging.INFO, " Post_Processing : ") + func_utils.log(logging.INFO, "Activate_Ortho : {param}".format(param=ortho_interferogram)) + if func_utils.str2bool(ortho_interferogram): + func_utils.log(logging.INFO, "spacingxy : {param}".format(param=spacingxy)) + func_utils.log(logging.INFO, "activateFiltering : {param}".format(param=activateFiltering)) + if func_utils.str2bool(activateFiltering): + func_utils.log(logging.INFO, "ml_interf_filt_range : {param}".format(param=ml_interf_filt_range)) + func_utils.log(logging.INFO, "ml_interf_filt_azimut : {param}".format(param=ml_interf_filt_azimut)) + func_utils.log(logging.INFO, "interf_filt_alpha : {param}".format(param=interf_filt_alpha)) + + # ============================ # Get the elements from os.dirs # ============================ @@ -520,6 +561,25 @@ if __name__ == "__main__": os.rename(os.path.join(output_dir, Interferogram_Multiband.split(".")[0]+".geom"), os.path.join(output_dir, Interferogram_.split(".")[0]+".geom")) + + + # Phase Filtering (if required) + if func_utils.str2bool(activateFiltering): + # Default paramater + step = 16 + sizetiles = 64 + + paramPost = {} + paramPost['ml_filt_interf_range'] = ml_interf_filt_range + paramPost['ml_filt_interf_azimut'] = ml_interf_filt_azimut + paramPost['filt_alpha'] = interf_filt_alpha + paramPost['interf_Name'] = Con_Interf + + Post_Processing.filtering(master_Image, master_Image_base, slave_Image, + slave_Image_base, Master_temp_dir, temp_dir, paramPost, + "S1_IW", output_dir) + + # C === Ortho Interferogram if version_interferogram == "yes" and ortho_interferogram == "yes": Ortho_ = mib[:15]+"M"+mib[14:30]+"-"+mib[ diff --git a/python_src/processings/Post_Processing.py b/python_src/processings/Post_Processing.py index 34622192f7fd1d88c2f27edb5f9862a7cb119fd1..f6932b1df17488057808126aec568a23d03ec60e 100644 --- a/python_src/processings/Post_Processing.py +++ b/python_src/processings/Post_Processing.py @@ -144,7 +144,7 @@ def filtering_Others(master_Image, master_Image_base, slave_Image, slave_Image_b # First SARTopographicPhase appTopoPhase = otb.Registry.CreateApplication("SARTopographicPhase") appTopoPhase.SetParameterString("insarslave", slave_Image) - appTopoPhase.SetParameterString("ingrid", os.path.join(master_dir, fine_grid)) + appTopoPhase.SetParameterString("ingrid", os.path.join(slave_dir, fine_grid)) appTopoPhase.SetParameterString("incartmeanmaster", os.path.join(master_dir, master_cartesian_mean)) appTopoPhase.SetParameterInt("mlran", 1) @@ -160,7 +160,7 @@ def filtering_Others(master_Image, master_Image_base, slave_Image, slave_Image_b slave_Image_CoRe = param['slave_CoRe_Name'] slave_Image_CoRe += "?&gdal:co:TILED=YES" - coRe_path = os.path.join(output_dir, slave_Image_CoRe) + coRe_path = os.path.join(slave_dir, slave_Image_CoRe) complexImg = "CompensatedComplex.tif" @@ -266,6 +266,10 @@ def filtering_S1IW(master_Image, master_Image_base, slave_Image, slave_Image_bas # Use directly the interferogram (ML 1x1) interf_name = "interferogram_swath.tif" + if "interf_Name" in param : + interf_name = param['interf_Name'] + + # SARPhaseFiltering