224 lines
6.8 KiB
Python
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)))
|