ISCE_INSAR/contrib/stack/stripmapStack/denseOffsets.py

140 lines
4.1 KiB
Python
Executable File

#!/usr/bin/env python3
import numpy as np
import argparse
import os
import isce
import isceobj
import shelve
import datetime
from isceobj.Location.Offset import OffsetField
from iscesys.StdOEL.StdOELPy import create_writer
from mroipac.ampcor.DenseAmpcor import DenseAmpcor
#from isceobj.Utils.denseoffsets import denseoffsets
#import pickle
from isceobj.Util.decorators import use_api
def createParser():
'''
Command line parser.
'''
parser = argparse.ArgumentParser( description='Generate offset field between two Sentinel swaths')
parser.add_argument('-m','--master', type=str, dest='master', required=True,
help='Master image')
parser.add_argument('-s', '--slave',type=str, dest='slave', required=True,
help='Slave image')
parser.add_argument('--ww', type=int, dest='winwidth', default=64,
help='Window Width')
parser.add_argument('--wh', type=int, dest='winhgt', default=64,
help='Window height')
parser.add_argument('--sw', type=int, dest='srcwidth', default=20,
help='Search window width')
parser.add_argument('--sh', type=int, dest='srchgt', default=20,
help='Search window height')
parser.add_argument('--mm', type=int, dest='margin', default=50,
help='Margin')
parser.add_argument('--kw', type=int, dest='skipwidth', default=64,
help='Skip across')
parser.add_argument('--kh', type=int, dest='skiphgt', default=64,
help='Skip down')
parser.add_argument('-o','--outPrefix', type=str, dest='outprefix', default='dense_ampcor',
help='Output prefix')
parser.add_argument('--aa', type=int, dest='azshift', default=0,
help='Gross azimuth offset')
parser.add_argument('--rr', type=int, dest='rgshift', default=0,
help='Gross range offset')
parser.add_argument('--oo', type=int, dest='oversample', default=32,
help = 'Oversampling factor')
return parser
def cmdLineParse(iargs = None):
parser = createParser()
inps = parser.parse_args(args=iargs)
return inps
@use_api
def estimateOffsetField(master, slave, inps=None):
'''
Estimate offset field between burst and simamp.
'''
###Loading the slave image object
sim = isceobj.createSlcImage()
sim.load(slave+'.xml')
sim.setAccessMode('READ')
sim.createImage()
###Loading the master image object
sar = isceobj.createSlcImage()
sar.load(master + '.xml')
sar.setAccessMode('READ')
sar.createImage()
width = sar.getWidth()
length = sar.getLength()
objOffset = DenseAmpcor(name='dense')
objOffset.configure()
# objOffset.numberThreads = 6
objOffset.setWindowSizeWidth(inps.winwidth)
objOffset.setWindowSizeHeight(inps.winhgt)
objOffset.setSearchWindowSizeWidth(inps.srcwidth)
objOffset.setSearchWindowSizeHeight(inps.srchgt)
objOffset.skipSampleAcross = inps.skipwidth
objOffset.skipSampleDown = inps.skiphgt
objOffset.margin = inps.margin
objOffset.oversamplingFactor = inps.oversample
objOffset.setAcrossGrossOffset(inps.rgshift)
objOffset.setDownGrossOffset(inps.azshift)
objOffset.setFirstPRF(1.0)
objOffset.setSecondPRF(1.0)
if sar.dataType.startswith('C'):
objOffset.setImageDataType1('mag')
else:
objOffset.setImageDataType1('real')
if sim.dataType.startswith('C'):
objOffset.setImageDataType2('mag')
else:
objOffset.setImageDataType2('real')
objOffset.offsetImageName = inps.outprefix + '.bil'
objOffset.snrImageName = inps.outprefix +'_snr.bil'
objOffset.denseampcor(sar, sim)
sar.finalizeImage()
sim.finalizeImage()
return objOffset
def main(iargs=None):
'''
Generate offset fields burst by burst.
'''
inps = cmdLineParse(iargs)
outDir = os.path.dirname(inps.outprefix)
os.makedirs(outDir, exist_ok=True)
objOffset = estimateOffsetField(inps.master, inps.slave, inps)
print('Top left corner of offset image: ', objOffset.locationDown[0][0],objOffset.locationAcross[0][0])
if __name__ == '__main__':
main()