ISCE_INSAR/components/isceobj/StripmapProc/runInterferogram.py

243 lines
7.5 KiB
Python
Raw Normal View History

2019-01-16 19:40:08 +00:00
#
# Author: Heresh Fattahi, 2017
#
import isceobj
import logging
from components.stdproc.stdproc import crossmul
from iscesys.ImageUtil.ImageUtil import ImageUtil as IU
import os
logger = logging.getLogger('isce.insar.runInterferogram')
def multilook(infile, outname=None, alks=5, rlks=15):
'''
Take looks.
'''
from mroipac.looks.Looks import Looks
print('Multilooking {0} ...'.format(infile))
inimg = isceobj.createImage()
inimg.load(infile + '.xml')
if outname is None:
spl = os.path.splitext(inimg.filename)
ext = '.{0}alks_{1}rlks'.format(alks, rlks)
outname = spl[0] + ext + spl[1]
lkObj = Looks()
lkObj.setDownLooks(alks)
lkObj.setAcrossLooks(rlks)
lkObj.setInputImage(inimg)
lkObj.setOutputFilename(outname)
lkObj.looks()
return outname
def computeCoherence(slc1name, slc2name, corname, virtual=True):
from mroipac.correlation.correlation import Correlation
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 generateIgram(imageSlc1, imageSlc2, resampName, azLooks, rgLooks):
objSlc1 = isceobj.createSlcImage()
IU.copyAttributes(imageSlc1, objSlc1)
objSlc1.setAccessMode('read')
objSlc1.createImage()
objSlc2 = isceobj.createSlcImage()
IU.copyAttributes(imageSlc2, objSlc2)
objSlc2.setAccessMode('read')
objSlc2.createImage()
slcWidth = imageSlc1.getWidth()
intWidth = int(slcWidth / rgLooks)
lines = min(imageSlc1.getLength(), imageSlc2.getLength())
if '.flat' in resampName:
resampAmp = resampName.replace('.flat', '.amp')
elif '.int' in resampName:
resampAmp = resampName.replace('.int', '.amp')
else:
resampAmp += '.amp'
resampInt = resampName
objInt = isceobj.createIntImage()
objInt.setFilename(resampInt)
objInt.setWidth(intWidth)
imageInt = isceobj.createIntImage()
IU.copyAttributes(objInt, imageInt)
objInt.setAccessMode('write')
objInt.createImage()
objAmp = isceobj.createAmpImage()
objAmp.setFilename(resampAmp)
objAmp.setWidth(intWidth)
imageAmp = isceobj.createAmpImage()
IU.copyAttributes(objAmp, imageAmp)
objAmp.setAccessMode('write')
objAmp.createImage()
objCrossmul = crossmul.createcrossmul()
objCrossmul.width = slcWidth
objCrossmul.length = lines
objCrossmul.LooksDown = azLooks
objCrossmul.LooksAcross = rgLooks
objCrossmul.crossmul(objSlc1, objSlc2, objInt, objAmp)
for obj in [objInt, objAmp, objSlc1, objSlc2]:
obj.finalizeImage()
return imageInt, imageAmp
def subBandIgram(self, masterSlc, slaveSlc, subBandDir):
img1 = isceobj.createImage()
img1.load(masterSlc + '.xml')
img2 = isceobj.createImage()
img2.load(slaveSlc + '.xml')
azLooks = self.numberAzimuthLooks
rgLooks = self.numberRangeLooks
ifgDir = os.path.join(self.insar.ifgDirname, subBandDir)
if os.path.isdir(ifgDir):
logger.info('Interferogram directory {0} already exists.'.format(ifgDir))
else:
os.makedirs(ifgDir)
interferogramName = os.path.join(ifgDir , self.insar.ifgFilename)
generateIgram(img1, img2, interferogramName, azLooks, rgLooks)
return interferogramName
def runSubBandInterferograms(self):
logger.info("Generating sub-band interferograms")
masterFrame = self._insar.loadProduct( self._insar.masterSlcCropProduct)
slaveFrame = self._insar.loadProduct( self._insar.slaveSlcCropProduct)
azLooks, rgLooks = self.insar.numberOfLooks( masterFrame, self.posting,
self.numberAzimuthLooks, self.numberRangeLooks)
self.numberAzimuthLooks = azLooks
self.numberRangeLooks = rgLooks
print("azimuth and range looks: ", azLooks, rgLooks)
###########
masterSlc = masterFrame.getImage().filename
lowBandDir = os.path.join(self.insar.splitSpectrumDirname, self.insar.lowBandSlcDirname)
highBandDir = os.path.join(self.insar.splitSpectrumDirname, self.insar.highBandSlcDirname)
masterLowBandSlc = os.path.join(lowBandDir, os.path.basename(masterSlc))
masterHighBandSlc = os.path.join(highBandDir, os.path.basename(masterSlc))
##########
slaveSlc = slaveFrame.getImage().filename
coregDir = os.path.join(self.insar.coregDirname, self.insar.lowBandSlcDirname)
slaveLowBandSlc = os.path.join(coregDir , os.path.basename(slaveSlc))
coregDir = os.path.join(self.insar.coregDirname, self.insar.highBandSlcDirname)
slaveHighBandSlc = os.path.join(coregDir , os.path.basename(slaveSlc))
##########
interferogramName = subBandIgram(self, masterLowBandSlc, slaveLowBandSlc, self.insar.lowBandSlcDirname)
interferogramName = subBandIgram(self, masterHighBandSlc, slaveHighBandSlc, self.insar.highBandSlcDirname)
def runFullBandInterferogram(self):
logger.info("Generating interferogram")
masterFrame = self._insar.loadProduct( self._insar.masterSlcCropProduct)
masterSlc = masterFrame.getImage().filename
if self.doRubbersheeting:
slaveSlc = os.path.join(self._insar.coregDirname, self._insar.fineCoregFilename)
else:
slaveSlc = os.path.join(self._insar.coregDirname, self._insar.refinedCoregFilename)
img1 = isceobj.createImage()
img1.load(masterSlc + '.xml')
img2 = isceobj.createImage()
img2.load(slaveSlc + '.xml')
azLooks, rgLooks = self.insar.numberOfLooks( masterFrame, self.posting,
self.numberAzimuthLooks, self.numberRangeLooks)
self.numberAzimuthLooks = azLooks
self.numberRangeLooks = rgLooks
print("azimuth and range looks: ", azLooks, rgLooks)
ifgDir = self.insar.ifgDirname
if os.path.isdir(ifgDir):
logger.info('Interferogram directory {0} already exists.'.format(ifgDir))
else:
os.makedirs(ifgDir)
interferogramName = os.path.join(ifgDir , self.insar.ifgFilename)
generateIgram(img1, img2, interferogramName, azLooks, rgLooks)
###Compute coherence
cohname = os.path.join(self.insar.ifgDirname, self.insar.correlationFilename)
computeCoherence(masterSlc, slaveSlc, cohname+'.full')
multilook(cohname+'.full', outname=cohname, alks=azLooks, rlks=rgLooks)
###Multilook relevant geometry products
for fname in [self.insar.latFilename, self.insar.lonFilename, self.insar.losFilename]:
inname = os.path.join(self.insar.geometryDirname, fname)
multilook(inname + '.full', outname= inname, alks=azLooks, rlks=rgLooks)
def runInterferogram(self, igramSpectrum = "full"):
logger.info("igramSpectrum = {0}".format(igramSpectrum))
if igramSpectrum == "full":
runFullBandInterferogram(self)
elif igramSpectrum == "sub":
if not self.doDispersive:
print('Estimating dispersive phase not requested ... skipping sub-band interferograms')
return
runSubBandInterferograms(self)