ISCE_INSAR/contrib/stack/stripmapStack/resampleSlc_subBand.py

234 lines
6.8 KiB
Python
Executable File

#!/usr/bin/env python3
import isce
import isceobj
import stdproc
from stdproc.stdproc import crossmul
import numpy as np
from isceobj.Util.Poly2D import Poly2D
import argparse
import os
import shelve
from iscesys.ImageUtil.ImageUtil import ImageUtil as IU
import json
import logging
from isceobj.Util.decorators import use_api
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.radarWavelength = burst.subBandRadarWavelength
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.referenceWavelength = reference.subBandRadarWavelength
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(os.path.dirname(inps.coreg))+'.slc')
outDir = inps.coreg
os.makedirs(outDir, exist_ok=True)
referenceShelveDir = os.path.join(outDir, 'referenceShelve')
secondaryShelveDir = os.path.join(outDir, 'secondaryShelve')
if inps.reference is not None:
os.makedirs(referenceShelveDir, exist_ok=True)
os.makedirs(secondaryShelveDir, exist_ok=True)
cmd = 'cp '+ inps.secondary + '/data* ' + secondaryShelveDir
print (cmd)
os.system(cmd)
if inps.reference is not None:
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()