ISCE_INSAR/components/isceobj/TopsProc/runBurstIfg.py

224 lines
6.8 KiB
Python

#
# Author: Piyush Agram
# Copyright 2016
#
import isceobj
import stdproc
from stdproc.stdproc import crossmul
import numpy as np
from isceobj.Util.Poly2D import Poly2D
import argparse
import os
import copy
from isceobj.Sensor.TOPS import createTOPSSwathSLCProduct
from mroipac.correlation.correlation import Correlation
def loadVirtualArray(fname):
from osgeo import gdal
ds = gdal.Open(fname, gdal.GA_ReadOnly)
data = ds.GetRasterBand(1).ReadAsArray()
ds = None
return data
def multiply(masname, slvname, outname, rngname, fact, referenceFrame,
flatten=True, alks=3, rlks=7, virtual=True):
masImg = isceobj.createSlcImage()
masImg.load( masname + '.xml')
width = masImg.getWidth()
length = masImg.getLength()
if not virtual:
reference = np.memmap(masname, dtype=np.complex64, mode='r', shape=(length,width))
else:
reference = loadVirtualArray(masname + '.vrt')
secondary = np.memmap(slvname, dtype=np.complex64, mode='r', shape=(length, width))
if os.path.exists(rngname):
rng2 = np.memmap(rngname, dtype=np.float32, mode='r', shape=(length,width))
else:
print('No range offsets provided')
rng2 = np.zeros((length,width))
cJ = np.complex64(-1j)
#Zero out anytging outside the valid region:
ifg = np.memmap(outname, dtype=np.complex64, mode='w+', shape=(length,width))
firstS = referenceFrame.firstValidSample
lastS = referenceFrame.firstValidSample + referenceFrame.numValidSamples -1
firstL = referenceFrame.firstValidLine
lastL = referenceFrame.firstValidLine + referenceFrame.numValidLines - 1
for kk in range(firstL,lastL + 1):
ifg[kk,firstS:lastS + 1] = reference[kk,firstS:lastS + 1] * np.conj(secondary[kk,firstS:lastS + 1])
if flatten:
phs = np.exp(cJ*fact*rng2[kk,firstS:lastS + 1])
ifg[kk,firstS:lastS + 1] *= phs
####
reference=None
secondary=None
ifg = None
objInt = isceobj.createIntImage()
objInt.setFilename(outname)
objInt.setWidth(width)
objInt.setLength(length)
objInt.setAccessMode('READ')
objInt.renderHdr()
try:
takeLooks(objInt, alks, rlks)
except:
raise Exception('Failed to multilook ifg: {0}'.format(objInt.filename))
return objInt
def takeLooks(inimg, alks, rlks):
'''
Take looks.
'''
from mroipac.looks.Looks import Looks
spl = os.path.splitext(inimg.filename)
ext = '.{0}alks_{1}rlks'.format(alks, rlks)
outfile = spl[0] + ext + spl[1]
lkObj = Looks()
lkObj.setDownLooks(alks)
lkObj.setAcrossLooks(rlks)
lkObj.setInputImage(inimg)
lkObj.setOutputFilename(outfile)
lkObj.looks()
return outfile
def computeCoherence(slc1name, slc2name, corname, virtual=True):
slc1 = isceobj.createImage()
slc1.load( slc1name + '.xml')
slc1.createImage()
slc2 = isceobj.createImage()
slc2.load( slc2name + '.xml')
slc2.createImage()
cohImage = isceobj.createOffsetImage()
cohImage.setFilename(corname)
cohImage.setWidth(slc1.getWidth())
cohImage.setAccessMode('write')
cohImage.createImage()
cor = Correlation()
cor.configure()
cor.wireInputPort(name='slc1', object=slc1)
cor.wireInputPort(name='slc2', object=slc2)
cor.wireOutputPort(name='correlation', object=cohImage)
cor.coregisteredSlcFlag = True
cor.calculateCorrelation()
cohImage.finalizeImage()
slc1.finalizeImage()
slc2.finalizeImage()
return
def adjustValidLineSample(reference,secondary):
reference_lastValidLine = reference.firstValidLine + reference.numValidLines - 1
reference_lastValidSample = reference.firstValidSample + reference.numValidSamples - 1
secondary_lastValidLine = secondary.firstValidLine + secondary.numValidLines - 1
secondary_lastValidSample = secondary.firstValidSample + secondary.numValidSamples - 1
igram_lastValidLine = min(reference_lastValidLine, secondary_lastValidLine)
igram_lastValidSample = min(reference_lastValidSample, secondary_lastValidSample)
reference.firstValidLine = max(reference.firstValidLine, secondary.firstValidLine)
reference.firstValidSample = max(reference.firstValidSample, secondary.firstValidSample)
reference.numValidLines = igram_lastValidLine - reference.firstValidLine + 1
reference.numValidSamples = igram_lastValidSample - reference.firstValidSample + 1
def runBurstIfg(self):
'''Create burst interferograms.
'''
virtual = self.useVirtualFiles
swathList = self._insar.getValidSwathList(self.swaths)
for swath in swathList:
minBurst, maxBurst = self._insar.commonReferenceBurstLimits(swath-1)
nBurst = maxBurst - minBurst
if nBurst == 0:
continue
ifgdir = os.path.join(self._insar.fineIfgDirname, 'IW{0}'.format(swath))
os.makedirs(ifgdir, exist_ok=True)
####Load relevant products
reference = self._insar.loadProduct( os.path.join(self._insar.referenceSlcProduct, 'IW{0}.xml'.format(swath)))
secondary = self._insar.loadProduct( os.path.join(self._insar.fineCoregDirname, 'IW{0}.xml'.format(swath)))
coregdir = os.path.join(self._insar.fineOffsetsDirname, 'IW{0}'.format(swath))
fineIfg = createTOPSSwathSLCProduct()
fineIfg.configure()
for ii in range(minBurst, maxBurst):
jj = ii - minBurst
####Process the top bursts
masBurst = reference.bursts[ii]
slvBurst = secondary.bursts[jj]
referencename = masBurst.image.filename
secondaryname = slvBurst.image.filename
rdict = {'rangeOff' : os.path.join(coregdir, 'range_%02d.off'%(ii+1)),
'azimuthOff': os.path.join(coregdir, 'azimuth_%02d.off'%(ii+1))}
adjustValidLineSample(masBurst,slvBurst)
if self.doInSAR:
intname = os.path.join(ifgdir, '%s_%02d.int'%('burst',ii+1))
fact = 4 * np.pi * slvBurst.rangePixelSize / slvBurst.radarWavelength
intimage = multiply(referencename, secondaryname, intname,
rdict['rangeOff'], fact, masBurst, flatten=True,
alks = self.numberAzimuthLooks, rlks=self.numberRangeLooks,
virtual=virtual)
burst = masBurst.clone()
if self.doInSAR:
burst.image = intimage
fineIfg.bursts.append(burst)
if self.doInSAR:
####Estimate coherence
corname = os.path.join(ifgdir, '%s_%02d.cor'%('burst',ii+1))
computeCoherence(referencename, secondaryname, corname)
fineIfg.numberOfBursts = len(fineIfg.bursts)
self._insar.saveProduct(fineIfg, os.path.join(self._insar.fineIfgDirname, 'IW{0}.xml'.format(swath)))