186 lines
4.9 KiB
Python
186 lines
4.9 KiB
Python
|
#
|
||
|
|
||
|
import isce
|
||
|
import isceobj
|
||
|
from iscesys.StdOEL.StdOELPy import create_writer
|
||
|
from mroipac.ampcor.Ampcor import Ampcor
|
||
|
|
||
|
import numpy as np
|
||
|
import os
|
||
|
import shelve
|
||
|
import logging
|
||
|
|
||
|
logger = logging.getLogger('isce.insar.runRefineSecondaryTiming')
|
||
|
|
||
|
|
||
|
def estimateOffsetField(reference, secondary, azoffset=0, rgoffset=0):
|
||
|
'''
|
||
|
Estimate offset field between burst and simamp.
|
||
|
'''
|
||
|
|
||
|
|
||
|
sim = isceobj.createSlcImage()
|
||
|
sim.load(secondary+'.xml')
|
||
|
sim.setAccessMode('READ')
|
||
|
sim.createImage()
|
||
|
|
||
|
sar = isceobj.createSlcImage()
|
||
|
sar.load(reference + '.xml')
|
||
|
sar.setAccessMode('READ')
|
||
|
sar.createImage()
|
||
|
|
||
|
width = sar.getWidth()
|
||
|
length = sar.getLength()
|
||
|
|
||
|
objOffset = Ampcor(name='reference_offset1')
|
||
|
objOffset.configure()
|
||
|
objOffset.setAcrossGrossOffset(rgoffset)
|
||
|
objOffset.setDownGrossOffset(azoffset)
|
||
|
objOffset.setWindowSizeWidth(128)
|
||
|
objOffset.setWindowSizeHeight(128)
|
||
|
objOffset.setSearchWindowSizeWidth(40)
|
||
|
objOffset.setSearchWindowSizeHeight(40)
|
||
|
margin = 2*objOffset.searchWindowSizeWidth + objOffset.windowSizeWidth
|
||
|
|
||
|
nAcross = 60
|
||
|
nDown = 60
|
||
|
|
||
|
|
||
|
offAc = max(101,-rgoffset)+margin
|
||
|
offDn = max(101,-azoffset)+margin
|
||
|
|
||
|
|
||
|
lastAc = int( min(width, sim.getWidth() - offAc) - margin)
|
||
|
lastDn = int( min(length, sim.getLength() - offDn) - margin)
|
||
|
|
||
|
if not objOffset.firstSampleAcross:
|
||
|
objOffset.setFirstSampleAcross(offAc)
|
||
|
|
||
|
if not objOffset.lastSampleAcross:
|
||
|
objOffset.setLastSampleAcross(lastAc)
|
||
|
|
||
|
if not objOffset.firstSampleDown:
|
||
|
objOffset.setFirstSampleDown(offDn)
|
||
|
|
||
|
if not objOffset.lastSampleDown:
|
||
|
objOffset.setLastSampleDown(lastDn)
|
||
|
|
||
|
if not objOffset.numberLocationAcross:
|
||
|
objOffset.setNumberLocationAcross(nAcross)
|
||
|
|
||
|
if not objOffset.numberLocationDown:
|
||
|
objOffset.setNumberLocationDown(nDown)
|
||
|
|
||
|
objOffset.setFirstPRF(1.0)
|
||
|
objOffset.setSecondPRF(1.0)
|
||
|
objOffset.setImageDataType1('complex')
|
||
|
objOffset.setImageDataType2('complex')
|
||
|
|
||
|
objOffset.ampcor(sar, sim)
|
||
|
|
||
|
sar.finalizeImage()
|
||
|
sim.finalizeImage()
|
||
|
|
||
|
result = objOffset.getOffsetField()
|
||
|
return result
|
||
|
|
||
|
|
||
|
def fitOffsets(field,azrgOrder=0,azazOrder=0,
|
||
|
rgrgOrder=0,rgazOrder=0,snr=5.0):
|
||
|
'''
|
||
|
Estimate constant range and azimith shifs.
|
||
|
'''
|
||
|
|
||
|
|
||
|
stdWriter = create_writer("log","",True,filename='off.log')
|
||
|
|
||
|
for distance in [10,5,3,1]:
|
||
|
inpts = len(field._offsets)
|
||
|
print("DEBUG %%%%%%%%")
|
||
|
print(inpts)
|
||
|
print("DEBUG %%%%%%%%")
|
||
|
objOff = isceobj.createOffoutliers()
|
||
|
objOff.wireInputPort(name='offsets', object=field)
|
||
|
objOff.setSNRThreshold(snr)
|
||
|
objOff.setDistance(distance)
|
||
|
objOff.setStdWriter(stdWriter)
|
||
|
|
||
|
objOff.offoutliers()
|
||
|
|
||
|
field = objOff.getRefinedOffsetField()
|
||
|
outputs = len(field._offsets)
|
||
|
|
||
|
print('%d points left'%(len(field._offsets)))
|
||
|
|
||
|
|
||
|
aa, dummy = field.getFitPolynomials(azimuthOrder=azazOrder, rangeOrder=azrgOrder, usenumpy=True)
|
||
|
dummy, rr = field.getFitPolynomials(azimuthOrder=rgazOrder, rangeOrder=rgrgOrder, usenumpy=True)
|
||
|
|
||
|
azshift = aa._coeffs[0][0]
|
||
|
rgshift = rr._coeffs[0][0]
|
||
|
print('Estimated az shift: ', azshift)
|
||
|
print('Estimated rg shift: ', rgshift)
|
||
|
|
||
|
return (aa, rr), field
|
||
|
|
||
|
|
||
|
def runRefineSecondaryTiming(self):
|
||
|
|
||
|
logger.info("Running refine secondary timing")
|
||
|
secondaryFrame = self._insar.loadProduct( self._insar.secondarySlcCropProduct)
|
||
|
referenceFrame = self._insar.loadProduct( self._insar.referenceSlcCropProduct)
|
||
|
referenceSlc = referenceFrame.getImage().filename
|
||
|
|
||
|
slvImg = secondaryFrame.getImage()
|
||
|
secondarySlc = os.path.join(self.insar.coregDirname , self._insar.coarseCoregFilename)
|
||
|
|
||
|
field = estimateOffsetField(referenceSlc, secondarySlc)
|
||
|
|
||
|
rgratio = referenceFrame.instrument.getRangePixelSize()/secondaryFrame.instrument.getRangePixelSize()
|
||
|
azratio = secondaryFrame.PRF / referenceFrame.PRF
|
||
|
|
||
|
print ('*************************************')
|
||
|
print ('rgratio, azratio: ', rgratio, azratio)
|
||
|
print ('*************************************')
|
||
|
|
||
|
misregDir = self.insar.misregDirname
|
||
|
os.makedirs(misregDir, exist_ok=True)
|
||
|
|
||
|
outShelveFile = os.path.join(misregDir, self.insar.misregFilename)
|
||
|
odb = shelve.open(outShelveFile)
|
||
|
odb['raw_field'] = field
|
||
|
shifts, cull = fitOffsets(field,azazOrder=0,
|
||
|
azrgOrder=0,
|
||
|
rgazOrder=0,
|
||
|
rgrgOrder=0,
|
||
|
snr=5.0)
|
||
|
odb['cull_field'] = cull
|
||
|
|
||
|
####Scale by ratio
|
||
|
for row in shifts[0]._coeffs:
|
||
|
for ind, val in enumerate(row):
|
||
|
row[ind] = val * azratio
|
||
|
|
||
|
for row in shifts[1]._coeffs:
|
||
|
for ind, val in enumerate(row):
|
||
|
row[ind] = val * rgratio
|
||
|
|
||
|
|
||
|
odb['azpoly'] = shifts[0]
|
||
|
odb['rgpoly'] = shifts[1]
|
||
|
odb.close()
|
||
|
|
||
|
|
||
|
self._insar.saveProduct(shifts[0], outShelveFile + '_az.xml')
|
||
|
self._insar.saveProduct(shifts[1], outShelveFile + '_rg.xml')
|
||
|
|
||
|
return None
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|