Added downsample_snapu factory to TopsProc/Factories.py
Added runner run_downsample_unwrapper.py to TopsProc added donwsample_unwraper module to contrib git commit -mLT1AB
parent
c5e086f16c
commit
6d3811ec11
|
@ -50,7 +50,9 @@ def createUnwrapper(other, do_unwrap = None, unwrapperName = None,
|
||||||
elif unwrapperName.lower() == 'snaphu':
|
elif unwrapperName.lower() == 'snaphu':
|
||||||
from .runUnwrapSnaphu import runUnwrap
|
from .runUnwrapSnaphu import runUnwrap
|
||||||
elif unwrapperName.lower() == 'snaphu_mcf':
|
elif unwrapperName.lower() == 'snaphu_mcf':
|
||||||
from .runUnwrapSnaphu import runUnwrapMcf as runUnwrap
|
from .runUnwrapSnaphu import runUnwrap
|
||||||
|
elif unwrapperName.lower() == 'downsample_snaphu':
|
||||||
|
from .run_downsample_unwrapper import runUnwrap
|
||||||
elif unwrapperName.lower() == 'icu':
|
elif unwrapperName.lower() == 'icu':
|
||||||
from .runUnwrapIcu import runUnwrap
|
from .runUnwrapIcu import runUnwrap
|
||||||
elif unwrapperName.lower() == 'grass':
|
elif unwrapperName.lower() == 'grass':
|
||||||
|
|
|
@ -40,6 +40,6 @@ project = 'TopsProc'
|
||||||
|
|
||||||
install = os.path.join(envisceobj['PRJ_SCONS_INSTALL'],package,project)
|
install = os.path.join(envisceobj['PRJ_SCONS_INSTALL'],package,project)
|
||||||
|
|
||||||
listFiles = ['__init__.py', 'Factories.py', 'TopsProc.py', 'runPreprocessor.py', 'runComputeBaseline.py', 'runVerifyDEM.py', 'runTopo.py', 'runSubsetOverlaps.py', 'runCoarseOffsets.py', 'runCoarseResamp.py', 'runOverlapIfg.py', 'runPrepESD.py', 'runESD.py', 'runRangeCoreg.py', 'runFineOffsets.py', 'runFineResamp.py', 'runBurstIfg.py', 'runMergeBursts.py', 'runFilter.py', 'runUnwrapGrass.py', 'runUnwrapIcu.py', 'runUnwrapSnaphu.py', 'runGeocode.py', 'runMergeSLCs.py', 'runDenseOffsets.py', 'runOffsetFilter.py', 'runOffsetGeocode.py', 'runCropOffsetGeo.py', 'runUnwrap2Stage.py', 'VRTManager.py', 'runVerifyGeocodeDEM.py', 'runIon.py']
|
listFiles = ['__init__.py', 'run_downsample_unwrapper.py','Factories.py', 'TopsProc.py', 'runPreprocessor.py', 'runComputeBaseline.py', 'runVerifyDEM.py', 'runTopo.py', 'runSubsetOverlaps.py', 'runCoarseOffsets.py', 'runCoarseResamp.py', 'runOverlapIfg.py', 'runPrepESD.py', 'runESD.py', 'runRangeCoreg.py', 'runFineOffsets.py', 'runFineResamp.py', 'runBurstIfg.py', 'runMergeBursts.py', 'runFilter.py', 'runUnwrapGrass.py', 'runUnwrapIcu.py', 'runUnwrapSnaphu.py', 'runGeocode.py', 'runMergeSLCs.py', 'runDenseOffsets.py', 'runOffsetFilter.py', 'runOffsetGeocode.py', 'runCropOffsetGeo.py', 'runUnwrap2Stage.py', 'VRTManager.py', 'runVerifyGeocodeDEM.py', 'runIon.py']
|
||||||
envisceobj.Install(install,listFiles)
|
envisceobj.Install(install,listFiles)
|
||||||
envisceobj.Alias('install',install)
|
envisceobj.Alias('install',install)
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
import sys
|
||||||
|
import isceobj
|
||||||
|
import os
|
||||||
|
from isceobj.TopsProc.runUnwrapSnaphu import runUnwrapMcf
|
||||||
|
from contrib.downsample_unwrapper.downsample_unwrapper import DownsampleUnwrapper
|
||||||
|
def runUnwrap(self,costMode = None,initMethod = None, defomax = None, initOnly = None):
|
||||||
|
#generate inputs from insar obj
|
||||||
|
inps = {
|
||||||
|
"flat_name":self._insar.filtFilename,
|
||||||
|
"unw_name":self._insar.unwrappedIntFilename,
|
||||||
|
"cor_name":self._insar.coherenceFilename,
|
||||||
|
"range_looks":self.numberRangeLooks,
|
||||||
|
"azimuth_looks":self.numberAzimuthLooks,
|
||||||
|
"data_dir":self._insar.mergedDirname
|
||||||
|
}
|
||||||
|
|
||||||
|
du = DownsampleUnwrapper(inps)
|
||||||
|
#modify the filenames so it uses the downsampled versions
|
||||||
|
self._insar.filtFilename = du._dflat_name
|
||||||
|
self._insar.unwrappedIntFilename = du._dunw_name
|
||||||
|
self._insar.coherenceFilename = du._dcor_name
|
||||||
|
self.numberRangeLooks = int(du._resamp*du._range_looks)
|
||||||
|
self.numberAzimuthLooks = int(du._resamp*du._azimuth_looks)
|
||||||
|
|
||||||
|
du.downsample_images(du._ddir,du._flat_name,du._cor_name,du._resamp)
|
||||||
|
runUnwrapMcf(self)
|
||||||
|
du.upsample_unw(du._ddir,du._flat_name,du._dunw_name,du._dccomp_name,upsamp=du._resamp,filt_sizes=(3,4))
|
||||||
|
#put back the original values
|
||||||
|
self._insar.filtFilename = du._flat_name
|
||||||
|
self._insar.unwrappedIntFilename = du._unw_name
|
||||||
|
self._insar.coherenceFilename = du._cor_name
|
||||||
|
self.numberRangeLooks = int(du._range_looks)
|
||||||
|
self.numberAzimuthLooks = int(du._azimuth_looks)
|
|
@ -65,6 +65,8 @@ frameUtils = os.path.join('frameUtils','SConscript')
|
||||||
SConscript(frameUtils)
|
SConscript(frameUtils)
|
||||||
unwUtils = os.path.join('UnwrapComp','SConscript')
|
unwUtils = os.path.join('UnwrapComp','SConscript')
|
||||||
SConscript(unwUtils)
|
SConscript(unwUtils)
|
||||||
|
downsample_unwrapper = os.path.join('downsample_unwrapper','SConscript')
|
||||||
|
SConscript(downsample_unwrapper)
|
||||||
|
|
||||||
if 'MOTIFLIBPATH' in envcontrib.Dictionary():
|
if 'MOTIFLIBPATH' in envcontrib.Dictionary():
|
||||||
mdx = os.path.join('mdx','SConscript')
|
mdx = os.path.join('mdx','SConscript')
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
#
|
||||||
|
# Giangi Sacco
|
||||||
|
# NASA Jet Propulsion Laboratory
|
||||||
|
# California Institute of Technology
|
||||||
|
# (c) 2019 All Rights Reserved
|
||||||
|
#
|
||||||
|
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|
||||||
|
#!/usr/bin/env python
|
||||||
|
import os
|
||||||
|
|
||||||
|
Import('envcontrib')
|
||||||
|
envDSU = envcontrib.Clone()
|
||||||
|
project = 'downsample_unwrapper'
|
||||||
|
package = envDSU['PACKAGE']
|
||||||
|
envDSU['PROJECT'] = project
|
||||||
|
Export('envDSU')
|
||||||
|
|
||||||
|
initFile = '__init__.py'
|
||||||
|
if not os.path.exists(initFile):
|
||||||
|
fout = open(initFile,"w")
|
||||||
|
fout.write("#!/usr/bin/env python")
|
||||||
|
fout.close()
|
||||||
|
|
||||||
|
install = os.path.join(envDSU['PRJ_SCONS_INSTALL'],package,project)
|
||||||
|
|
||||||
|
helpList,installHelp = envDSU['HELP_BUILDER'](envDSU,'__init__.py',install)
|
||||||
|
envDSU.Install(installHelp,helpList)
|
||||||
|
envDSU.Alias('install',installHelp)
|
||||||
|
|
||||||
|
listFiles = ['downsample_unwrapper.py','run_unwrap_snaphu.py',initFile]
|
||||||
|
envDSU.Install(install,listFiles)
|
||||||
|
envDSU.Alias('install',install)
|
|
@ -0,0 +1 @@
|
||||||
|
#!/usr/bin/env python
|
|
@ -0,0 +1,173 @@
|
||||||
|
import sys
|
||||||
|
import isceobj
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import numpy as np
|
||||||
|
from scipy.ndimage import zoom,gaussian_filter
|
||||||
|
from .run_unwrap_snaphu import runUnwrap
|
||||||
|
from iscesys.Component.Component import Component
|
||||||
|
|
||||||
|
class DownsampleUnwrapper(Component):
|
||||||
|
def __init__(self,inps):
|
||||||
|
self._dtype_map = {'cfloat':np.complex64,'float':np.float32,'byte':np.uint8}
|
||||||
|
self._ddir = inps['data_dir']
|
||||||
|
self._resamp = inps['resamp'] if 'resamp' in inps else 2
|
||||||
|
self._cor_name = inps['cor_name'] if 'cor_name' in inps else 'phsig.cor'
|
||||||
|
self._unw_name = inps['unw_name'] if 'unw_name' in inps else 'filt_topophase.flat'
|
||||||
|
self._flat_name = inps['flat_name'] if 'flat_name' in inps else 'filt_topophase.unw'
|
||||||
|
self._ccomp_name = self._unw_name + '.conncomp'
|
||||||
|
self._dcor_name = '{0:s}_{1:d}x{1:d}.cor'.format(self._cor_name.replace('.cor',''),self._resamp)
|
||||||
|
self._dunw_name = '{0:s}_{1:d}x{1:d}.unw'.format(self._unw_name.replace('.unw',''),self._resamp)
|
||||||
|
self._dflat_name = '{0:s}_{1:d}x{1:d}.flat'.format(self._flat_name.replace('.flat',''),self._resamp)
|
||||||
|
self._dccomp_name = self._dunw_name + '.conncomp'
|
||||||
|
self._earth_radius = inps['earth_radius'] if 'earth_radius' in inps else 6371000
|
||||||
|
self._altitude = inps['altitude'] if 'altitude' in inps else 800000
|
||||||
|
self._wavelength = inps['wavelength'] if 'wavelength' in inps else 0
|
||||||
|
self._azimuth_looks = inps['azimuth_looks']
|
||||||
|
self._range_looks = inps['range_looks']
|
||||||
|
self._remove_downsampled = True if 'remove_downsampled' in inps else False
|
||||||
|
|
||||||
|
def get_isce_image(self,itype,fname,width,length):
|
||||||
|
if itype == 'flat':
|
||||||
|
im = isceobj.createIntImage()
|
||||||
|
else:
|
||||||
|
im = isceobj.createImage()
|
||||||
|
im.dataType = 'FLOAT'
|
||||||
|
if itype == 'unw':
|
||||||
|
im.bands = 2
|
||||||
|
im.scheme = 'BIL'
|
||||||
|
elif itype == 'ccomp':
|
||||||
|
im.dataType = 'BYTE'
|
||||||
|
im.filename = fname
|
||||||
|
im.extraFilename = fname + '.vrt'
|
||||||
|
im.width = width
|
||||||
|
im.length = length
|
||||||
|
return im
|
||||||
|
|
||||||
|
def save_image(self,ddir,fname,img,itype):
|
||||||
|
dname = os.path.join(ddir,fname)
|
||||||
|
im = self.get_isce_image(itype,dname,img.shape[-1],img.shape[0])
|
||||||
|
img.astype(self._dtype_map[im.dataType.lower()]).tofile(dname)
|
||||||
|
im.dump(dname + '.xml')
|
||||||
|
|
||||||
|
def remove_downsampled(self,ddir,flat,unw,phsig,ccomp):
|
||||||
|
try:
|
||||||
|
#subprocess keeps changing API. just use system
|
||||||
|
cmd = 'rm -rf {}* {}* {}* {}*'.format(os.path.join(ddir,flat),os.path.join(ddir,unw),os.path.join(ddir,phsig),os.path.join(ddir,ccomp))
|
||||||
|
os.system(cmd)
|
||||||
|
except Exception as e:
|
||||||
|
print(e)
|
||||||
|
|
||||||
|
def downsample_images(self,ddir,flat,phsig,resamp):
|
||||||
|
img,im = self.load_image(ddir,flat)
|
||||||
|
_,co = self.load_image(ddir,phsig)
|
||||||
|
ims = []
|
||||||
|
cos = []
|
||||||
|
width = img.width
|
||||||
|
length = img.length
|
||||||
|
width -= width%resamp
|
||||||
|
length -= length%resamp
|
||||||
|
for i in range(resamp):
|
||||||
|
for j in range(resamp):
|
||||||
|
ims.append(im[i:length:resamp,j:width:resamp])
|
||||||
|
cos.append(co[i:length:resamp,j:width:resamp])
|
||||||
|
ims = np.array(ims).transpose([1,2,0])
|
||||||
|
cos = np.array(cos).transpose([1,2,0])
|
||||||
|
nims = ims.mean(2)
|
||||||
|
ncos = cos.mean(2)
|
||||||
|
self.save_image(ddir, self._dcor_name,ncos,'cor')
|
||||||
|
self.save_image(ddir, self._dflat_name,nims,'flat')
|
||||||
|
|
||||||
|
|
||||||
|
def load_image(self,ddir,fname):
|
||||||
|
img = isceobj.createImage()
|
||||||
|
img.load(os.path.join(ddir,fname + '.xml'))
|
||||||
|
dtype = self._dtype_map[img.dataType.lower()]
|
||||||
|
width = img.getWidth()
|
||||||
|
length = img.getLength()
|
||||||
|
im = np.fromfile(os.path.join(ddir,fname),dtype)
|
||||||
|
if img.bands == 1:
|
||||||
|
im = im.reshape([length,width])
|
||||||
|
else:#the other option is the unw which is 2 bands BIL
|
||||||
|
im = im.reshape([length,img.bands,width])
|
||||||
|
return img,im
|
||||||
|
|
||||||
|
def upsample_unw(self,ddir,flat,unw,ccomp,upsamp=2,filt_sizes=(3,4)):
|
||||||
|
_,dunw = self.load_image(ddir,unw)
|
||||||
|
_,flati = self.load_image(ddir,flat)
|
||||||
|
_,dccomp = self.load_image(ddir,ccomp)
|
||||||
|
uccomp = zoom(dccomp,upsamp)
|
||||||
|
uccomp = np.round(uccomp).astype(np.uint8)
|
||||||
|
ph_unw = dunw[:,1,:]
|
||||||
|
amp = np.abs(flati)
|
||||||
|
ph_flat = np.angle(flati)
|
||||||
|
uph_unw = zoom(ph_unw,upsamp)
|
||||||
|
uph_size = uph_unw.shape
|
||||||
|
ph_size = ph_flat.shape
|
||||||
|
if uph_size[0] != ph_size[0] or uph_size[0] != ph_size[1]:
|
||||||
|
#the lost one pixel during downsampling/upsampling
|
||||||
|
nunw = np.zeros(ph_flat.shape)
|
||||||
|
nunw[:uph_size[0],:uph_size[1]] = uph_unw
|
||||||
|
if ph_size[1] > uph_size[1]:
|
||||||
|
nunw[-1,:-1] = uph_unw[-1,:]
|
||||||
|
if ph_size[0] > uph_size[0]:
|
||||||
|
nunw[:-1,-1] = uph_unw[:,-1]
|
||||||
|
uph_unw = nunw
|
||||||
|
funw = self.filter_image(uph_unw,ph_flat,filt_sizes)
|
||||||
|
ifunw = np.round((funw - ph_flat)/(2*np.pi)).astype(np.int16)
|
||||||
|
funw = ph_flat + 2*np.pi*ifunw
|
||||||
|
unw_out = np.stack([amp,funw],0).transpose([1,0,2])
|
||||||
|
self.save_image(ddir,self._unw_name,unw_out,'unw')
|
||||||
|
self.save_image(ddir,self._ccomp_name,uccomp,'ccomp')
|
||||||
|
if self._remove_downsampled:
|
||||||
|
self.remove_downsampled(ddir, self._dflat_name,self._dunw_name,self._dccomp_name,self._dccomp_name)
|
||||||
|
|
||||||
|
def filter_image(self,unw,wrp,filt_sizes):
|
||||||
|
im0 = np.round((unw - wrp)/(2*np.pi))
|
||||||
|
img = wrp + 2*np.pi*im0
|
||||||
|
for filter in filt_sizes:
|
||||||
|
if not isinstance(filter,tuple):
|
||||||
|
filter = (filter,filter)
|
||||||
|
img = gaussian_filter(img,filter,0)
|
||||||
|
return wrp + 2*np.pi*np.round((img - wrp)/(2*np.pi))
|
||||||
|
|
||||||
|
def run_snaphu(self):
|
||||||
|
range_looks = int(self._range_looks*self._resamp)
|
||||||
|
azimuth_looks = int(self._azimuth_looks*self._resamp)
|
||||||
|
inps_json = {'flat_name':self._dflat_name,'unw_name':self._dunw_name,
|
||||||
|
'cor_name':self._dcor_name,'wavelength':self._wavelength,
|
||||||
|
'range_looks':range_looks,'azimuth_looks':azimuth_looks,
|
||||||
|
'earth_radius':self._earth_radius,'altitude':self._altitude}
|
||||||
|
runUnwrap(inps_json)
|
||||||
|
|
||||||
|
def main(inps):
|
||||||
|
"""
|
||||||
|
Run the unwrapper with downsampling
|
||||||
|
inputs:
|
||||||
|
inps = dictionary with the following key,value
|
||||||
|
{
|
||||||
|
"flat_name":"filt_topophase.flat",
|
||||||
|
"unw_name":"filt_topophase.unw",
|
||||||
|
"cor_name":"phsig.cor",
|
||||||
|
"range_looks":7,
|
||||||
|
"azimuth_looks":3,
|
||||||
|
"wavelength":0.05546576,
|
||||||
|
"resamp":2,
|
||||||
|
"data_dir":'./'
|
||||||
|
}
|
||||||
|
The range and azimuth looks are w.r.t the original image.
|
||||||
|
"""
|
||||||
|
du = DownsampleUnwrapper(inps)
|
||||||
|
#du.downsample_images(du._ddir,du._flat_name,du._cor_name,du._resamp)
|
||||||
|
#du.run_snaphu()
|
||||||
|
du.upsample_unw(du._ddir,du._flat_name,du._dunw_name,du._dccomp_name,upsamp=du._resamp,filt_sizes=(3,4))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
inp_json = sys.argv[1]
|
||||||
|
ddir = sys.argv[2]
|
||||||
|
inps = json.load(open(inp_json))
|
||||||
|
inps['data_dir'] = ddir
|
||||||
|
main(inps)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,91 @@
|
||||||
|
#
|
||||||
|
# Author: Piyush Agram
|
||||||
|
# Copyright 2016
|
||||||
|
#
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import isceobj
|
||||||
|
from contrib.Snaphu.Snaphu import Snaphu
|
||||||
|
from isceobj.Constants import SPEED_OF_LIGHT
|
||||||
|
from isceobj.Planet.Planet import Planet
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
def runUnwrap(inps_json):
|
||||||
|
costMode = 'SMOOTH'
|
||||||
|
initMethod = 'MCF'
|
||||||
|
defomax = 2.0
|
||||||
|
initOnly = True
|
||||||
|
if isinstance(inps_json,str):
|
||||||
|
inps = json.load(open(inps_json))
|
||||||
|
elif isinstance(inps_json,dict):
|
||||||
|
inps = inps_json
|
||||||
|
else:
|
||||||
|
print('Expecting a json filename or a dictionary')
|
||||||
|
raise ValueError
|
||||||
|
wrapName = inps['flat_name']
|
||||||
|
unwrapName = inps['unw_name']
|
||||||
|
img = isceobj.createImage()
|
||||||
|
img.load(wrapName + '.xml')
|
||||||
|
width = img.getWidth()
|
||||||
|
earthRadius = inps['earth_radius']
|
||||||
|
altitude = inps['altitude']
|
||||||
|
corrfile = inps['cor_name']
|
||||||
|
rangeLooks = inps['range_looks']
|
||||||
|
azimuthLooks = inps['azimuth_looks']
|
||||||
|
wavelength = inps['wavelength']
|
||||||
|
azfact = 0.8
|
||||||
|
rngfact = 0.8
|
||||||
|
corrLooks = rangeLooks * azimuthLooks/(azfact*rngfact)
|
||||||
|
maxComponents = 20
|
||||||
|
|
||||||
|
snp = Snaphu()
|
||||||
|
snp.setInitOnly(initOnly)
|
||||||
|
snp.setInput(wrapName)
|
||||||
|
snp.setOutput(unwrapName)
|
||||||
|
snp.setWidth(width)
|
||||||
|
snp.setCostMode(costMode)
|
||||||
|
snp.setEarthRadius(earthRadius)
|
||||||
|
snp.setWavelength(wavelength)
|
||||||
|
snp.setAltitude(altitude)
|
||||||
|
snp.setCorrfile(corrfile)
|
||||||
|
snp.setInitMethod(initMethod)
|
||||||
|
snp.setCorrLooks(corrLooks)
|
||||||
|
snp.setMaxComponents(maxComponents)
|
||||||
|
snp.setDefoMaxCycles(defomax)
|
||||||
|
snp.setRangeLooks(rangeLooks)
|
||||||
|
snp.setAzimuthLooks(azimuthLooks)
|
||||||
|
snp.setCorFileFormat('FLOAT_DATA')
|
||||||
|
snp.prepare()
|
||||||
|
snp.unwrap()
|
||||||
|
|
||||||
|
######Render XML
|
||||||
|
outImage = isceobj.Image.createUnwImage()
|
||||||
|
outImage.setFilename(unwrapName)
|
||||||
|
outImage.setWidth(width)
|
||||||
|
outImage.setAccessMode('read')
|
||||||
|
outImage.renderVRT()
|
||||||
|
outImage.createImage()
|
||||||
|
outImage.finalizeImage()
|
||||||
|
outImage.renderHdr()
|
||||||
|
|
||||||
|
#####Check if connected components was created
|
||||||
|
if snp.dumpConnectedComponents:
|
||||||
|
connImage = isceobj.Image.createImage()
|
||||||
|
connImage.setFilename(unwrapName+'.conncomp')
|
||||||
|
#At least one can query for the name used
|
||||||
|
connImage.setWidth(width)
|
||||||
|
connImage.setAccessMode('read')
|
||||||
|
connImage.setDataType('BYTE')
|
||||||
|
connImage.renderVRT()
|
||||||
|
connImage.createImage()
|
||||||
|
connImage.finalizeImage()
|
||||||
|
connImage.renderHdr()
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def main(inps):
|
||||||
|
runUnwrap(inps)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
sys.exit(main(sys.argv[1]))
|
Loading…
Reference in New Issue