ISCE_INSAR/contrib/stack/stripmapStack/resampleSlc.py

229 lines
6.6 KiB
Python
Executable File

#!/usr/bin/env python3
import os
import argparse
import shelve
import json
import logging
import numpy as np
import isce
import isceobj
import stdproc
from stdproc.stdproc import crossmul
from isceobj.Util.decorators import use_api
from isceobj.Util.Poly2D import Poly2D
from iscesys.ImageUtil.ImageUtil import ImageUtil as IU
def createParser():
parser = argparse.ArgumentParser( description='Use polynomial offsets and create burst by burst interferograms')
parser.add_argument('-m', '--reference', dest='reference', type=str, default=None,
help = 'Directory with reference acquisition for reference')
parser.add_argument('-s', '--secondary', dest='secondary', type=str, required=True,
help='Directory with secondary acquisition')
parser.add_argument('-p', '--poly',dest='poly', type=str, default=None,
help='Pickle file with the resampling polynomials')
parser.add_argument('-o','--coreg', dest='coreg', type=str, default=None,
help='Directory with coregistered SLC')
parser.add_argument('-f', '--offsets', dest='offsets', type=str, default=None,
help='Directory with the offset files')
parser.add_argument('-z', dest='zero', action='store_true', default=False,
help='Resample without using azimuth carrier')
parser.add_argument('--noflat', dest='noflat', action='store_true', default=False,
help='To turn off flattening')
parser.add_argument('-d', '--dims', dest='dims', nargs=2, type=int, default=None,
help='Dimensions if using directly with poly')
#inps = parser.parse_args()
#if inps.secondary.endswith('/'):
# inps.secondary = inps.secondary[:-1]
#if inps.coreg is None:
# inps.coreg = os.path.join('coreg', os.path.basename(inps.secondary))
#return inps
return parser
def cmdLineParse(iargs = None):
parser = createParser()
#return parser.parse_args(args=iargs)
inps = parser.parse_args(args=iargs)
#inps = parser.parse_args()
if inps.secondary.endswith('/'):
inps.secondary = inps.secondary[:-1]
if inps.coreg is None:
inps.coreg = os.path.join('coreg', os.path.basename(inps.secondary))
return inps
@use_api
def resampSecondary(burst, offdir, outname, doppler, azpoly, rgpoly,
reference=None, flatten=False, zero=False, dims=None):
'''
Resample burst by burst.
'''
if offdir is not None:
rgname = os.path.join(offdir, 'range.off')
azname = os.path.join(offdir, 'azimuth.off')
rngImg = isceobj.createImage()
rngImg.load(rgname + '.xml')
rngImg.setAccessMode('READ')
aziImg = isceobj.createImage()
aziImg.load(azname + '.xml')
aziImg.setAccessMode('READ')
width = rngImg.getWidth()
length = rngImg.getLength()
else:
rngImg = None
aziImg = None
if dims is None:
raise Exception('No offset image / dims provided.')
width = dims[1]
length = dims[0]
inimg = isceobj.createSlcImage()
inimg.load(burst.getImage().filename + '.xml')
inimg.setAccessMode('READ')
prf = burst.getInstrument().getPulseRepetitionFrequency()
if zero:
factor = 0.0
else:
factor = 1.0
try:
print('Polynomial doppler provided')
coeffs = [factor * 2*np.pi*val/prf for val in doppler._coeffs]
except:
print('List of coefficients provided')
coeffs = [factor * 2*np.pi*val/prf for val in doppler]
zcoeffs = [0. for val in coeffs]
dpoly = Poly2D()
# dpoly.initPoly(rangeOrder=len(coeffs)-1, azimuthOrder=1, coeffs=[zcoeffs,coeffs])
dpoly.initPoly(rangeOrder=len(coeffs)-1, azimuthOrder=0, coeffs=[coeffs])
rObj = stdproc.createResamp_slc()
rObj.slantRangePixelSpacing = burst.getInstrument().getRangePixelSize()
rObj.radarWavelength = burst.getInstrument().getRadarWavelength()
rObj.dopplerPoly = dpoly
rObj.azimuthOffsetsPoly = azpoly
rObj.rangeOffsetsPoly = rgpoly
rObj.imageIn = inimg
imgOut = isceobj.createSlcImage()
imgOut.setWidth(width)
outdir = os.path.dirname(outname)
os.makedirs(outdir, exist_ok=True)
if zero:
imgOut.filename = os.path.join(outname)
else:
imgOut.filename = os.path.join(outname)
imgOut.setAccessMode('write')
rObj.flatten = flatten
rObj.outputWidth = width
rObj.outputLines = length
rObj.residualRangeImage = rngImg
rObj.residualAzimuthImage = aziImg
if reference is not None:
rObj.startingRange = burst.startingRange
rObj.referenceStartingRange = reference.startingRange
rObj.referenceSlantRangePixelSpacing = reference.getInstrument().getRangePixelSize()
rObj.referenceWavelength = reference.getInstrument().getRadarWavelength()
rObj.resamp_slc(imageOut=imgOut)
imgOut.renderHdr()
return imgOut
def main(iargs=None):
'''
Main driver.
'''
inps = cmdLineParse(iargs)
outfile = os.path.join(inps.coreg,os.path.basename(inps.coreg) + '.slc')
outDir = inps.coreg
os.makedirs(outDir, exist_ok=True)
referenceShelveDir = os.path.join(outDir, 'referenceShelve')
secondaryShelveDir = os.path.join(outDir, 'secondaryShelve')
os.makedirs(referenceShelveDir, exist_ok=True)
os.makedirs(secondaryShelveDir, exist_ok=True)
cmd = 'cp '+ inps.secondary + '/data* ' + secondaryShelveDir
print (cmd)
os.system(cmd)
cmd = 'cp '+ inps.reference + '/data* ' + referenceShelveDir
os.system(cmd)
# with shelve.open(os.path.join(inps.secondary, 'data'), flag='r') as sdb:
with shelve.open(os.path.join(secondaryShelveDir, 'data'), flag='r') as sdb:
secondary = sdb['frame']
try:
doppler = sdb['doppler']
except:
doppler = secondary._dopplerVsPixel
if inps.poly is not None:
with shelve.open(inps.poly, flag='r') as db:
azpoly = db['azpoly']
rgpoly = db['rgpoly']
else:
azpoly = None
rgpoly = None
if inps.reference is not None:
#with shelve.open(os.path.join(inps.reference, 'data'), flag='r') as mdb:
with shelve.open(os.path.join(referenceShelveDir, 'data'), flag='r') as mdb:
reference = mdb['frame']
else:
reference = None
resampSecondary(secondary, inps.offsets, outfile,
doppler, azpoly,rgpoly,
flatten=(not inps.noflat), zero=inps.zero,
dims = inps.dims,
reference = reference)
# flattenSLC(secondary, inps.coreg, rgpoly)
if __name__ == '__main__':
'''
Main driver.
'''
main()