Ejemplo n.º 1
0
def runLook(self):
    '''take looks
    '''
    catalog = isceobj.Catalog.createCatalog(self._insar.procDoc.name)
    self.updateParamemetersFromUser()

    #masterTrack = self._insar.loadTrack(master=True)
    #slaveTrack = self._insar.loadTrack(master=False)
    wbdFile = os.path.abspath(self._insar.wbd)

    insarDir = 'insar'
    if not os.path.exists(insarDir):
        os.makedirs(insarDir)
    os.chdir(insarDir)


    amp = isceobj.createImage()
    amp.load(self._insar.amplitude+'.xml')
    width = amp.width
    length = amp.length
    width2 = int(width / self._insar.numberRangeLooks2)
    length2 = int(length / self._insar.numberAzimuthLooks2)

    if not ((self._insar.numberRangeLooks2 == 1) and (self._insar.numberAzimuthLooks2 == 1)):
        #take looks
        look(self._insar.differentialInterferogram, self._insar.multilookDifferentialInterferogram, width, self._insar.numberRangeLooks2, self._insar.numberAzimuthLooks2, 4, 0, 1)
        look(self._insar.amplitude, self._insar.multilookAmplitude, width, self._insar.numberRangeLooks2, self._insar.numberAzimuthLooks2, 4, 1, 1)
        look(self._insar.latitude, self._insar.multilookLatitude, width, self._insar.numberRangeLooks2, self._insar.numberAzimuthLooks2, 3, 0, 1)
        look(self._insar.longitude, self._insar.multilookLongitude, width, self._insar.numberRangeLooks2, self._insar.numberAzimuthLooks2, 3, 0, 1)
        look(self._insar.height, self._insar.multilookHeight, width, self._insar.numberRangeLooks2, self._insar.numberAzimuthLooks2, 3, 0, 1)
        #creat xml
        create_xml(self._insar.multilookDifferentialInterferogram, width2, length2, 'int')
        create_xml(self._insar.multilookAmplitude, width2, length2, 'amp')
        create_xml(self._insar.multilookLatitude, width2, length2, 'double')
        create_xml(self._insar.multilookLongitude, width2, length2, 'double')
        create_xml(self._insar.multilookHeight, width2, length2, 'double')
        #los has two bands, use look program in isce instead
        cmd = "looks.py -i {} -o {} -r {} -a {}".format(self._insar.los, self._insar.multilookLos, self._insar.numberRangeLooks2, self._insar.numberAzimuthLooks2)
        runCmd(cmd)

        #water body
        #this looking operation has no problems where there is only water and land, but there is also possible no-data area
        #look(self._insar.wbdOut, self._insar.multilookWbdOut, width, self._insar.numberRangeLooks2, self._insar.numberAzimuthLooks2, 0, 0, 1)
        #create_xml(self._insar.multilookWbdOut, width2, length2, 'byte')
        #use waterBodyRadar instead to avoid the problems of no-data pixels in water body
        waterBodyRadar(self._insar.multilookLatitude, self._insar.multilookLongitude, wbdFile, self._insar.multilookWbdOut)


    os.chdir('../')

    catalog.printToLog(logger, "runLook")
    self._insar.procDoc.addAllFromCatalog(catalog)
Ejemplo n.º 2
0
def runLookSd(self):
    '''take looks
    '''
    catalog = isceobj.Catalog.createCatalog(self._insar.procDoc.name)
    self.updateParamemetersFromUser()

    #masterTrack = self._insar.loadTrack(master=True)
    #slaveTrack = self._insar.loadTrack(master=False)
    wbdFile = os.path.abspath(self._insar.wbd)

    sdDir = 'sd'
    if not os.path.exists(sdDir):
        os.makedirs(sdDir)
    os.chdir(sdDir)

    sd = isceobj.createImage()
    sd.load(self._insar.interferogramSd[0] + '.xml')
    width = sd.width
    length = sd.length
    width2 = int(width / self._insar.numberRangeLooksSd)
    length2 = int(length / self._insar.numberAzimuthLooksSd)

    if not ((self._insar.numberRangeLooksSd == 1) and
            (self._insar.numberAzimuthLooksSd == 1)):
        #take looks
        for sd, sdMultilook in zip(self._insar.interferogramSd,
                                   self._insar.multilookInterferogramSd):
            look(sd, sdMultilook, width, self._insar.numberRangeLooksSd,
                 self._insar.numberAzimuthLooksSd, 4, 0, 1)
            create_xml(sdMultilook, width2, length2, 'int')
        look(os.path.join('../insar', self._insar.latitude),
             self._insar.multilookLatitudeSd, width,
             self._insar.numberRangeLooksSd, self._insar.numberAzimuthLooksSd,
             3, 0, 1)
        look(os.path.join('../insar', self._insar.longitude),
             self._insar.multilookLongitudeSd, width,
             self._insar.numberRangeLooksSd, self._insar.numberAzimuthLooksSd,
             3, 0, 1)
        create_xml(self._insar.multilookLatitudeSd, width2, length2, 'double')
        create_xml(self._insar.multilookLongitudeSd, width2, length2, 'double')
        #water body
        waterBodyRadar(self._insar.multilookLatitudeSd,
                       self._insar.multilookLongitudeSd, wbdFile,
                       self._insar.multilookWbdOutSd)

    os.chdir('../')

    catalog.printToLog(logger, "runLookSd")
    self._insar.procDoc.addAllFromCatalog(catalog)
Ejemplo n.º 3
0
def runIonUwrap(self):
    '''unwrap subband interferograms
    '''
    catalog = isceobj.Catalog.createCatalog(self._insar.procDoc.name)
    self.updateParamemetersFromUser()

    if not self.doIon:
        catalog.printToLog(logger, "runIonUwrap")
        self._insar.procDoc.addAllFromCatalog(catalog)
        return

    referenceTrack = self._insar.loadTrack(reference=True)
    secondaryTrack = self._insar.loadTrack(reference=False)
    wbdFile = os.path.abspath(self._insar.wbd)

    from isceobj.Alos2Proc.runIonSubband import defineIonDir
    ionDir = defineIonDir()
    subbandPrefix = ['lower', 'upper']

    ionCalDir = os.path.join(ionDir['ion'], ionDir['ionCal'])
    os.makedirs(ionCalDir, exist_ok=True)
    os.chdir(ionCalDir)


    ############################################################
    # STEP 1. take looks
    ############################################################
    from isceobj.Alos2Proc.Alos2ProcPublic import create_xml
    from contrib.alos2proc.alos2proc import look
    from isceobj.Alos2Proc.Alos2ProcPublic import waterBodyRadar

    ml2 = '_{}rlks_{}alks'.format(self._insar.numberRangeLooks1*self._insar.numberRangeLooksIon, 
                              self._insar.numberAzimuthLooks1*self._insar.numberAzimuthLooksIon)

    for k in range(2):
        fullbandDir = os.path.join('../../', ionDir['insar'])
        subbandDir = os.path.join('../', ionDir['subband'][k], ionDir['insar'])
        prefix = subbandPrefix[k]

        amp = isceobj.createImage()
        amp.load(os.path.join(subbandDir, self._insar.amplitude)+'.xml')
        width = amp.width
        length = amp.length
        width2 = int(width / self._insar.numberRangeLooksIon)
        length2 = int(length / self._insar.numberAzimuthLooksIon)

        #take looks
        look(os.path.join(subbandDir, self._insar.differentialInterferogram), prefix+ml2+'.int', width, self._insar.numberRangeLooksIon, self._insar.numberAzimuthLooksIon, 4, 0, 1)
        create_xml(prefix+ml2+'.int', width2, length2, 'int')
        look(os.path.join(subbandDir, self._insar.amplitude), prefix+ml2+'.amp', width, self._insar.numberRangeLooksIon, self._insar.numberAzimuthLooksIon, 4, 1, 1)
        create_xml(prefix+ml2+'.amp', width2, length2, 'amp')

        # #water body
        # if k == 0:
        #     wbdOutFile = os.path.join(fullbandDir, self._insar.wbdOut)
        #     if os.path.isfile(wbdOutFile):
        #         look(wbdOutFile, 'wbd'+ml2+'.wbd', width, self._insar.numberRangeLooksIon, self._insar.numberAzimuthLooksIon, 0, 0, 1)
        #         create_xml('wbd'+ml2+'.wbd', width2, length2, 'byte')

        #water body
        if k == 0:
            look(os.path.join(fullbandDir, self._insar.latitude), 'lat'+ml2+'.lat', width, self._insar.numberRangeLooksIon, self._insar.numberAzimuthLooksIon, 3, 0, 1)
            look(os.path.join(fullbandDir, self._insar.longitude), 'lon'+ml2+'.lon', width, self._insar.numberRangeLooksIon, self._insar.numberAzimuthLooksIon, 3, 0, 1)
            create_xml('lat'+ml2+'.lat', width2, length2, 'double')
            create_xml('lon'+ml2+'.lon', width2, length2, 'double')
            waterBodyRadar('lat'+ml2+'.lat', 'lon'+ml2+'.lon', wbdFile, 'wbd'+ml2+'.wbd')


    ############################################################
    # STEP 2. compute coherence
    ############################################################
    from isceobj.Alos2Proc.Alos2ProcPublic import cal_coherence

    lowerbandInterferogramFile = subbandPrefix[0]+ml2+'.int'
    upperbandInterferogramFile = subbandPrefix[1]+ml2+'.int'
    lowerbandAmplitudeFile = subbandPrefix[0]+ml2+'.amp'
    upperbandAmplitudeFile = subbandPrefix[1]+ml2+'.amp'
    lowerbandCoherenceFile = subbandPrefix[0]+ml2+'.cor'
    upperbandCoherenceFile = subbandPrefix[1]+ml2+'.cor'
    coherenceFile = 'diff'+ml2+'.cor'

    lowerint = np.fromfile(lowerbandInterferogramFile, dtype=np.complex64).reshape(length2, width2)
    upperint = np.fromfile(upperbandInterferogramFile, dtype=np.complex64).reshape(length2, width2)
    loweramp = np.fromfile(lowerbandAmplitudeFile, dtype=np.float32).reshape(length2, width2*2)
    upperamp = np.fromfile(upperbandAmplitudeFile, dtype=np.float32).reshape(length2, width2*2)

    #compute coherence only using interferogram
    #here I use differential interferogram of lower and upper band interferograms
    #so that coherence is not affected by fringes
    cord = cal_coherence(lowerint*np.conjugate(upperint), win=3, edge=4)
    cor = np.zeros((length2*2, width2), dtype=np.float32)
    cor[0:length2*2:2, :] = np.sqrt( (np.absolute(lowerint)+np.absolute(upperint))/2.0 )
    cor[1:length2*2:2, :] = cord
    cor.astype(np.float32).tofile(coherenceFile)
    create_xml(coherenceFile, width2, length2, 'cor')

    #create lower and upper band coherence files
    #lower
    amp1 = loweramp[:, 0:width2*2:2]
    amp2 = loweramp[:, 1:width2*2:2]
    cor[1:length2*2:2, :] = np.absolute(lowerint)/(amp1+(amp1==0))/(amp2+(amp2==0))*(amp1!=0)*(amp2!=0)
    cor.astype(np.float32).tofile(lowerbandCoherenceFile)
    create_xml(lowerbandCoherenceFile, width2, length2, 'cor')

    #upper
    amp1 = upperamp[:, 0:width2*2:2]
    amp2 = upperamp[:, 1:width2*2:2]
    cor[1:length2*2:2, :] = np.absolute(upperint)/(amp1+(amp1==0))/(amp2+(amp2==0))*(amp1!=0)*(amp2!=0)
    cor.astype(np.float32).tofile(upperbandCoherenceFile)
    create_xml(upperbandCoherenceFile, width2, length2, 'cor')


    ############################################################
    # STEP 3. filtering subband interferograms
    ############################################################
    from contrib.alos2filter.alos2filter import psfilt1
    from isceobj.Alos2Proc.Alos2ProcPublic import runCmd
    from isceobj.Alos2Proc.Alos2ProcPublic import create_xml
    from mroipac.icu.Icu import Icu

    if self.filterSubbandInt:
        for k in range(2):
            toBeFiltered = 'tmp.int'
            if self.removeMagnitudeBeforeFilteringSubbandInt:
                cmd = "imageMath.py -e='a/(abs(a)+(a==0))' --a={} -o {} -t cfloat -s BSQ".format(subbandPrefix[k]+ml2+'.int', toBeFiltered)
            else:
                #scale the inteferogram, otherwise its magnitude is too large for filtering
                cmd = "imageMath.py -e='a/100000.0' --a={} -o {} -t cfloat -s BSQ".format(subbandPrefix[k]+ml2+'.int', toBeFiltered)
            runCmd(cmd)

            intImage = isceobj.createIntImage()
            intImage.load(toBeFiltered + '.xml')
            width = intImage.width
            length = intImage.length

            windowSize = self.filterWinsizeSubbandInt
            stepSize = self.filterStepsizeSubbandInt
            psfilt1(toBeFiltered, 'filt_'+subbandPrefix[k]+ml2+'.int', width, self.filterStrengthSubbandInt, windowSize, stepSize)
            create_xml('filt_'+subbandPrefix[k]+ml2+'.int', width, length, 'int')

            os.remove(toBeFiltered)
            os.remove(toBeFiltered + '.vrt')
            os.remove(toBeFiltered + '.xml')

            #create phase sigma for phase unwrapping
            #recreate filtered image
            filtImage = isceobj.createIntImage()
            filtImage.load('filt_'+subbandPrefix[k]+ml2+'.int' + '.xml')
            filtImage.setAccessMode('read')
            filtImage.createImage()

            #amplitude image
            ampImage = isceobj.createAmpImage()
            ampImage.load(subbandPrefix[k]+ml2+'.amp' + '.xml')
            ampImage.setAccessMode('read')
            ampImage.createImage()

            #phase sigma correlation image
            phsigImage = isceobj.createImage()
            phsigImage.setFilename(subbandPrefix[k]+ml2+'.phsig')
            phsigImage.setWidth(width)
            phsigImage.dataType='FLOAT'
            phsigImage.bands = 1
            phsigImage.setImageType('cor')
            phsigImage.setAccessMode('write')
            phsigImage.createImage()

            icu = Icu(name='insarapp_filter_icu')
            icu.configure()
            icu.unwrappingFlag = False
            icu.icu(intImage = filtImage, ampImage=ampImage, phsigImage=phsigImage)

            phsigImage.renderHdr()

            filtImage.finalizeImage()
            ampImage.finalizeImage()
            phsigImage.finalizeImage()


    ############################################################
    # STEP 4. phase unwrapping
    ############################################################
    from isceobj.Alos2Proc.Alos2ProcPublic import snaphuUnwrap

    for k in range(2):
        tmid = referenceTrack.sensingStart + datetime.timedelta(seconds=(self._insar.numberAzimuthLooks1-1.0)/2.0*referenceTrack.azimuthLineInterval+
               referenceTrack.numberOfLines/2.0*self._insar.numberAzimuthLooks1*referenceTrack.azimuthLineInterval)

        if self.filterSubbandInt:
            toBeUnwrapped = 'filt_'+subbandPrefix[k]+ml2+'.int'
            coherenceFile = subbandPrefix[k]+ml2+'.phsig'
        else:
            toBeUnwrapped = subbandPrefix[k]+ml2+'.int'
            coherenceFile = 'diff'+ml2+'.cor'

        snaphuUnwrap(referenceTrack, tmid, 
            toBeUnwrapped, 
            coherenceFile, 
            subbandPrefix[k]+ml2+'.unw', 
            self._insar.numberRangeLooks1*self._insar.numberRangeLooksIon, 
            self._insar.numberAzimuthLooks1*self._insar.numberAzimuthLooksIon, 
            costMode = 'SMOOTH',initMethod = 'MCF', defomax = 2, initOnly = True)


    os.chdir('../../')
    catalog.printToLog(logger, "runIonUwrap")
    self._insar.procDoc.addAllFromCatalog(catalog)
Ejemplo n.º 4
0
    wbdFile = os.path.abspath(wbdFile)

    insarDir = 'insar'
    os.makedirs(insarDir, exist_ok=True)
    os.chdir(insarDir)

    img = isceobj.createImage()
    img.load(latitude + '.xml')
    width = img.width
    length = img.length
    width2 = int(width / numberRangeLooks2)
    length2 = int(length / numberAzimuthLooks2)

    if not ((numberRangeLooks2 == 1) and (numberAzimuthLooks2 == 1)):
        #take looks
        look(latitude, multilookLatitude, width, numberRangeLooks2,
             numberAzimuthLooks2, 3, 0, 1)
        look(longitude, multilookLongitude, width, numberRangeLooks2,
             numberAzimuthLooks2, 3, 0, 1)
        look(height, multilookHeight, width, numberRangeLooks2,
             numberAzimuthLooks2, 3, 0, 1)
        #creat xml
        create_xml(multilookLatitude, width2, length2, 'double')
        create_xml(multilookLongitude, width2, length2, 'double')
        create_xml(multilookHeight, width2, length2, 'double')
        #los has two bands, use look program in isce instead
        #cmd = "looks.py -i {} -o {} -r {} -a {}".format(self._insar.los, self._insar.multilookLos, self._insar.numberRangeLooks2, self._insar.numberAzimuthLooks2)
        #runCmd(cmd)

        #replace the above system call with function call
        from mroipac.looks.Looks import Looks
        from isceobj.Image import createImage
Ejemplo n.º 5
0
def runRdrDemOffset(self):
    '''estimate between radar image and dem
    '''
    catalog = isceobj.Catalog.createCatalog(self._insar.procDoc.name)
    self.updateParamemetersFromUser()

    referenceTrack = self._insar.loadTrack(reference=True)
    demFile = os.path.abspath(self._insar.dem)

    insarDir = 'insar'
    os.makedirs(insarDir, exist_ok=True)
    os.chdir(insarDir)

    rdrDemDir = 'rdr_dem_offset'
    os.makedirs(rdrDemDir, exist_ok=True)
    os.chdir(rdrDemDir)

    ##################################################################################################
    #compute dem pixel size
    demImage = isceobj.createDemImage()
    demImage.load(demFile + '.xml')
    #DEM pixel size in meters (appoximate value)
    demDeltaLon = abs(demImage.getDeltaLongitude()) / 0.0002777777777777778 * 30.0
    demDeltaLat = abs(demImage.getDeltaLatitude())  / 0.0002777777777777778 * 30.0

    #number of looks to take in range
    if self._insar.numberRangeLooksSim == None:
        if self._insar.numberRangeLooks1 * referenceTrack.rangePixelSize > demDeltaLon:
            self._insar.numberRangeLooksSim = 1
        else:
            self._insar.numberRangeLooksSim = int(demDeltaLon / (self._insar.numberRangeLooks1 * referenceTrack.rangePixelSize) + 0.5)
    #number of looks to take in azimuth
    if self._insar.numberAzimuthLooksSim == None:
        if self._insar.numberAzimuthLooks1 * referenceTrack.azimuthPixelSize > demDeltaLat:
            self._insar.numberAzimuthLooksSim = 1
        else:
            self._insar.numberAzimuthLooksSim = int(demDeltaLat / (self._insar.numberAzimuthLooks1 * referenceTrack.azimuthPixelSize) + 0.5)

    #simulate a radar image using dem
    simulateRadar(os.path.join('../', self._insar.height), self._insar.sim, scale=3.0, offset=100.0)
    sim = isceobj.createImage()
    sim.load(self._insar.sim+'.xml')

    #take looks
    if (self._insar.numberRangeLooksSim == 1) and (self._insar.numberAzimuthLooksSim == 1):
        simLookFile = self._insar.sim
        ampLookFile = 'amp_{}rlks_{}alks.float'.format(self._insar.numberRangeLooksSim*self._insar.numberRangeLooks1, 
                                                       self._insar.numberAzimuthLooksSim*self._insar.numberAzimuthLooks1)
        cmd = "imageMath.py -e='sqrt(a_0*a_0+a_1*a_1)' --a={} -o {} -t float".format(os.path.join('../', self._insar.amplitude), ampLookFile)
        runCmd(cmd)
    else:
        simLookFile = 'sim_{}rlks_{}alks.float'.format(self._insar.numberRangeLooksSim*self._insar.numberRangeLooks1, 
                                                       self._insar.numberAzimuthLooksSim*self._insar.numberAzimuthLooks1)
        ampLookFile = 'amp_{}rlks_{}alks.float'.format(self._insar.numberRangeLooksSim*self._insar.numberRangeLooks1, 
                                                       self._insar.numberAzimuthLooksSim*self._insar.numberAzimuthLooks1)
        ampTmpFile = 'amp_tmp.float'
        look(self._insar.sim, simLookFile, sim.width, self._insar.numberRangeLooksSim, self._insar.numberAzimuthLooksSim, 2, 0, 1)
        look(os.path.join('../', self._insar.amplitude), ampTmpFile, sim.width, self._insar.numberRangeLooksSim, self._insar.numberAzimuthLooksSim, 4, 1, 1)
 
        width = int(sim.width/self._insar.numberRangeLooksSim)
        length = int(sim.length/self._insar.numberAzimuthLooksSim)
        create_xml(simLookFile, width, length, 'float')
        create_xml(ampTmpFile, width, length, 'amp')

        cmd = "imageMath.py -e='sqrt(a_0*a_0+a_1*a_1)' --a={} -o {} -t float".format(ampTmpFile, ampLookFile)
        runCmd(cmd)
        os.remove(ampTmpFile)
        os.remove(ampTmpFile+'.vrt')
        os.remove(ampTmpFile+'.xml')

    #initial number of offsets to use
    numberOfOffsets = 800
    #compute land ratio to further determine the number of offsets to use
    wbd=np.memmap(os.path.join('../', self._insar.wbdOut), dtype='byte', mode='r', shape=(sim.length, sim.width))
    landRatio = np.sum(wbd[0:sim.length:10, 0:sim.width:10]!=-1) / int(sim.length/10) / int(sim.width/10)
    del wbd
    if (landRatio <= 0.00125):
        print('\n\nWARNING: land area too small for estimating offsets between radar and dem')
        print('do not estimate offsets between radar and dem\n\n')
        self._insar.radarDemAffineTransform = [1.0, 0.0, 0.0, 1.0, 0.0, 0.0]
        catalog.addItem('warning message', 'land area too small for estimating offsets between radar and dem', 'runRdrDemOffset')

        os.chdir('../../')

        catalog.printToLog(logger, "runRdrDemOffset")
        self._insar.procDoc.addAllFromCatalog(catalog)

        return

    #total number of offsets to use
    numberOfOffsets /= landRatio
    #allocate number of offsets in range/azimuth according to image width/length
    width = int(sim.width/self._insar.numberRangeLooksSim)
    length = int(sim.length/self._insar.numberAzimuthLooksSim)
    #number of offsets to use in range/azimuth
    numberOfOffsetsRange = int(np.sqrt(numberOfOffsets * width / length))
    numberOfOffsetsAzimuth = int(length / width * np.sqrt(numberOfOffsets * width / length))

    #this should be better?
    numberOfOffsetsRange = int(np.sqrt(numberOfOffsets))
    numberOfOffsetsAzimuth = int(np.sqrt(numberOfOffsets))


    if numberOfOffsetsRange > int(width/2):
        numberOfOffsetsRange = int(width/2)
    if numberOfOffsetsAzimuth > int(length/2):
        numberOfOffsetsAzimuth = int(length/2)

    if numberOfOffsetsRange < 10:
        numberOfOffsetsRange = 10
    if numberOfOffsetsAzimuth < 10:
        numberOfOffsetsAzimuth = 10

    catalog.addItem('number of range offsets', '{}'.format(numberOfOffsetsRange), 'runRdrDemOffset')
    catalog.addItem('number of azimuth offsets', '{}'.format(numberOfOffsetsAzimuth), 'runRdrDemOffset')

    #matching
    ampcor = Ampcor(name='insarapp_slcs_ampcor')
    ampcor.configure()

    mMag = isceobj.createImage()
    mMag.load(ampLookFile+'.xml')
    mMag.setAccessMode('read')
    mMag.createImage()

    sMag = isceobj.createImage()
    sMag.load(simLookFile+'.xml')
    sMag.setAccessMode('read')
    sMag.createImage()

    ampcor.setImageDataType1('real')
    ampcor.setImageDataType2('real')

    ampcor.setReferenceSlcImage(mMag)
    ampcor.setSecondarySlcImage(sMag)

    #MATCH REGION
    rgoff = 0
    azoff = 0
    #it seems that we cannot use 0, haven't look into the problem
    if rgoff == 0:
        rgoff = 1
    if azoff == 0:
        azoff = 1
    firstSample = 1
    if rgoff < 0:
        firstSample = int(35 - rgoff)
    firstLine = 1
    if azoff < 0:
        firstLine = int(35 - azoff)
    ampcor.setAcrossGrossOffset(rgoff)
    ampcor.setDownGrossOffset(azoff)
    ampcor.setFirstSampleAcross(firstSample)
    ampcor.setLastSampleAcross(width)
    ampcor.setNumberLocationAcross(numberOfOffsetsRange)
    ampcor.setFirstSampleDown(firstLine)
    ampcor.setLastSampleDown(length)
    ampcor.setNumberLocationDown(numberOfOffsetsAzimuth)

    #MATCH PARAMETERS
    ampcor.setWindowSizeWidth(64)
    ampcor.setWindowSizeHeight(64)
    #note this is the half width/length of search area, so number of resulting correlation samples: 8*2+1
    ampcor.setSearchWindowSizeWidth(16)
    ampcor.setSearchWindowSizeHeight(16)

    #REST OF THE STUFF
    ampcor.setAcrossLooks(1)
    ampcor.setDownLooks(1)
    ampcor.setOversamplingFactor(64)
    ampcor.setZoomWindowSize(16)
    #1. The following not set
    #Matching Scale for Sample/Line Directions                       (-)    = 1. 1.
    #should add the following in Ampcor.py?
    #if not set, in this case, Ampcor.py'value is also 1. 1.
    #ampcor.setScaleFactorX(1.)
    #ampcor.setScaleFactorY(1.)

    #MATCH THRESHOLDS AND DEBUG DATA
    #2. The following not set
    #in roi_pac the value is set to 0 1
    #in isce the value is set to 0.001 1000.0
    #SNR and Covariance Thresholds                                   (-)    =  {s1} {s2}
    #should add the following in Ampcor?
    #THIS SHOULD BE THE ONLY THING THAT IS DIFFERENT FROM THAT OF ROI_PAC
    #ampcor.setThresholdSNR(0)
    #ampcor.setThresholdCov(1)
    ampcor.setDebugFlag(False)
    ampcor.setDisplayFlag(False)

    #in summary, only two things not set which are indicated by 'The following not set' above.

    #run ampcor
    ampcor.ampcor()
    offsets = ampcor.getOffsetField()
    ampcorOffsetFile = 'ampcor.off'
    cullOffsetFile = 'cull.off'
    affineTransformFile = 'affine_transform.txt'
    writeOffset(offsets, ampcorOffsetFile)

    #finalize image, and re-create it
    #otherwise the file pointer is still at the end of the image
    mMag.finalizeImage()
    sMag.finalizeImage()

    # #cull offsets
    # import io
    # from contextlib import redirect_stdout
    # f = io.StringIO()
    # with redirect_stdout(f):
    #     fitoff(ampcorOffsetFile, cullOffsetFile, 1.5, .5, 50)
    # s = f.getvalue()
    # #print(s)
    # with open(affineTransformFile, 'w') as f:
    #     f.write(s)

    #cull offsets
    import subprocess
    proc = subprocess.Popen(["python3", "-c", "import isce; from contrib.alos2proc_f.alos2proc_f import fitoff; fitoff('ampcor.off', 'cull.off', 1.5, .5, 50)"], stdout=subprocess.PIPE)
    out = proc.communicate()[0]
    with open(affineTransformFile, 'w') as f:
        f.write(out.decode('utf-8'))

    #check number of offsets left
    with open(cullOffsetFile, 'r') as f:
        numCullOffsets = sum(1 for linex in f)
    if numCullOffsets < 50:
        print('\n\nWARNING: too few points left after culling, {} left'.format(numCullOffsets))
        print('do not estimate offsets between radar and dem\n\n')
        self._insar.radarDemAffineTransform = [1.0, 0.0, 0.0, 1.0, 0.0, 0.0]
        catalog.addItem('warning message', 'too few points left after culling, {} left'.format(numCullOffsets), 'runRdrDemOffset')

        os.chdir('../../')

        catalog.printToLog(logger, "runRdrDemOffset")
        self._insar.procDoc.addAllFromCatalog(catalog)

        return

    #read affine transform parameters
    with open(affineTransformFile) as f:
        lines = f.readlines()
    i = 0
    for linex in lines:
        if 'Affine Matrix ' in linex:
            m11 = float(lines[i + 2].split()[0])
            m12 = float(lines[i + 2].split()[1])
            m21 = float(lines[i + 3].split()[0])
            m22 = float(lines[i + 3].split()[1])
            t1  = float(lines[i + 7].split()[0])
            t2  = float(lines[i + 7].split()[1])
            break
        i += 1    

    self._insar.radarDemAffineTransform = [m11, m12, m21, m22, t1, t2]
    ##################################################################################################

    os.chdir('../../')


    catalog.printToLog(logger, "runRdrDemOffset")
    self._insar.procDoc.addAllFromCatalog(catalog)
Ejemplo n.º 6
0
def runLook(self):
    '''take looks
    '''
    catalog = isceobj.Catalog.createCatalog(self._insar.procDoc.name)
    self.updateParamemetersFromUser()

    #referenceTrack = self._insar.loadTrack(reference=True)
    #secondaryTrack = self._insar.loadTrack(reference=False)
    wbdFile = os.path.abspath(self._insar.wbd)

    insarDir = 'insar'
    os.makedirs(insarDir, exist_ok=True)
    os.chdir(insarDir)

    amp = isceobj.createImage()
    amp.load(self._insar.amplitude + '.xml')
    width = amp.width
    length = amp.length
    width2 = int(width / self._insar.numberRangeLooks2)
    length2 = int(length / self._insar.numberAzimuthLooks2)

    if not ((self._insar.numberRangeLooks2 == 1) and
            (self._insar.numberAzimuthLooks2 == 1)):
        #take looks
        look(self._insar.differentialInterferogram,
             self._insar.multilookDifferentialInterferogram, width,
             self._insar.numberRangeLooks2, self._insar.numberAzimuthLooks2, 4,
             0, 1)
        look(self._insar.amplitude, self._insar.multilookAmplitude, width,
             self._insar.numberRangeLooks2, self._insar.numberAzimuthLooks2, 4,
             1, 1)
        look(self._insar.latitude, self._insar.multilookLatitude, width,
             self._insar.numberRangeLooks2, self._insar.numberAzimuthLooks2, 3,
             0, 1)
        look(self._insar.longitude, self._insar.multilookLongitude, width,
             self._insar.numberRangeLooks2, self._insar.numberAzimuthLooks2, 3,
             0, 1)
        look(self._insar.height, self._insar.multilookHeight, width,
             self._insar.numberRangeLooks2, self._insar.numberAzimuthLooks2, 3,
             0, 1)
        #creat xml
        create_xml(self._insar.multilookDifferentialInterferogram, width2,
                   length2, 'int')
        create_xml(self._insar.multilookAmplitude, width2, length2, 'amp')
        create_xml(self._insar.multilookLatitude, width2, length2, 'double')
        create_xml(self._insar.multilookLongitude, width2, length2, 'double')
        create_xml(self._insar.multilookHeight, width2, length2, 'double')
        #los has two bands, use look program in isce instead
        #cmd = "looks.py -i {} -o {} -r {} -a {}".format(self._insar.los, self._insar.multilookLos, self._insar.numberRangeLooks2, self._insar.numberAzimuthLooks2)
        #runCmd(cmd)

        #replace the above system call with function call
        from mroipac.looks.Looks import Looks
        from isceobj.Image import createImage
        inImage = createImage()
        inImage.load(self._insar.los + '.xml')

        lkObj = Looks()
        lkObj.setDownLooks(self._insar.numberAzimuthLooks2)
        lkObj.setAcrossLooks(self._insar.numberRangeLooks2)
        lkObj.setInputImage(inImage)
        lkObj.setOutputFilename(self._insar.multilookLos)
        lkObj.looks()

        #water body
        #this looking operation has no problems where there is only water and land, but there is also possible no-data area
        #look(self._insar.wbdOut, self._insar.multilookWbdOut, width, self._insar.numberRangeLooks2, self._insar.numberAzimuthLooks2, 0, 0, 1)
        #create_xml(self._insar.multilookWbdOut, width2, length2, 'byte')
        #use waterBodyRadar instead to avoid the problems of no-data pixels in water body
        waterBodyRadar(self._insar.multilookLatitude,
                       self._insar.multilookLongitude, wbdFile,
                       self._insar.multilookWbdOut)

    os.chdir('../')

    catalog.printToLog(logger, "runLook")
    self._insar.procDoc.addAllFromCatalog(catalog)
Ejemplo n.º 7
0
    differentialInterferogram = 'diff_' + pair + ml1 + '.int'
    multilookAmplitude = pair + ml2 + '.amp'
    multilookDifferentialInterferogram = 'diff_' + pair + ml2 + '.int'
    multilookCoherence = pair + ml2 + '.cor'

    amp = isceobj.createImage()
    amp.load(amplitude+'.xml')
    width = amp.width
    length = amp.length
    width2 = int(width / numberRangeLooks2)
    length2 = int(length / numberAzimuthLooks2)


    if not ((numberRangeLooks2 == 1) and (numberAzimuthLooks2 == 1)):
        #take looks
        look(differentialInterferogram, multilookDifferentialInterferogram, width, numberRangeLooks2, numberAzimuthLooks2, 4, 0, 1)
        look(amplitude, multilookAmplitude, width, numberRangeLooks2, numberAzimuthLooks2, 4, 1, 1)
        #creat xml
        create_xml(multilookDifferentialInterferogram, width2, length2, 'int')
        create_xml(multilookAmplitude, width2, length2, 'amp')



    if (numberRangeLooks1*numberRangeLooks2*numberAzimuthLooks1*numberAzimuthLooks2 >= 9):
        cmd = "imageMath.py -e='sqrt(b_0*b_1);abs(a)/(b_0+(b_0==0))/(b_1+(b_1==0))*(b_0!=0)*(b_1!=0)' --a={} --b={} -o {} -t float -s BIL".format(
            multilookDifferentialInterferogram,
            multilookAmplitude,
            multilookCoherence)
        runCmd(cmd)
    else:
        #estimate coherence using a moving window