2019-01-16 19:40:08 +00:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
|
|
|
import numpy as np
|
|
|
|
import argparse
|
|
|
|
import os
|
|
|
|
import isce
|
|
|
|
import isceobj
|
|
|
|
import glob
|
|
|
|
import s1a_isce_utils as ut
|
|
|
|
|
|
|
|
def createParser():
|
|
|
|
parser = argparse.ArgumentParser( description='Estimate azimuth misregistration using overlap ifgs')
|
|
|
|
parser.add_argument('-i', '--overlap_dir', type=str, dest='esdDirname', default='overlap',
|
|
|
|
help='Directory with the combined overlap interferograms')
|
|
|
|
parser.add_argument('-o', '--out_azimuth', type=str, dest='output', default='misreg.txt',
|
|
|
|
help='Textfile with the constant azimuth offset')
|
|
|
|
parser.add_argument('-t', '--coh_threshold', type=float, dest='esdCoherenceThreshold', default=0.95,
|
|
|
|
help='Coherence threshold for overlap masking')
|
|
|
|
|
|
|
|
parser.add_argument('-a', '--azimuth_looks', type=str, dest='esdAzimuthLooks', default=5,
|
|
|
|
help='Azimuth looks')
|
|
|
|
parser.add_argument('-r', '--range_looks', type=str, dest='esdRangeLooks', default=15,
|
|
|
|
help='Range looks')
|
|
|
|
|
|
|
|
return parser
|
|
|
|
|
|
|
|
def cmdLineParse(iargs=None):
|
|
|
|
'''
|
|
|
|
Command line parser.
|
|
|
|
'''
|
|
|
|
parser = createParser()
|
|
|
|
return parser.parse_args(args=iargs)
|
|
|
|
|
|
|
|
def main(iargs=None):
|
|
|
|
|
|
|
|
inps = cmdLineParse(iargs)
|
|
|
|
|
|
|
|
'''
|
|
|
|
Estimate azimuth misregistration.
|
|
|
|
'''
|
|
|
|
|
|
|
|
#catalog = isceobj.Catalog.createCatalog(self._insar.procDoc.name)
|
|
|
|
|
|
|
|
#master = self._insar.loadProduct( self._insar.masterSlcProduct + '.xml' )
|
|
|
|
|
|
|
|
#minBurst, maxBurst = self._insar.commonMasterBurstLimits
|
|
|
|
#slaveBurstStart, slaveBurstEnd = self._insar.commonSlaveBurstLimits
|
|
|
|
|
|
|
|
esdPath = inps.esdDirname
|
|
|
|
swathList = ut.getSwathList(esdPath)
|
|
|
|
|
|
|
|
|
|
|
|
alks = inps.esdAzimuthLooks
|
|
|
|
rlks = inps.esdRangeLooks
|
|
|
|
|
|
|
|
#esdPath = esdPath.split()
|
|
|
|
val = []
|
|
|
|
#for esddir in esdPath:
|
|
|
|
for swath in swathList:
|
|
|
|
esddir = os.path.join(esdPath, 'IW{0}'.format(swath))
|
|
|
|
freqFiles = glob.glob(os.path.join(esddir,'freq_??.bin'))
|
|
|
|
freqFiles.sort()
|
|
|
|
|
|
|
|
minBurst = int(os.path.basename(freqFiles[0]).split('.')[0][-2:])
|
|
|
|
maxBurst = int(os.path.basename(freqFiles[-1]).split('.')[0][-2:])
|
2020-04-10 03:57:44 +00:00
|
|
|
maxBurst = maxBurst + 1
|
2019-01-16 19:40:08 +00:00
|
|
|
|
|
|
|
#maxBurst = maxBurst - 1
|
|
|
|
|
|
|
|
combIntName = os.path.join(esddir, 'combined.int')
|
|
|
|
combFreqName = os.path.join(esddir, 'combined_freq.bin')
|
|
|
|
combCorName = os.path.join(esddir, 'combined.cor')
|
|
|
|
combOffName = os.path.join(esddir, 'combined.off')
|
|
|
|
|
|
|
|
|
|
|
|
for ff in [combIntName, combFreqName, combCorName, combOffName]:
|
|
|
|
if os.path.exists(ff):
|
|
|
|
os.remove(ff)
|
|
|
|
|
|
|
|
# val = []
|
|
|
|
lineCount = 0
|
|
|
|
for ii in range(minBurst, maxBurst):
|
2020-04-10 03:57:44 +00:00
|
|
|
intname = os.path.join(esddir, 'overlap_%02d.%dalks_%drlks.int'%(ii, alks,rlks))
|
|
|
|
freqname = os.path.join(esddir, 'freq_%02d.%dalks_%drlks.bin'%(ii,alks,rlks))
|
|
|
|
corname = os.path.join(esddir, 'overlap_%02d.%dalks_%drlks.cor'%(ii, alks, rlks))
|
2019-01-16 19:40:08 +00:00
|
|
|
|
|
|
|
|
|
|
|
img = isceobj.createImage()
|
|
|
|
img.load(intname + '.xml')
|
|
|
|
width = img.getWidth()
|
|
|
|
length = img.getLength()
|
|
|
|
|
|
|
|
ifg = np.fromfile(intname, dtype=np.complex64).reshape((-1,width))
|
|
|
|
freq = np.fromfile(freqname, dtype=np.float32).reshape((-1,width))
|
|
|
|
cor = np.fromfile(corname, dtype=np.float32).reshape((-1,width))
|
|
|
|
|
|
|
|
with open(combIntName, 'ab') as fid:
|
|
|
|
ifg.tofile(fid)
|
|
|
|
|
|
|
|
with open(combFreqName, 'ab') as fid:
|
|
|
|
freq.tofile(fid)
|
|
|
|
|
|
|
|
with open(combCorName, 'ab') as fid:
|
|
|
|
cor.tofile(fid)
|
|
|
|
|
|
|
|
off = np.angle(ifg) / freq
|
|
|
|
|
|
|
|
with open(combOffName, 'ab') as fid:
|
|
|
|
off.astype(np.float32).tofile(fid)
|
|
|
|
|
|
|
|
lineCount += length
|
|
|
|
|
|
|
|
|
|
|
|
mask = (np.abs(ifg) > 0) * (cor > inps.esdCoherenceThreshold)
|
|
|
|
|
|
|
|
vali = off[mask]
|
|
|
|
val = np.hstack((val, vali))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
img = isceobj.createIntImage()
|
|
|
|
img.filename = combIntName
|
|
|
|
img.setWidth(width)
|
|
|
|
img.setAccessMode('READ')
|
|
|
|
img.renderHdr()
|
|
|
|
|
|
|
|
for fname in [combFreqName, combCorName, combOffName]:
|
|
|
|
img = isceobj.createImage()
|
|
|
|
img.bands = 1
|
|
|
|
img.scheme = 'BIP'
|
|
|
|
img.dataType = 'FLOAT'
|
|
|
|
img.filename = fname
|
|
|
|
img.setWidth(width)
|
|
|
|
img.setAccessMode('READ')
|
|
|
|
img.renderHdr()
|
|
|
|
|
|
|
|
if val.size == 0 :
|
|
|
|
raise Exception('Coherence threshold too strict. No points left for reliable ESD estimate')
|
|
|
|
|
|
|
|
medianval = np.median(val)
|
|
|
|
meanval = np.mean(val)
|
|
|
|
stdval = np.std(val)
|
|
|
|
|
|
|
|
hist, bins = np.histogram(val, 50, normed=1)
|
|
|
|
center = 0.5*(bins[:-1] + bins[1:])
|
|
|
|
|
|
|
|
|
|
|
|
debugplot = True
|
|
|
|
try:
|
|
|
|
import matplotlib as mpl
|
|
|
|
mpl.use('Agg')
|
|
|
|
import matplotlib.pyplot as plt
|
|
|
|
except:
|
|
|
|
print('Matplotlib could not be imported. Skipping debug plot...')
|
|
|
|
debugplot = False
|
|
|
|
|
|
|
|
if debugplot:
|
|
|
|
####Plotting
|
|
|
|
plt.figure()
|
|
|
|
plt.bar(center, hist, align='center', width = 0.7*(bins[1] - bins[0]))
|
|
|
|
plt.xlabel('Azimuth shift in pixels')
|
|
|
|
plt.savefig( os.path.join(esddir, 'ESDmisregistration.png'))
|
|
|
|
plt.close()
|
|
|
|
|
|
|
|
|
|
|
|
# catalog.addItem('Median', medianval, 'esd')
|
|
|
|
# catalog.addItem('Mean', meanval, 'esd')
|
|
|
|
# catalog.addItem('Std', stdval, 'esd')
|
|
|
|
# catalog.addItem('coherence threshold', self.esdCoherenceThreshold, 'esd')
|
|
|
|
# catalog.addItem('number of coherent points', val.size, 'esd')
|
|
|
|
|
|
|
|
# catalog.printToLog(logger, "runESD")
|
|
|
|
# self._insar.procDoc.addAllFromCatalog(catalog)
|
|
|
|
|
|
|
|
# slaveTimingCorrection = medianval * master.bursts[0].azimuthTimeInterval
|
|
|
|
|
|
|
|
outputDir = os.path.dirname(inps.output)
|
|
|
|
if not os.path.exists(outputDir):
|
|
|
|
os.makedirs(outputDir)
|
|
|
|
|
|
|
|
with open(inps.output, 'w') as f:
|
|
|
|
f.write('median : '+str(medianval) +'\n')
|
|
|
|
f.write('mean : '+str(meanval)+'\n')
|
|
|
|
f.write('std : '+str(stdval)+'\n')
|
|
|
|
f.write('coherence threshold : '+str(inps.esdCoherenceThreshold)+'\n')
|
|
|
|
f.write('mumber of coherent points : '+str(len(val))+'\n')
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
'''
|
|
|
|
The main driver.
|
|
|
|
'''
|
|
|
|
|
|
|
|
main()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|