ISCE_INSAR/components/isceobj/Alos2burstProc/runFiltSd.py

94 lines
3.8 KiB
Python

#
# Author: Cunren Liang
# Copyright 2015-present, NASA-JPL/Caltech
#
import os
import shutil
import logging
import numpy as np
import isceobj
from mroipac.filter.Filter import Filter
from mroipac.icu.Icu import Icu
from isceobj.Alos2Proc.Alos2ProcPublic import runCmd
from isceobj.Alos2Proc.Alos2ProcPublic import renameFile
from isceobj.Alos2Proc.Alos2ProcPublic import create_xml
from contrib.alos2filter.alos2filter import psfilt1
from isceobj.Alos2Proc.Alos2ProcPublic import cal_coherence
logger = logging.getLogger('isce.alos2burstinsar.runFiltSd')
def runFiltSd(self):
'''filter interferogram
'''
catalog = isceobj.Catalog.createCatalog(self._insar.procDoc.name)
self.updateParamemetersFromUser()
#referenceTrack = self._insar.loadTrack(reference=True)
#secondaryTrack = self._insar.loadTrack(reference=False)
sdDir = 'sd'
os.makedirs(sdDir, exist_ok=True)
os.chdir(sdDir)
sd = isceobj.createImage()
sd.load(self._insar.multilookInterferogramSd[0]+'.xml')
width = sd.width
length = sd.length
############################################################
# STEP 1. filter interferogram
############################################################
for sdInterferogram, sdInterferogramFilt, sdCoherence in zip(self._insar.multilookInterferogramSd, self._insar.filteredInterferogramSd, self._insar.multilookCoherenceSd):
print('filter interferogram: {}'.format(sdInterferogram))
#remove mangnitude
data = np.fromfile(sdInterferogram, dtype=np.complex64).reshape(length, width)
index = np.nonzero(data!=0)
data[index] /= np.absolute(data[index])
data.astype(np.complex64).tofile('tmp.int')
#filter
windowSize = self.filterWinsizeSd
stepSize = self.filterStepsizeSd
psfilt1('tmp.int', sdInterferogramFilt, width, self.filterStrengthSd, windowSize, stepSize)
create_xml(sdInterferogramFilt, width, length, 'int')
os.remove('tmp.int')
#restore magnitude
data = np.fromfile(sdInterferogram, dtype=np.complex64).reshape(length, width)
dataFilt = np.fromfile(sdInterferogramFilt, dtype=np.complex64).reshape(length, width)
index = np.nonzero(dataFilt!=0)
dataFilt[index] = dataFilt[index] / np.absolute(dataFilt[index]) * np.absolute(data[index])
dataFilt.astype(np.complex64).tofile(sdInterferogramFilt)
# #create a coherence using an interferogram with most sparse fringes
# if sdInterferogramFilt == self._insar.filteredInterferogramSd[0]:
# print('create coherence using: {}'.format(sdInterferogramFilt))
# cor = cal_coherence(dataFilt, win=3, edge=2)
# cor.astype(np.float32).tofile(self._insar.multilookCoherenceSd)
# create_xml(self._insar.multilookCoherenceSd, width, length, 'float')
cor = cal_coherence(dataFilt, win=3, edge=2)
cor.astype(np.float32).tofile(sdCoherence)
create_xml(sdCoherence, width, length, 'float')
############################################################
# STEP 3. mask filtered interferogram using water body
############################################################
if self.waterBodyMaskStartingStepSd=='filt':
print('mask filtered interferogram using: {}'.format(self._insar.multilookWbdOutSd))
wbd = np.fromfile(self._insar.multilookWbdOutSd, dtype=np.int8).reshape(length, width)
cor=np.memmap(self._insar.multilookCoherenceSd, dtype='float32', mode='r+', shape=(length, width))
cor[np.nonzero(wbd==-1)]=0
for sdInterferogramFilt in self._insar.filteredInterferogramSd:
filt=np.memmap(sdInterferogramFilt, dtype='complex64', mode='r+', shape=(length, width))
filt[np.nonzero(wbd==-1)]=0
os.chdir('../')
catalog.printToLog(logger, "runFiltSd")
self._insar.procDoc.addAllFromCatalog(catalog)