Fixed some bugs in rubbersheeting and runInterferogram

LT1AB
vbrancat 2019-11-13 10:33:46 -08:00
parent 37a510fd2d
commit 532cfa085b
5 changed files with 101 additions and 51 deletions

View File

@ -31,14 +31,14 @@ def write_xml(fileName,width,length,bands,dataType,scheme):
return None return None
def compute_FlatEarth(self,width,length): def compute_FlatEarth(self,ifgFilename,width,length,radarWavelength):
from imageMath import IML from imageMath import IML
import logging import logging
# If rubbersheeting has been performed add back the range sheet offsets # If rubbersheeting has been performed add back the range sheet offsets
info = self._insar.loadProduct(self._insar.slaveSlcCropProduct) info = self._insar.loadProduct(self._insar.slaveSlcCropProduct)
radarWavelength = info.getInstrument().getRadarWavelength() #radarWavelength = info.getInstrument().getRadarWavelength()
rangePixelSize = info.getInstrument().getRangePixelSize() rangePixelSize = info.getInstrument().getRangePixelSize()
fact = 4 * np.pi* rangePixelSize / radarWavelength fact = 4 * np.pi* rangePixelSize / radarWavelength
@ -55,7 +55,7 @@ def compute_FlatEarth(self,width,length):
rng2 = np.zeros((length,width)) rng2 = np.zeros((length,width))
# Open the interferogram # Open the interferogram
ifgFilename= os.path.join(self.insar.ifgDirname, self.insar.ifgFilename) #ifgFilename= os.path.join(self.insar.ifgDirname, self.insar.ifgFilename)
intf = np.memmap(ifgFilename+'.full',dtype=np.complex64,mode='r+',shape=(length,width)) intf = np.memmap(ifgFilename+'.full',dtype=np.complex64,mode='r+',shape=(length,width))
for ll in range(length): for ll in range(length):
@ -126,7 +126,8 @@ def computeCoherence(slc1name, slc2name, corname, virtual=True):
return return
# Modified by V. Brancato on 10.09.2019 (added self) # Modified by V. Brancato on 10.09.2019 (added self)
def generateIgram(self,imageSlc1, imageSlc2, resampName, azLooks, rgLooks): # Modified by V. Brancato on 11.13.2019 (added radar wavelength for low and high band flattening
def generateIgram(self,imageSlc1, imageSlc2, resampName, azLooks, rgLooks,radarWavelength):
objSlc1 = isceobj.createSlcImage() objSlc1 = isceobj.createSlcImage()
IU.copyAttributes(imageSlc1, objSlc1) IU.copyAttributes(imageSlc1, objSlc1)
objSlc1.setAccessMode('read') objSlc1.setAccessMode('read')
@ -192,7 +193,7 @@ def generateIgram(self,imageSlc1, imageSlc2, resampName, azLooks, rgLooks):
objCrossmul.crossmul(objSlc1, objSlc2, objInt, objAmp) objCrossmul.crossmul(objSlc1, objSlc2, objInt, objAmp)
# Remove Flat-Earth component # Remove Flat-Earth component
compute_FlatEarth(self,intWidth,lines) compute_FlatEarth(self,resampInt,intWidth,lines,radarWavelength)
# Perform Multilook # Perform Multilook
multilook(resampInt+'.full', outname=resampInt, alks=azLooks, rlks=rgLooks) #takeLooks(objAmp,azLooks,rgLooks) multilook(resampInt+'.full', outname=resampInt, alks=azLooks, rlks=rgLooks) #takeLooks(objAmp,azLooks,rgLooks)
@ -206,7 +207,7 @@ def generateIgram(self,imageSlc1, imageSlc2, resampName, azLooks, rgLooks):
return imageInt, imageAmp return imageInt, imageAmp
def subBandIgram(self, masterSlc, slaveSlc, subBandDir): def subBandIgram(self, masterSlc, slaveSlc, subBandDir,radarWavelength):
img1 = isceobj.createImage() img1 = isceobj.createImage()
img1.load(masterSlc + '.xml') img1.load(masterSlc + '.xml')
@ -226,7 +227,7 @@ def subBandIgram(self, masterSlc, slaveSlc, subBandDir):
interferogramName = os.path.join(ifgDir , self.insar.ifgFilename) interferogramName = os.path.join(ifgDir , self.insar.ifgFilename)
generateIgram(self,img1, img2, interferogramName, azLooks, rgLooks) generateIgram(self,img1, img2, interferogramName, azLooks, rgLooks,radarWavelength)
return interferogramName return interferogramName
@ -259,9 +260,9 @@ def runSubBandInterferograms(self):
slaveHighBandSlc = os.path.join(coregDir , os.path.basename(slaveSlc)) slaveHighBandSlc = os.path.join(coregDir , os.path.basename(slaveSlc))
########## ##########
interferogramName = subBandIgram(self, masterLowBandSlc, slaveLowBandSlc, self.insar.lowBandSlcDirname) interferogramName = subBandIgram(self, masterLowBandSlc, slaveLowBandSlc, self.insar.lowBandSlcDirname,self.insar.lowBandRadarWavelength)
interferogramName = subBandIgram(self, masterHighBandSlc, slaveHighBandSlc, self.insar.highBandSlcDirname) interferogramName = subBandIgram(self, masterHighBandSlc, slaveHighBandSlc, self.insar.highBandSlcDirname,self.insar.highBandRadarWavelength)
def runFullBandInterferogram(self): def runFullBandInterferogram(self):
logger.info("Generating interferogram") logger.info("Generating interferogram")
@ -296,7 +297,10 @@ def runFullBandInterferogram(self):
interferogramName = os.path.join(ifgDir , self.insar.ifgFilename) interferogramName = os.path.join(ifgDir , self.insar.ifgFilename)
generateIgram(self,img1, img2, interferogramName, azLooks, rgLooks) info = self._insar.loadProduct(self._insar.slaveSlcCropProduct)
radarWavelength = info.getInstrument().getRadarWavelength()
generateIgram(self,img1, img2, interferogramName, azLooks, rgLooks,radarWavelength)
###Compute coherence ###Compute coherence

View File

@ -61,9 +61,11 @@ def resampleSlc(self,masterFrame, slaveFrame, imageSlc2, radarWavelength, coregD
if not self.doRubbersheetingRange: if not self.doRubbersheetingRange:
print('Rubber sheeting in range is turned off, flattening the interferogram during resampling') print('Rubber sheeting in range is turned off, flattening the interferogram during resampling')
flatten = True flatten = True
print(flatten)
else: else:
print('Rubber sheeting in range is turned on, flattening the interferogram during interferogram formation') print('Rubber sheeting in range is turned on, flattening the interferogram during interferogram formation')
flatten=False flatten=False
print(flatten)
# end of Modification # end of Modification
rObj.flatten = flatten rObj.flatten = flatten

View File

@ -168,6 +168,7 @@ def runRubbersheet(self):
# filtAzOffsetFile to it. # filtAzOffsetFile to it.
resampleOffset(filtAzOffsetFile, geometryAzimuthOffset, sheetOffset) resampleOffset(filtAzOffsetFile, geometryAzimuthOffset, sheetOffset)
print("I'm here")
return None return None

View File

@ -2,6 +2,9 @@
# Author: Heresh Fattahi # Author: Heresh Fattahi
# Copyright 2017 # Copyright 2017
# #
# Modified by V. Brancato
# Included offset filtering with no SNR
#
import isce import isce
import isceobj import isceobj
@ -20,28 +23,36 @@ def mask_filterNoSNR(denseOffsetFile,filterSize,outName):
off_rg = ds.GetRasterBand(2).ReadAsArray() off_rg = ds.GetRasterBand(2).ReadAsArray()
ds = None ds = None
off_az_copy = np.copy(off_az) # Remove missing values from ampcor
off_rg_copy = np.copy(off_rg) off_rg[np.where(off_rg < -9999)]=0
off_az[np.where(off_az < -9999)]=0
# Compute MAD
off_azm = ndimage.median_filter(off_az,filterSize)
off_rgm = ndimage.median_filter(off_rg,filterSize)
metric_rg = np.abs(off_rgm-off_rg)
metric_az = np.abs(off_azm-off_az)
idx = np.where((metric_rg > 3) | (metric_az > 3))
# Remove missing values in the offset map # Store the offsets in a complex variable
off_az_copy[np.where(off_az_copy<-9999)]=np.nan off = off_rg + 1j*off_az
off_az_copy[idx]=np.nan
# Mask the azimuth offsets based on the MAD
mask = off_masking(off,filterSize,thre=3)
# Fill the offsets with smoothed values xoff_masked = np.ma.array(off.real,mask=mask)
off_az_filled = fill_with_smoothed(off_az_copy,filterSize) yoff_masked = np.ma.array(off.imag,mask=mask)
# Median filter the offsets # Delete unused variables
mask = None
off = None
# Remove residual noisy spots with a median filter on the azimuth offmap
yoff_masked.mask = yoff_masked.mask | \
(ndimage.median_filter(xoff_masked.filled(fill_value=0),3) == 0) | \
(ndimage.median_filter(yoff_masked.filled(fill_value=0),3) == 0)
# Fill the data by iteratively using smoothed values
data = yoff_masked.data
data[yoff_masked.mask]=np.nan
off_az_filled = fill_with_smoothed(data,filterSize)
# Apply median filter to smooth the azimuth offset map
off_az_filled = ndimage.median_filter(off_az_filled,filterSize) off_az_filled = ndimage.median_filter(off_az_filled,filterSize)
# Save the filtered offsets # Save the filtered offsets
@ -63,8 +74,18 @@ def mask_filterNoSNR(denseOffsetFile,filterSize,outName):
img.scheme = 'BIP' img.scheme = 'BIP'
img.renderHdr() img.renderHdr()
return None
return
def off_masking(off,filterSize,thre=2):
# Define the mask to fill the offsets
vram = ndimage.median_filter(off.real, filterSize)
vazm = ndimage.median_filter(off.imag, filterSize)
mask = (np.abs(off.real-vram) > thre) | (np.abs(off.imag-vazm) > thre) | (off.imag == 0) | (off.real == 0)
return mask
def fill(data, invalid=None): def fill(data, invalid=None):
""" """
@ -139,11 +160,11 @@ def fill_with_smoothed(off,filterSize):
loop = 0 loop = 0
cnt2=1 cnt2=1
while (loop<100): while (cnt2!=0 & loop<100):
loop += 1 loop += 1
idx2= np.isnan(off_2filt) idx2= np.isnan(off_2filt)
cnt2 = np.sum(np.count_nonzero(np.isnan(off_2filt))) cnt2 = np.sum(np.count_nonzero(np.isnan(off_2filt)))
print(cnt2)
if cnt2 != 0: if cnt2 != 0:
off_filt= convolve(off_2filt,kernel,boundary='extend',nan_treatment='interpolate') off_filt= convolve(off_2filt,kernel,boundary='extend',nan_treatment='interpolate')
off_2filt[idx2]=off_filt[idx2] off_2filt[idx2]=off_filt[idx2]

View File

@ -10,9 +10,10 @@ import isce
import isceobj import isceobj
from osgeo import gdal from osgeo import gdal
from scipy import ndimage from scipy import ndimage
from astropy.convolution import convolve
import numpy as np import numpy as np
import os import os
from astropy.convolution import convolve
def mask_filterNoSNR(denseOffsetFile,filterSize,outName): def mask_filterNoSNR(denseOffsetFile,filterSize,outName):
# Masking the offsets with a data-based approach # Masking the offsets with a data-based approach
@ -23,27 +24,36 @@ def mask_filterNoSNR(denseOffsetFile,filterSize,outName):
off_rg = ds.GetRasterBand(2).ReadAsArray() off_rg = ds.GetRasterBand(2).ReadAsArray()
ds = None ds = None
off_az_copy = np.copy(off_az) # Remove values reported as missing data (no value data from ampcor)
off_rg_copy = np.copy(off_rg) off_rg[np.where(off_rg < -9999)]=0
off_az[np.where(off_az < -9999)]=0
# Compute MAD # Store the offsets in a complex variable
off_azm = ndimage.median_filter(off_az,filterSize) off = off_rg + 1j*off_az
off_rgm = ndimage.median_filter(off_rg,filterSize)
metric_rg = np.abs(off_rgm-off_rg) # Mask the offset based on MAD
metric_az = np.abs(off_azm-off_az) mask = off_masking(off,filterSize,thre=3)
xoff_masked = np.ma.array(off.real,mask=mask)
yoff_masked = np.ma.array(off.imag,mask=mask)
idx = np.where((metric_rg > 3) | (metric_az > 3)) # Delete not used variables
mask = None
off = None
# Remove missing data in the offset map # Remove residual noisy spots with a median filter on the range offmap
off_rg_copy[np.where(off_rg_copy<-9999)]=np.nan xoff_masked.mask = xoff_masked.mask | \
off_rg_copy[idx]=np.nan (ndimage.median_filter(xoff_masked.filled(fill_value=0),3) == 0) | \
(ndimage.median_filter(yoff_masked.filled(fill_value=0),3) == 0)
# Fill the offsets with smoothed values # Fill the range offset map iteratively with smoothed values
off_rg_filled = fill_with_smoothed(off_rg_copy,filterSize)
# Median filter the offsets data = xoff_masked.data
data[xoff_masked.mask]=np.nan
off_rg_filled = fill_with_smoothed(data,filterSize)
# Apply the median filter on the offset
off_rg_filled = ndimage.median_filter(off_rg_filled,filterSize) off_rg_filled = ndimage.median_filter(off_rg_filled,filterSize)
# Save the filtered offsets # Save the filtered offsets
@ -65,7 +75,16 @@ def mask_filterNoSNR(denseOffsetFile,filterSize,outName):
img.scheme = 'BIP' img.scheme = 'BIP'
img.renderHdr() img.renderHdr()
return None return
def off_masking(off,filterSize,thre=2):
vram = ndimage.median_filter(off.real, filterSize)
vazm = ndimage.median_filter(off.imag, filterSize)
mask = (np.abs(off.real-vram) > thre) | (np.abs(off.imag-vazm) > thre) | (off.imag == 0) | (off.real == 0)
return mask
def fill(data, invalid=None): def fill(data, invalid=None):
""" """
@ -95,11 +114,11 @@ def fill_with_smoothed(off,filterSize):
loop = 0 loop = 0
cnt2=1 cnt2=1
while (loop<100): while (cnt2 !=0 & loop<100):
loop += 1 loop += 1
idx2= np.isnan(off_2filt) idx2= np.isnan(off_2filt)
cnt2 = np.sum(np.count_nonzero(np.isnan(off_2filt))) cnt2 = np.sum(np.count_nonzero(np.isnan(off_2filt)))
print(cnt2)
if cnt2 != 0: if cnt2 != 0:
off_filt= convolve(off_2filt,kernel,boundary='extend',nan_treatment='interpolate') off_filt= convolve(off_2filt,kernel,boundary='extend',nan_treatment='interpolate')
off_2filt[idx2]=off_filt[idx2] off_2filt[idx2]=off_filt[idx2]
@ -255,3 +274,6 @@ def runRubbersheetRange(self):