ISCE_INSAR/components/isceobj/StripmapProc/runDenseOffsets.py

109 lines
3.3 KiB
Python

#
#
import isce
import isceobj
from mroipac.ampcor.DenseAmpcor import DenseAmpcor
from isceobj.Util.decorators import use_api
import os
import logging
logger = logging.getLogger('isce.insar.runDenseOffsets')
@use_api
def estimateOffsetField(reference, secondary, denseOffsetFileName,
ww=64, wh=64,
sw=20, shh=20,
kw=32, kh=32):
'''
Estimate offset field between burst and simamp.
'''
###Loading the secondary image object
sim = isceobj.createSlcImage()
sim.load(secondary+'.xml')
sim.setAccessMode('READ')
sim.createImage()
###Loading the reference image object
sar = isceobj.createSlcImage()
sar.load(reference + '.xml')
sar.setAccessMode('READ')
sar.createImage()
width = sar.getWidth()
length = sar.getLength()
objOffset = DenseAmpcor(name='dense')
objOffset.configure()
# objOffset.numberThreads = 6
objOffset.setWindowSizeWidth(ww) #inps.winwidth)
objOffset.setWindowSizeHeight(wh) #inps.winhgt)
objOffset.setSearchWindowSizeWidth(sw) #inps.srcwidth)
objOffset.setSearchWindowSizeHeight(shh) #inps.srchgt)
objOffset.skipSampleAcross = kw #inps.skipwidth
objOffset.skipSampleDown = kh #inps.skiphgt
objOffset.margin = 50 #inps.margin
objOffset.oversamplingFactor = 32 #inps.oversample
objOffset.setAcrossGrossOffset(0) #inps.rgshift)
objOffset.setDownGrossOffset(0) #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 = denseOffsetFileName + '.bil'
objOffset.snrImageName = denseOffsetFileName +'_snr.bil'
objOffset.covImageName = denseOffsetFileName +'_cov.bil'
objOffset.denseampcor(sar, sim)
sar.finalizeImage()
sim.finalizeImage()
return (objOffset.locationDown[0][0], objOffset.locationAcross[0][0])
def runDenseOffsets(self):
if self.doDenseOffsets or self.doRubbersheetingAzimuth:
if self.doDenseOffsets:
print('Dense offsets explicitly requested')
if self.doRubbersheetingAzimuth:
print('Generating offsets as rubber sheeting requested')
else:
return
referenceFrame = self.insar.loadProduct( self._insar.referenceSlcCropProduct)
referenceSlc = referenceFrame.getImage().filename
secondarySlc = os.path.join(self.insar.coregDirname, self._insar.refinedCoregFilename )
dirname = self.insar.denseOffsetsDirname
os.makedirs(dirname, exist_ok=True)
denseOffsetFilename = os.path.join(dirname , self.insar.denseOffsetFilename)
field = estimateOffsetField(referenceSlc, secondarySlc, denseOffsetFilename,
ww = self.denseWindowWidth,
wh = self.denseWindowHeight,
sw = self.denseSearchWidth,
shh = self.denseSearchHeight,
kw = self.denseSkipWidth,
kh = self.denseSkipHeight)
self._insar.offset_top = field[0]
self._insar.offset_left = field[1]
return None