ISCE_INSAR/contrib/stack/stripmapStack/resampleSlc_subBand.py

234 lines
6.7 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', '--master', dest='master', type=str, default=None,
help = 'Directory with master acquisition for reference')
parser.add_argument('-s', '--slave', dest='slave', type=str, required=True,
help='Directory with slave 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.slave.endswith('/'):
# inps.slave = inps.slave[:-1]
#if inps.coreg is None:
# inps.coreg = os.path.join('coreg', os.path.basename(inps.slave))
#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.slave.endswith('/'):
inps.slave = inps.slave[:-1]
if inps.coreg is None:
inps.coreg = os.path.join('coreg', os.path.basename(inps.slave))
return inps
@use_api
def resampSlave(burst, offdir, outname, doppler, azpoly, rgpoly,
master=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 master is not None:
rObj.startingRange = burst.startingRange
rObj.referenceStartingRange = master.startingRange
rObj.referenceSlantRangePixelSpacing = master.getInstrument().getRangePixelSize()
# rObj.referenceWavelength = master.getInstrument().getRadarWavelength()
rObj.referenceWavelength = master.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)
masterShelveDir = os.path.join(outDir, 'masterShelve')
slaveShelveDir = os.path.join(outDir, 'slaveShelve')
if inps.master is not None:
os.makedirs(masterShelveDir, exist_ok=True)
os.makedirs(slaveShelveDir, exist_ok=True)
cmd = 'cp '+ inps.slave + '/data* ' + slaveShelveDir
print (cmd)
os.system(cmd)
if inps.master is not None:
cmd = 'cp '+ inps.master + '/data* ' + masterShelveDir
os.system(cmd)
# with shelve.open(os.path.join(inps.slave, 'data'), flag='r') as sdb:
with shelve.open(os.path.join(slaveShelveDir, 'data'), flag='r') as sdb:
slave = sdb['frame']
try:
doppler = sdb['doppler']
except:
doppler = slave._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.master is not None:
# with shelve.open(os.path.join(inps.master, 'data'), flag='r') as mdb:
with shelve.open(os.path.join(masterShelveDir, 'data'), flag='r') as mdb:
master = mdb['frame']
else:
master = None
resampSlave(slave, inps.offsets, outfile,
doppler, azpoly,rgpoly,
flatten=(not inps.noflat), zero=inps.zero,
dims = inps.dims,
master = master)
# flattenSLC(slave, inps.coreg, rgpoly)
if __name__ == '__main__':
'''
Main driver.
'''
main()