From 537bae03d958fd7b1aee216bd7700f6f07f62da6 Mon Sep 17 00:00:00 2001 From: Ryan Burns Date: Sat, 14 Dec 2019 12:20:41 -0800 Subject: [PATCH 1/2] Hide rubbersheeting scipy/astropy imports Recent rubbersheeting changes added scipy and astropy imports which are not otherwise needed. Due to isce2's eager import behavior this causes errors when using unrelated functionality. We can fix this by tucking these imports away inside their function definitions. To reproduce: `python3 -c "import isce; from stripmapApp import Insar"` (without scipy/astropy installed) --- .../isceobj/StripmapProc/runRubbersheet.py | 6 +++++- .../StripmapProc/runRubbersheetAzimuth.py | 15 ++++++++++---- .../StripmapProc/runRubbersheetRange.py | 20 ++++++++++++++----- 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/components/isceobj/StripmapProc/runRubbersheet.py b/components/isceobj/StripmapProc/runRubbersheet.py index b16a58e..ea417bd 100644 --- a/components/isceobj/StripmapProc/runRubbersheet.py +++ b/components/isceobj/StripmapProc/runRubbersheet.py @@ -6,7 +6,6 @@ import isce import isceobj from osgeo import gdal -from scipy import ndimage import numpy as np import os @@ -24,6 +23,9 @@ def fill(data, invalid=None): Output: Return a filled array. """ + + from scipy import ndimage + if invalid is None: invalid = np.isnan(data) ind = ndimage.distance_transform_edt(invalid, @@ -35,6 +37,8 @@ def fill(data, invalid=None): def mask_filter(denseOffsetFile, snrFile, band, snrThreshold, filterSize, outName): #masking and Filtering + from scipy import ndimage + ##Read in the offset file ds = gdal.Open(denseOffsetFile + '.vrt', gdal.GA_ReadOnly) Offset = ds.GetRasterBand(1).ReadAsArray() diff --git a/components/isceobj/StripmapProc/runRubbersheetAzimuth.py b/components/isceobj/StripmapProc/runRubbersheetAzimuth.py index 75583f1..43ee4a8 100755 --- a/components/isceobj/StripmapProc/runRubbersheetAzimuth.py +++ b/components/isceobj/StripmapProc/runRubbersheetAzimuth.py @@ -9,14 +9,14 @@ import isce import isceobj from osgeo import gdal -from scipy import ndimage -from astropy.convolution import convolve import numpy as np import os def mask_filterNoSNR(denseOffsetFile,filterSize,outName): # Masking the offsets with a data-based approach - + + from scipy import ndimage + # Open the offsets ds = gdal.Open(denseOffsetFile+'.vrt',gdal.GA_ReadOnly) off_az = ds.GetRasterBand(1).ReadAsArray() @@ -79,6 +79,9 @@ def mask_filterNoSNR(denseOffsetFile,filterSize,outName): def off_masking(off,filterSize,thre=2): + + from scipy import ndimage + # Define the mask to fill the offsets vram = ndimage.median_filter(off.real, filterSize) vazm = ndimage.median_filter(off.imag, filterSize) @@ -112,6 +115,8 @@ def fill(data, invalid=None): def mask_filter(denseOffsetFile, snrFile, band, snrThreshold, filterSize, outName): #masking and Filtering + from scipy import ndimage + ##Read in the offset file ds = gdal.Open(denseOffsetFile + '.vrt', gdal.GA_ReadOnly) Offset = ds.GetRasterBand(band).ReadAsArray() @@ -154,7 +159,9 @@ def mask_filter(denseOffsetFile, snrFile, band, snrThreshold, filterSize, outNam return None def fill_with_smoothed(off,filterSize): - + + from astropy.convolution import convolve + off_2filt=np.copy(off) kernel = np.ones((filterSize,filterSize),np.float32)/(filterSize*filterSize) loop = 0 diff --git a/components/isceobj/StripmapProc/runRubbersheetRange.py b/components/isceobj/StripmapProc/runRubbersheetRange.py index 2f1ab3f..04fc2a2 100755 --- a/components/isceobj/StripmapProc/runRubbersheetRange.py +++ b/components/isceobj/StripmapProc/runRubbersheetRange.py @@ -9,15 +9,14 @@ import isce import isceobj from osgeo import gdal -from scipy import ndimage import numpy as np import os -from astropy.convolution import convolve - def mask_filterNoSNR(denseOffsetFile,filterSize,outName): # Masking the offsets with a data-based approach - + + from scipy import ndimage + # Open the offsets ds = gdal.Open(denseOffsetFile+'.vrt',gdal.GA_ReadOnly) off_az = ds.GetRasterBand(1).ReadAsArray() @@ -78,6 +77,9 @@ def mask_filterNoSNR(denseOffsetFile,filterSize,outName): return def off_masking(off,filterSize,thre=2): + + from scipy import ndimage + vram = ndimage.median_filter(off.real, filterSize) vazm = ndimage.median_filter(off.imag, filterSize) @@ -100,6 +102,8 @@ def fill(data, invalid=None): Output: Return a filled array. """ + from scipy import ndimage + if invalid is None: invalid = np.isnan(data) ind = ndimage.distance_transform_edt(invalid, @@ -108,7 +112,9 @@ def fill(data, invalid=None): return data[tuple(ind)] def fill_with_smoothed(off,filterSize): - + + from astropy.convolution import convolve + off_2filt=np.copy(off) kernel = np.ones((filterSize,filterSize),np.float32)/(filterSize*filterSize) loop = 0 @@ -131,6 +137,8 @@ def fill_with_smoothed(off,filterSize): def mask_filter(denseOffsetFile, snrFile, band, snrThreshold, filterSize, outName): #masking and Filtering + from scipy import ndimage + ##Read in the offset file ds = gdal.Open(denseOffsetFile + '.vrt', gdal.GA_ReadOnly) Offset = ds.GetRasterBand(band).ReadAsArray() @@ -236,6 +244,8 @@ def resampleOffset(maskedFiltOffset, geometryOffset, outName): def runRubbersheetRange(self): + from scipy import ndimage + if not self.doRubbersheetingRange: print('Rubber sheeting in azimuth not requested ... skipping') return From e2a81bbd6aca1b121e6612e07e21b17e37bab0f9 Mon Sep 17 00:00:00 2001 From: Ryan Burns Date: Mon, 16 Dec 2019 10:22:01 -0800 Subject: [PATCH 2/2] Hide scipy imports for stripmapapp --- components/isceobj/StripmapProc/runDispersive.py | 3 ++- components/isceobj/TopsProc/runIon.py | 12 +++++++----- components/isceobj/TopsProc/runOffsetFilter.py | 3 ++- components/isceobj/TopsProc/runPrepESD.py | 2 +- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/components/isceobj/StripmapProc/runDispersive.py b/components/isceobj/StripmapProc/runDispersive.py index 305022b..724c189 100644 --- a/components/isceobj/StripmapProc/runDispersive.py +++ b/components/isceobj/StripmapProc/runDispersive.py @@ -9,7 +9,6 @@ from isceobj.Constants import SPEED_OF_LIGHT import numpy as np import gdal -from scipy import ndimage try: import cv2 except ImportError: @@ -296,6 +295,8 @@ def fill(data, invalid=None): Output: Return a filled array. """ + from scipy import ndimage + if invalid is None: invalid = np.isnan(data) ind = ndimage.distance_transform_edt(invalid, diff --git a/components/isceobj/TopsProc/runIon.py b/components/isceobj/TopsProc/runIon.py index 8407287..d0c4af6 100644 --- a/components/isceobj/TopsProc/runIon.py +++ b/components/isceobj/TopsProc/runIon.py @@ -9,9 +9,6 @@ import shutil import datetime import numpy as np import numpy.matlib -import scipy.signal as ss -from scipy import interpolate -from scipy.interpolate import interp1d import isceobj import logging @@ -638,6 +635,7 @@ def cal_coherence(inf, win=5, edge=0): 4: keep all samples ''' + import scipy.signal as ss if win % 2 != 1: raise Exception('window size must be odd!') @@ -1682,6 +1680,9 @@ def computeDopplerOffset(burst, firstline, lastline, firstcolumn, lastcolumn, nr output: first lines > 0, last lines < 0 ''' + from scipy import interpolate + from scipy.interpolate import interp1d + Vs = np.linalg.norm(burst.orbit.interpolateOrbit(burst.sensingMid, method='hermite').getVelocity()) Ks = 2 * Vs * burst.azimuthSteeringRate / burst.radarWavelength @@ -1830,6 +1831,7 @@ def adaptive_gaussian(ionos, wgt, size_max, size_min): size_max: maximum window size size_min: minimum window size ''' + import scipy.signal as ss length = (ionos.shape)[0] width = (ionos.shape)[1] @@ -1892,6 +1894,8 @@ def filt_gaussian(self, ionParam): currently not implemented. a less accurate method is to use ionsphere without any projection ''' + from scipy import interpolate + from scipy.interpolate import interp1d ################################################# #SET PARAMETERS HERE @@ -2659,5 +2663,3 @@ def runIon(self): #esd_noion(self, ionParam) return - - \ No newline at end of file diff --git a/components/isceobj/TopsProc/runOffsetFilter.py b/components/isceobj/TopsProc/runOffsetFilter.py index 51735d9..e9989d9 100644 --- a/components/isceobj/TopsProc/runOffsetFilter.py +++ b/components/isceobj/TopsProc/runOffsetFilter.py @@ -3,7 +3,6 @@ # Copyright 2016 # -from scipy.ndimage.filters import median_filter import numpy as np import isce import isceobj @@ -20,6 +19,8 @@ def runOffsetFilter(self): if not self.doDenseOffsets: return + from scipy.ndimage.filters import median_filter + offsetfile = os.path.join(self._insar.mergedDirname, self._insar.offsetfile) snrfile = os.path.join(self._insar.mergedDirname, self._insar.snrfile) print('\n======================================') diff --git a/components/isceobj/TopsProc/runPrepESD.py b/components/isceobj/TopsProc/runPrepESD.py index 5d65b78..0cf9c3c 100755 --- a/components/isceobj/TopsProc/runPrepESD.py +++ b/components/isceobj/TopsProc/runPrepESD.py @@ -8,7 +8,6 @@ import numpy as np import os import isceobj import logging -import scipy.signal as SS from isceobj.Util.ImageUtil import ImageLib as IML import datetime import pprint @@ -177,6 +176,7 @@ def createCoherence(intfile, win=5): ''' Compute coherence using scipy convolve 2D. ''' + import scipy.signal as SS corfile = os.path.splitext(intfile)[0] + '.cor' filt = np.ones((win,win))/ (1.0*win*win)