ISCE_INSAR/contrib/geo_autoRIFT/autoRIFT/autoRIFT_ISCE.py

261 lines
8.5 KiB
Python
Executable File

#!/usr/bin/env python3
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Copyright 2019 California Institute of Technology. ALL RIGHTS RESERVED.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# United States Government Sponsorship acknowledged. This software is subject to
# U.S. export control laws and regulations and has been classified as 'EAR99 NLR'
# (No [Export] License Required except when exporting to an embargoed country,
# end user, or in support of a prohibited end use). By downloading this software,
# the user agrees to comply with all applicable U.S. export laws and regulations.
# The user has the responsibility to obtain export licenses, or other export
# authority as may be required before exporting this software to any 'EAR99'
# embargoed foreign country or citizen of those countries.
#
# Author: Yang Lei
#
# Note: this is based on the MATLAB code, "auto-RIFT", written by Alex Gardner,
# and has been translated to Python and further optimized.
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
import isce
from iscesys.Component.Component import Component
import pdb
import subprocess
import re
import string
import sys
WALLIS_FILTER_WIDTH = Component.Parameter('WallisFilterWidth',
public_name='WALLIS_FILTER_WIDTH',
default = 21,
type = int,
mandatory = False,
doc = 'Width of the Wallis filter to be used for the pre-processing')
CHIP_SIZE_MIN_X = Component.Parameter('ChipSizeMinX',
public_name='CHIP_SIZE_MIN',
default = 32,
type = int,
mandatory = False,
doc = 'Minimum size (in X direction) of the reference data window to be used for correlation')
CHIP_SIZE_MAX_X = Component.Parameter('ChipSizeMaxX',
public_name='CHIP_SIZE_MAX',
default = 64,
type = int,
mandatory = False,
doc = 'Maximum size (in X direction) of the reference data window to be used for correlation')
CHIP_SIZE_0X = Component.Parameter('ChipSize0X',
public_name='CHIP_SIZE_0X',
default = 32,
type = int,
mandatory = False,
doc = 'Minimum acceptable size (in X direction) of the reference data window to be used for correlation without resampling the grid; if a chip size greater than this value is provided, need to resize the sampling grid')
GRID_SPACING_X = Component.Parameter('GridSpacingX',
public_name='GRID_SPACING_X',
default = 32,
type = int,
mandatory = False,
doc = 'Spacing (in X direction) of the sampling grid')
SCALE_CHIP_SIZE_Y = Component.Parameter('ScaleChipSizeY',
public_name='SCALE_CHIP_SIZE_Y',
default = 1,
type = float,
mandatory = False,
doc = 'Scaling factor to get the Y-directed chip size in reference to the X-directed sizes')
SEARCH_LIMIT_X = Component.Parameter('SearchLimitX',
public_name='SEARCH_LIMIT_X',
default = 25,
type = int,
mandatory = False,
doc = 'Limit (in X direction) of the search data window to be used for correlation')
SEARCH_LIMIT_Y = Component.Parameter('SearchLimitY',
public_name='SEARCH_LIMIT_Y',
default = 25,
type = int,
mandatory = False,
doc = 'Limit (in Y direction) of the search data window to be used for correlation')
SKIP_SAMPLE_X = Component.Parameter('SkipSampleX',
public_name = 'SKIP_SAMPLE_X',
default = 32,
type = int,
mandatory = False,
doc = 'Number of samples to skip between windows in X (range) direction.')
SKIP_SAMPLE_Y = Component.Parameter('SkipSampleY',
public_name = 'SKIP_SAMPLE_Y',
default = 32,
type = int,
mandatory=False,
doc = 'Number of lines to skip between windows in Y ( "-" azimuth) direction.')
FILL_FILT_WIDTH = Component.Parameter('fillFiltWidth',
public_name = 'FILL_FILT_WIDTH',
default = 3,
type = int,
mandatory=False,
doc = 'light interpolation Fill Filter width')
MIN_SEARCH = Component.Parameter('minSearch',
public_name = 'MIN_SEARCH',
default = 6,
type = int,
mandatory=False,
doc = 'minimum search limit')
SPARSE_SEARCH_SAMPLE_RATE = Component.Parameter('sparseSearchSampleRate',
public_name = 'SPARSE_SEARCH_SAMPLE_RATE',
default = 4,
type = int,
mandatory=False,
doc = 'sparse search sample rate')
FRAC_VALID = Component.Parameter('FracValid',
public_name = 'FRAC_VALID',
default = 8/25,
type = float,
mandatory=False,
doc = 'Fraction of valid displacements')
FRAC_SEARCH = Component.Parameter('FracSearch',
public_name = 'FRAC_SEARCH',
default = 0.20,
type = float,
mandatory=False,
doc = 'Fraction of search')
FILT_WIDTH = Component.Parameter('FiltWidth',
public_name = 'FILT_WIDTH',
default = 5,
type = int,
mandatory=False,
doc = 'Disparity Filter width')
ITER = Component.Parameter('Iter',
public_name = 'ITER',
default = 3,
type = int,
mandatory=False,
doc = 'Number of iterations')
MAD_SCALAR = Component.Parameter('MadScalar',
public_name = 'MAD_SCALAR',
default = 4,
type = int,
mandatory=False,
doc = 'Mad Scalar')
COLFILT_CHUNK_SIZE = Component.Parameter('colfiltChunkSize',
public_name = 'COLFILT_CHUNK_SIZE',
default = 4,
type = int,
mandatory=False,
doc = 'column filter chunk size')
BUFF_DISTANCE_C = Component.Parameter('BuffDistanceC',
public_name = 'BUFF_DISTANCE_C',
default = 8,
type = int,
mandatory=False,
doc = 'buffer coarse corr mask by this many pixels for use as fine search mask')
COARSE_COR_CUTOFF = Component.Parameter('CoarseCorCutoff',
public_name = 'COARSE_COR_CUTOFF',
default = 0.01,
type = float,
mandatory=False,
doc = 'coarse correlation search cutoff')
OVER_SAMPLE_RATIO = Component.Parameter('OverSampleRatio',
public_name = 'OVER_SAMPLE_RATIO',
default = 16,
type = int,
mandatory=False,
doc = 'factor for pyramid up sampling for sub-pixel level offset refinement')
DATA_TYPE = Component.Parameter('DataType',
public_name = 'DATA_TYPE',
default = 0,
type = int,
mandatory=False,
doc = 'Input data type: 0 -> uint8, 1 -> float32')
MULTI_THREAD = Component.Parameter('MultiThread',
public_name = 'MULTI_THREAD',
default = 0,
type = int,
mandatory=False,
doc = 'Number of Threads; default specified by 0 uses single core and surpasses the multithreading routine')
try:
# Try Autorift within ISCE first
from .autoRIFT import autoRIFT
except ImportError:
# Try global Autorift
from autoRIFT import autoRIFT
except:
raise Exception('Autorift does not appear to be installed.')
class autoRIFT_ISCE(autoRIFT, Component):
'''
Class for mapping regular geographic grid on radar imagery.
'''
parameter_list = (WALLIS_FILTER_WIDTH,
CHIP_SIZE_MIN_X,
CHIP_SIZE_MAX_X,
CHIP_SIZE_0X,
GRID_SPACING_X,
SCALE_CHIP_SIZE_Y,
SEARCH_LIMIT_X,
SEARCH_LIMIT_Y,
SKIP_SAMPLE_X,
SKIP_SAMPLE_Y,
FILL_FILT_WIDTH,
MIN_SEARCH,
SPARSE_SEARCH_SAMPLE_RATE,
FRAC_VALID,
FRAC_SEARCH,
FILT_WIDTH,
ITER,
MAD_SCALAR,
COLFILT_CHUNK_SIZE,
BUFF_DISTANCE_C,
COARSE_COR_CUTOFF,
OVER_SAMPLE_RATIO,
DATA_TYPE,
MULTI_THREAD)
def __init__(self):
super(autoRIFT_ISCE, self).__init__()