Exemple #1
0
def resampSlave(mas, slv, rdict, outname ):
    '''
    Resample burst by burst.
    '''
   
    azpoly = rdict['azpoly']
    rgpoly = rdict['rgpoly']
    azcarrpoly = rdict['carrPoly']
    dpoly = rdict['doppPoly']

    rngImg = isceobj.createImage()
    rngImg.load(rdict['rangeOff'] + '.xml')
    rngImg.setAccessMode('READ')

    aziImg = isceobj.createImage()
    aziImg.load(rdict['azimuthOff'] + '.xml')
    aziImg.setAccessMode('READ')

    inimg = isceobj.createSlcImage()
    inimg.load(slv.image.filename + '.xml')
    inimg.setAccessMode('READ')


    rObj = stdproc.createResamp_slc()
    rObj.slantRangePixelSpacing = slv.rangePixelSize
    rObj.radarWavelength = slv.radarWavelength
    rObj.azimuthCarrierPoly = azcarrpoly
    rObj.dopplerPoly = dpoly
   
    rObj.azimuthOffsetsPoly = azpoly
    rObj.rangeOffsetsPoly = rgpoly
    rObj.imageIn = inimg


    ####Setting reference values
    rObj.startingRange = slv.startingRange
    rObj.referenceSlantRangePixelSpacing = mas.rangePixelSize
    rObj.referenceStartingRange = mas.startingRange
    rObj.referenceWavelength = mas.radarWavelength


    width = mas.numberOfSamples
    length = mas.numberOfLines
    imgOut = isceobj.createSlcImage()
    imgOut.setWidth(width)
    imgOut.filename = outname
    imgOut.setAccessMode('write')

    rObj.outputWidth = width
    rObj.outputLines = length
    rObj.residualRangeImage = rngImg
    rObj.residualAzimuthImage = aziImg

    rObj.resamp_slc(imageOut=imgOut)

    imgOut.renderHdr()
    return imgOut
Exemple #2
0
def estimateOffsetField(reference, secondary, inps=None):
    '''
    Estimate offset field between burst and simamp.
    '''

    ###Loading the secondary image object
    sim = isceobj.createSlcImage()
    sim.load(secondary+'.xml')
    sim.setAccessMode('READ')
    sim.createImage()

    ###Loading the reference image object
    sar = isceobj.createSlcImage()
    sar.load(reference + '.xml')
    sar.setAccessMode('READ')
    sar.createImage()

    width = sar.getWidth()
    length = sar.getLength()

    objOffset = DenseAmpcor(name='dense')
    objOffset.configure()

#   objOffset.numberThreads = 6
    objOffset.setWindowSizeWidth(inps.winwidth)
    objOffset.setWindowSizeHeight(inps.winhgt)
    objOffset.setSearchWindowSizeWidth(inps.srcwidth)
    objOffset.setSearchWindowSizeHeight(inps.srchgt)
    objOffset.skipSampleAcross = inps.skipwidth
    objOffset.skipSampleDown = inps.skiphgt
    objOffset.margin = inps.margin 
    objOffset.oversamplingFactor = inps.oversample

    objOffset.setAcrossGrossOffset(inps.rgshift)
    objOffset.setDownGrossOffset(inps.azshift)

    objOffset.setFirstPRF(1.0)
    objOffset.setSecondPRF(1.0)
    if sar.dataType.startswith('C'):
        objOffset.setImageDataType1('mag')
    else:
        objOffset.setImageDataType1('real')

    if sim.dataType.startswith('C'):
        objOffset.setImageDataType2('mag') 
    else:
        objOffset.setImageDataType2('real')

    objOffset.offsetImageName = inps.outprefix + '.bil'
    objOffset.snrImageName = inps.outprefix +'_snr.bil'

    
    objOffset.denseampcor(sar, sim)

    sar.finalizeImage()
    sim.finalizeImage()
    return objOffset
Exemple #3
0
def generateIgram(imageSlc1, imageSlc2, resampName, azLooks, rgLooks):
    objSlc1 = isceobj.createSlcImage()
    IU.copyAttributes(imageSlc1, objSlc1)
    objSlc1.setAccessMode('read')
    objSlc1.createImage()

    objSlc2 = isceobj.createSlcImage()
    IU.copyAttributes(imageSlc2, objSlc2)
    objSlc2.setAccessMode('read')
    objSlc2.createImage()

    slcWidth = imageSlc1.getWidth()
    intWidth = int(slcWidth / rgLooks)

    lines = min(imageSlc1.getLength(), imageSlc2.getLength())

    if '.flat' in resampName:
        resampAmp = resampName.replace('.flat', '.amp')
    elif '.int' in resampName:
        resampAmp = resampName.replace('.int', '.amp')
    else:
        resampAmp += '.amp'

    resampInt = resampName

    objInt = isceobj.createIntImage()
    objInt.setFilename(resampInt)
    objInt.setWidth(intWidth)
    imageInt = isceobj.createIntImage()
    IU.copyAttributes(objInt, imageInt)
    objInt.setAccessMode('write')
    objInt.createImage()

    objAmp = isceobj.createAmpImage()
    objAmp.setFilename(resampAmp)
    objAmp.setWidth(intWidth)
    imageAmp = isceobj.createAmpImage()
    IU.copyAttributes(objAmp, imageAmp)
    objAmp.setAccessMode('write')
    objAmp.createImage()

    objCrossmul = crossmul.createcrossmul()
    objCrossmul.width = slcWidth
    objCrossmul.length = lines
    objCrossmul.LooksDown = azLooks
    objCrossmul.LooksAcross = rgLooks

    objCrossmul.crossmul(objSlc1, objSlc2, objInt, objAmp)

    for obj in [objInt, objAmp, objSlc1, objSlc2]:
        obj.finalizeImage()

    return imageInt, imageAmp
Exemple #4
0
def resampSecondary(reference, burst, doppler, azpoly, flatten=False):
    '''
    Resample burst by burst.
    '''

    inimg = isceobj.createSlcImage()
    base = os.path.basename(reference)
    inimg.load(os.path.join(reference, base + '_orig.slc.xml'))
    inimg.setAccessMode('READ')
    width = inimg.getWidth()
    length = inimg.getLength()

    prf = burst.getInstrument().getPulseRepetitionFrequency()

    coeffs = [2 * np.pi * val / prf for val in doppler._coeffs]
    zcoeffs = [0. for val in coeffs]

    dpoly = Poly2D()
    dpoly.initPoly(rangeOrder=doppler._order,
                   azimuthOrder=1,
                   coeffs=[zcoeffs, coeffs])

    apoly = Poly2D()
    apoly.setMeanRange(azpoly._mean)
    apoly.setNormRange(azpoly._norm)
    apoly.initPoly(rangeOrder=azpoly._order,
                   azimuthOrder=0,
                   coeffs=[azpoly._coeffs])

    print('Shifts: ', apoly(1, 1), apoly(10240, 10240))

    rObj = stdproc.createResamp_slc()
    rObj.slantRangePixelSpacing = burst.getInstrument().getRangePixelSize()
    rObj.radarWavelength = burst.getInstrument().getRadarWavelength()
    rObj.azimuthCarrierPoly = dpoly

    rObj.azimuthOffsetsPoly = apoly
    rObj.imageIn = inimg

    imgOut = isceobj.createSlcImage()
    imgOut.setWidth(width)
    imgOut.filename = os.path.join(reference, base + '.slc')
    imgOut.setAccessMode('write')

    rObj.flatten = flatten
    rObj.outputWidth = width
    rObj.outputLines = length

    rObj.resamp_slc(imageOut=imgOut)

    imgOut.renderHdr()
    return imgOut
Exemple #5
0
def resampSecondary(ref, sec, rdict, outname, flatten):
    '''
    Resample burst by burst.
    '''

    azpoly = rdict['azpoly']
    rgpoly = rdict['rgpoly']
    azcarrpoly = rdict['carrPoly']
    dpoly = rdict['doppPoly']

    rngImg = isceobj.createImage()
    rngImg.load(rdict['rangeOff'] + '.xml')
    rngImg.setAccessMode('READ')

    aziImg = isceobj.createImage()
    aziImg.load(rdict['azimuthOff'] + '.xml')
    aziImg.setAccessMode('READ')

    inimg = isceobj.createSlcImage()
    inimg.load(sec.image.filename + '.xml')
    inimg.setAccessMode('READ')

    rObj = stdproc.createResamp_slc()
    rObj.slantRangePixelSpacing = sec.rangePixelSize
    rObj.radarWavelength = sec.radarWavelength
    rObj.azimuthCarrierPoly = azcarrpoly
    rObj.dopplerPoly = dpoly

    rObj.azimuthOffsetsPoly = azpoly
    rObj.rangeOffsetsPoly = rgpoly
    rObj.imageIn = inimg

    width = ref.numberOfSamples
    length = ref.numberOfLines
    imgOut = isceobj.createSlcImage()
    imgOut.setWidth(width)
    imgOut.filename = outname
    imgOut.setAccessMode('write')

    rObj.outputWidth = width
    rObj.outputLines = length
    rObj.residualRangeImage = rngImg
    rObj.residualAzimuthImage = aziImg
    rObj.flatten = flatten
    print(rObj.flatten)
    rObj.resamp_slc(imageOut=imgOut)

    imgOut.renderHdr()
    imgOut.renderVRT()
    return imgOut
Exemple #6
0
def run(imageSlc1, imageSlc2, resampName, azLooks, rgLooks):
    objSlc1 = isceobj.createSlcImage()
    #right now imageSlc1 and 2 are just text files, need to open them as image

    IU.copyAttributes(imageSlc1, objSlc1)
    objSlc1.setAccessMode('read')
    objSlc1.createImage()

    objSlc2 = isceobj.createSlcImage()
    IU.copyAttributes(imageSlc2, objSlc2)
    objSlc2.setAccessMode('read')
    objSlc2.createImage()

    slcWidth = imageSlc1.getWidth()
    intWidth = int(slcWidth / rgLooks)

    lines = min(imageSlc1.getLength(), imageSlc2.getLength())

    resampAmp = resampName + '.amp'
    resampInt = resampName + '.int'

    objInt = isceobj.createIntImage()
    objInt.setFilename(resampInt)
    objInt.setWidth(intWidth)
    imageInt = isceobj.createIntImage()
    IU.copyAttributes(objInt, imageInt)
    objInt.setAccessMode('write')
    objInt.createImage()

    objAmp = isceobj.createAmpImage()
    objAmp.setFilename(resampAmp)
    objAmp.setWidth(intWidth)
    imageAmp = isceobj.createAmpImage()
    IU.copyAttributes(objAmp, imageAmp)
    objAmp.setAccessMode('write')
    objAmp.createImage()

    objCrossmul = crossmul.createcrossmul()
    objCrossmul.width = slcWidth
    objCrossmul.length = lines
    objCrossmul.LooksDown = azLooks
    objCrossmul.LooksAcross = rgLooks

    objCrossmul.crossmul(objSlc1, objSlc2, objInt, objAmp)

    for obj in [objInt, objAmp, objSlc1, objSlc2]:
        obj.finalizeImage()

    return imageInt, imageAmp
def runFormSLC(self, patchSize=None, goodLines=None, numPatches=None):
    #NOTE tested the formslc() as a stand alone by passing the same inputs
    #computed in Howard terraSAR.py. The differences here arises from the
    #differences in the orbits when using the same orbits the results are very
    #close jng this will make the second term in coarseAz in offsetprf equal
    #zero. we do so since for tsx there is no such a term. Need to ask
    #confirmation
    self.insar.setPatchSize(self.insar.numberValidPulses)
    # the below value is zero because of we just did above, but just want to be
    #  explicit in the definition of is_mocomp

    imageSlc1 =  self.insar.masterRawImage
    imSlc1 = isceobj.createSlcImage()
    IU.copyAttributes(imageSlc1, imSlc1)
    imSlc1.setAccessMode('read')
    imSlc1.createImage()
    formSlc1 = FormSLC()
    formSlc1.configure()

    formSlc1.slcWidth = imSlc1.getWidth()
    formSlc1.startingRange = self.insar.masterFrame.startingRange
    formSlc1.sensingStart = self.insar.masterFrame.sensingStart 
    formSlc1.rangeChirpExtensionPoints = 0

    self.insar.formSLC1 = formSlc1
    self.insar.masterSlcImage = imSlc1
    
    
    imageSlc2 =  self.insar.slaveRawImage
    imSlc2 = isceobj.createSlcImage()
    IU.copyAttributes(imageSlc2, imSlc2)
    imSlc2.setAccessMode('read')
    imSlc2.createImage()
    formSlc2 = stdproc.createFormSLC()

    formSlc2.slcWidth = imSlc2.getWidth()
    formSlc2.startingRange = self.insar.slaveFrame.startingRange
    formSlc2.sensingStart = self.insar.slaveFrame.sensingStart
    formSlc2.rangeChirpExtensionPoints = 0

    self.insar.setNumberPatches(
        imSlc1.getLength()/float(self.insar.numberValidPulses)
        )
    imSlc1.finalizeImage()
    imSlc2.finalizeImage()

    self.insar.setFormSLC1(formSlc1)
    self.insar.setFormSLC2(formSlc2)
    def extractImage(self):
        import numpy as np
        import h5py

        self.parse()

        fid = h5py.File(self.hdf5, 'r')

        si = fid['s_i']
        sq = fid['s_q']

        nLines = si.shape[0]
        spectralShift = 2 * self.frame.getInstrument().getRangePixelSize(
        ) / self.frame.getInstrument().getRadarWavelength()
        spectralShift -= np.floor(spectralShift)
        phsShift = np.exp(-1j * 2 * np.pi * spectralShift *
                          np.arange(si.shape[1]))
        with open(self.output, 'wb') as fout:
            for ii in range(nLines):
                line = (si[ii, :] + 1j * sq[ii, :])
                if self.applySlantRangePhase:
                    line *= phsShift
                line.astype(np.complex64).tofile(fout)

        fid.close()

        slcImage = isceobj.createSlcImage()
        slcImage.setFilename(self.output)
        slcImage.setXmin(0)
        slcImage.setXmax(self.frame.getNumberOfSamples())
        slcImage.setWidth(self.frame.getNumberOfSamples())
        slcImage.setAccessMode('r')
        self.frame.setImage(slcImage)
Exemple #9
0
def run(slcImage,
        resampledFilename,
        offsetField,
        instrument,
        pixelSpacing,
        doppler,
        catalog=None,
        sceneid='NO_ID'):
    # Create the resampled SLC image
    resampledSlcImage = isceobj.createSlcImage()
    resampledSlcImage.setFilename(resampledFilename)
    resampledSlcImage.setAccessMode('write')
    resampledSlcImage.setDataType('CFLOAT')
    resampledSlcImage.setWidth(slcImage.width)
    resampledSlcImage.createImage()

    resamp = stdproc.createResamp_slc()
    resamp.setNumberLines(slcImage.length)
    resamp.setNumberRangeBin(slcImage.width)
    resamp.setNumberFitCoefficients(1)
    resamp.setSlantRangePixelSpacing(pixelSpacing)
    resamp.setDopplerCentroidCoefficients([doppler, 0.0, 0.0, 0.0])
    resamp.wireInputPort(name='offsets', object=offsetField)
    resamp.wireInputPort(name='instrument', object=instrument)
    resamp.stdWriter = stdWriter.set_file_tags("resamp_slc", "log", "err",
                                               "out")
    resamp.resamp_slc(slcImage, resampledSlcImage)
    slcImage.finalizeImage()
    resampledSlcImage.finalizeImage()
    return resampledSlcImage
Exemple #10
0
def getValidLines(secondary, rdict, inname, misreg_az=0.0, misreg_rng=0.0):
    '''
    Looks at the reference, secondary and azimuth offsets and gets the Interferogram valid lines 
    '''
    import numpy as np
    import isce
    import isceobj

    dimg = isceobj.createSlcImage()
    dimg.load(inname + '.xml')
    shp = (dimg.length, dimg.width)
    az = np.fromfile(rdict['azimuthOff'], dtype=np.float32).reshape(shp)
    az += misreg_az
    aa = np.zeros(az.shape)
    aa[:, :] = az
    aa[aa < -10000.0] = np.nan
    amin = np.nanmin(aa)
    amax = np.nanmax(aa)

    rng = np.fromfile(rdict['rangeOff'], dtype=np.float32).reshape(shp)
    rng += misreg_rng
    rr = np.zeros(rng.shape)
    rr[:, :] = rng
    rr[rr < -10000.0] = np.nan
    rmin = np.nanmin(rr)
    rmax = np.nanmax(rr)

    return amin, amax, rmin, rmax
Exemple #11
0
def create_xml(fileName, width, length, fileType):
    import isceobj

    if fileType == 'slc':
        image = isceobj.createSlcImage()
    elif fileType == 'int':
        image = isceobj.createIntImage()
    elif fileType == 'amp':
        image = isceobj.createAmpImage()
    elif fileType == 'cor':
        image = isceobj.createOffsetImage()
    elif fileType == 'rmg' or fileType == 'unw':
        image = isceobj.Image.createUnwImage()
    elif fileType == 'byte':
        image = isceobj.createImage()
        image.setDataType('BYTE')
    elif fileType == 'float':
        image = isceobj.createImage()
        image.setDataType('FLOAT')
    elif fileType == 'double':
        image = isceobj.createImage()
        image.setDataType('DOUBLE')

    else:
        raise Exception('format not supported yet!\n')

    image.setFilename(fileName)
    image.extraFilename = fileName + '.vrt'
    image.setWidth(width)
    image.setLength(length)

    #image.setAccessMode('read')
    #image.createImage()
    image.renderHdr()
Exemple #12
0
    def extractImage(self):

        import numpy as np
        import h5py

        self.parse()

        fid = h5py.File(self.hdf5, 'r')
        ds = fid['/science/LSAR/SLC/swaths/' + self.frequency + '/' +
                 self.polarization]
        nLines = ds.shape[0]

        with open(self.output, 'wb') as fout:
            for ii in range(nLines):
                ds[ii, :].astype(np.complex64).tofile(fout)

        fid.close()

        slcImage = isceobj.createSlcImage()
        slcImage.setFilename(self.output)
        slcImage.setXmin(0)
        slcImage.setXmax(self.frame.getNumberOfSamples())
        slcImage.setWidth(self.frame.getNumberOfSamples())
        slcImage.setAccessMode('r')
        slcImage.renderHdr()
        self.frame.setImage(slcImage)
Exemple #13
0
 def extractImage(self):
     """
     Exports GeoTiff to ISCE format.
     """
     from osgeo import gdal
     
     ds = gdal.Open(self._imageFileName)
     metadata = ds.GetMetadata()
     geoTs = ds.GetGeoTransform() #GeoTransform
     prj = ds.GetProjection() #Projection
     dataType = ds.GetRasterBand(1).DataType
     gcps = ds.GetGCPs()
     
     sds = ds.ReadAsArray()
     
     # Output raster array to ISCE file
     driver = gdal.GetDriverByName('ISCE')  
     export = driver.Create(self.output, ds.RasterXSize, ds.RasterYSize, 1, dataType)
     band = export.GetRasterBand(1)
     band.WriteArray(sds)
     export.SetGeoTransform(geoTs)
     export.SetMetadata(metadata)
     export.SetProjection(prj)
     export.SetGCPs(gcps,prj)
     band.FlushCache()
     export.FlushCache()        
     
     self.parse()
     slcImage = isceobj.createSlcImage()
     slcImage.setFilename(self.output)
     slcImage.setXmin(0)
     slcImage.setXmax(self.frame.getNumberOfSamples())
     slcImage.setWidth(self.frame.getNumberOfSamples())
     slcImage.setAccessMode('r')
     self.frame.setImage(slcImage)
Exemple #14
0
def createSlcImage(slcName, width):

    slc = isceobj.createSlcImage()
    slc.setWidth(width)
    slc.filename = slcName
    slc.setAccessMode('write')
    slc.renderHdr()
Exemple #15
0
def run(rawImage,
        frame,
        dopplerCentroid,
        orbit,
        peg,
        velocity,
        height,
        sensorname,
        stdWriter,
        catalog=None,
        sceneid='NO_ID'):
    logger.info("Forming SLC: %s" % sceneid)

    imSlc = isceobj.createSlcImage()
    IU.copyAttributes(rawImage, imSlc)
    imSlc.setAccessMode('read')
    imSlc.createImage()
    formSlc = stdproc.createFormSLC(sensorname)
    formSlc.setBodyFixedVelocity(velocity)
    formSlc.setSpacecraftHeight(height)
    formSlc.wireInputPort(name='doppler', object=dopplerCentroid)
    formSlc.wireInputPort(name='peg', object=peg)
    formSlc.wireInputPort(name='frame', object=frame)
    formSlc.wireInputPort(name='orbit', object=orbit)
    formSlc.wireInputPort(name='slcInImage', object=imSlc)
    formSlc.stdWriter = stdWriter.set_file_tags("formslcTSX", "log", "err",
                                                "out")
    slcImage = formSlc()
    imSlc.finalizeImage()
    if catalog is not None:
        isceobj.Catalog.recordInputsAndOutputs(catalog, formSlc,
                                               "runFormSLCTSX.%s" % sceneid,
                                               logger,
                                               "runFormSLCTSX.%s" % sceneid)
    return slcImage, formSlc
    def extractImage(self):
        """
           Use gdal python bindings to extract image
        """
        try:
            from osgeo import gdal
        except ImportError:
            raise Exception('GDAL python bindings not found. Need this for RSAT2/ TandemX / Sentinel1A.')

        self.parse()
        width = self.frame.getNumberOfSamples()
        lgth = self.frame.getNumberOfLines()

        src = gdal.Open(self.tiff.strip(), gdal.GA_ReadOnly)
        band = src.GetRasterBand(1)
        fid = open(self.output, 'wb')
        for ii in range(lgth):
            data = band.ReadAsArray(0,ii,width,1)
            data.tofile(fid)

        fid.close()
        src = None
        band = None

        ####
        slcImage = isceobj.createSlcImage()
        slcImage.setByteOrder('l')
        slcImage.setFilename(self.output)
        slcImage.setAccessMode('read')
        slcImage.setWidth(self.frame.getNumberOfSamples())
        slcImage.setLength(self.frame.getNumberOfLines())
        slcImage.setXmin(0)
        slcImage.setXmax(self.frame.getNumberOfSamples())
        self.frame.setImage(slcImage)
Exemple #17
0
def run(rawImage,
        frame,
        dopplerCentroid,
        orbit,
        peg,
        velocity,
        height,
        sensorname,
        stdWriter,
        catalog=None,
        sceneid='NO_ID'):
    logger.info("Forming SLC: %s" % sceneid)

    imSlc = isceobj.createSlcImage()
    IU.copyAttributes(rawImage, imSlc)
    imSlc.setAccessMode('read')
    imSlc.createImage()
    formSlc = stdproc.createFormSLC(sensorname)
    formSlc.setBodyFixedVelocity(velocity)
    formSlc.setSpacecraftHeight(height)
    formSlc.wireInputPort(name='doppler', object=dopplerCentroid)
    formSlc.wireInputPort(name='peg', object=peg)
    formSlc.wireInputPort(name='frame', object=frame)
    formSlc.wireInputPort(name='orbit', object=orbit)
    formSlc.wireInputPort(name='rawImage', object=None)
    formSlc.wireInputPort(name='planet',
                          object=frame.instrument.platform.planet)
    for item in formSlc.inputPorts:
        item()
    formSlc.slcWidth = imSlc.getWidth()
    formSlc.startingRange = formSlc.rangeFirstSample
    formSlc.rangeChirpExtensionsPoints = 0
    formSlc.setLookSide(frame.platform.pointingDirection)
    formSlc.slcSensingStart = frame.getSensingStart()
    formSlc.outOrbit = orbit

    formSlc.stdWriter = stdWriter.set_file_tags("formslcISCE", "log", "err",
                                                "out")

    time, position, vel, relTo = orbit._unpackOrbit()
    mocomp_array = [[], []]
    for (t, p) in zip(time, position):
        mocomp_array[0].append(t - time[0])
        mocomp_array[1].append(p[0])

    formSlc.mocompPosition = mocomp_array
    formSlc.mocompIndx = list(range(1, len(time) + 1))
    formSlc.dim1_mocompPosition = 2
    formSlc.dim2_mocompPosition = len(time)
    formSlc.dim1_mocompIndx = len(time)

    #    slcImage = formSlc()
    imSlc.finalizeImage()
    if catalog is not None:
        isceobj.Catalog.recordInputsAndOutputs(catalog, formSlc,
                                               "runFormSLCisce.%s" % sceneid,
                                               logger,
                                               "runFormSLCisce.%s" % sceneid)
    return imSlc, formSlc
def multiply(masname, slvname, outname, rngname, fact, masterFrame,
        flatten=True, alks=3, rlks=7, virtual=True):


    masImg = isceobj.createSlcImage()
    masImg.load( masname + '.xml')

    width = masImg.getWidth()
    length = masImg.getLength()


    if not virtual:
        master = np.memmap(masname, dtype=np.complex64, mode='r', shape=(length,width))
        slave = np.memmap(slvname, dtype=np.complex64, mode='r', shape=(length, width))
    else:
        master = loadVirtualArray(masname + '.vrt')
        slave = loadVirtualArray(slvname + '.vrt')
   
    if os.path.exists(rngname):
        rng2 = np.memmap(rngname, dtype=np.float32, mode='r', shape=(length,width))
    else:
        print('No range offsets provided')
        rng2 = np.zeros((length,width))

    cJ = np.complex64(-1j)
    
    #Zero out anytging outside the valid region:
    ifg = np.memmap(outname, dtype=np.complex64, mode='w+', shape=(length,width))
    firstS = masterFrame.firstValidSample
    lastS = masterFrame.firstValidSample + masterFrame.numValidSamples -1
    firstL = masterFrame.firstValidLine
    lastL = masterFrame.firstValidLine + masterFrame.numValidLines - 1
    for kk in range(firstL,lastL + 1):
        ifg[kk,firstS:lastS + 1] = master[kk,firstS:lastS + 1] * np.conj(slave[kk,firstS:lastS + 1])
        if flatten:
            phs = np.exp(cJ*fact*rng2[kk,firstS:lastS + 1])
            ifg[kk,firstS:lastS + 1] *= phs

    ####
    master=None
    slave=None
    ifg = None

    objInt = isceobj.createIntImage()
    objInt.setFilename(outname)
    objInt.setWidth(width)
    objInt.setLength(length)
    objInt.setAccessMode('READ')
    objInt.renderHdr()

    try:
        outfile = takeLooks(objInt, alks, rlks)
        print('Output: ', outfile)
    except:
        raise Exception('Failed to multilook ifgs')

    return objInt
Exemple #19
0
def runRgoffset(self):
    from isceobj.Catalog import recordInputs, recordOutputs

    coarseAcross = 0
    coarseDown = 0
    numLocationAcross = self._insar.getNumberLocationAcross()
    numLocationDown = self._insar.getNumberLocationDown()
    firstAc = self._insar.getFirstSampleAcross()
    firstDn = self._insar.getFirstSampleDown()

    ampImage = self._insar.getResampAmpImage()
    slaveWidth = ampImage.getWidth()
    slaveLength = ampImage.getLength()
    objAmp = isceobj.createSlcImage()
    objAmp.dataType = 'CFLOAT'
    objAmp.bands = 1
    objAmp.setFilename(ampImage.getFilename())
    objAmp.setAccessMode('read')
    objAmp.setWidth(slaveWidth)
    objAmp.createImage()

    simImage = self._insar.getSimAmpImage()
    masterWidth = simImage.getWidth()
    objSim = isceobj.createImage()
    objSim.setFilename(simImage.getFilename())
    objSim.dataType = 'FLOAT'
    objSim.setWidth(masterWidth)
    objSim.setAccessMode('read')
    objSim.createImage()
    masterLength = simImage.getLength()

    nStageObj = NStage(name='insarapp_intsim_nstage')
    nStageObj.configure()
    nStageObj.setImageDataType1('real')
    nStageObj.setImageDataType2('complex')

    if nStageObj.acrossGrossOffset is None:
        nStageObj.setAcrossGrossOffset(0)

    if nStageObj.downGrossOffset is None:
        nStageObj.setDownGrossOffset(0)

    # Record the inputs
    recordInputs(self._insar.procDoc, nStageObj, "runRgoffset", logger,
                 "runRgoffset")

    nStageObj.nstage(slcImage1=objSim, slcImage2=objAmp)

    recordOutputs(self._insar.procDoc, nStageObj, "runRgoffset", logger,
                  "runRgoffset")

    offField = nStageObj.getOffsetField()

    # save the input offset field for the record
    self._insar.setOffsetField(offField)
    self._insar.setRefinedOffsetField(offField)
Exemple #20
0
def master(self, deltaf=None):
    from isceobj.Catalog import recordInputsAndOutputs
    from iscesys.ImageUtil.ImageUtil import ImageUtil as IU




    v,h = self.insar.vh()
   
    objRaw = self.insar.rawMasterIQImage.clone()
    objRaw.accessMode = 'read'
    objFormSlc = stdproc.createFormSLC(name='insarapp_formslc_master')
    objFormSlc.setBodyFixedVelocity(v)
    objFormSlc.setSpacecraftHeight(h)
    objFormSlc.setAzimuthPatchSize(self.patchSize)
    objFormSlc.setNumberValidPulses(self.goodLines)
    objFormSlc.setNumberPatches(self.numPatches)
    objFormSlc.setLookSide(self.insar._lookSide)
    objFormSlc.setNumberAzimuthLooks(self.insar.numberAzimuthLooks)
    logger.info("Focusing Master image")
    objFormSlc.stdWriter = self.stdWriter

    if (deltaf is not None) and (objFormSlc.azimuthResolution is None):
        ins = self.insar.masterFrame.getInstrument()
        prf = ins.getPulseRepetitionFrequency()
        res = ins.getPlatform().getAntennaLength() / 2.0
        azbw = min(v/res, prf)
        res = v/azbw 

        factor = 1.0 - (abs(deltaf)/azbw)
        logger.info('MASTER AZIMUTH BANDWIDTH FACTOR = %f'%(factor))
        azres = res / factor
        #jng This is a temporary solution seems it looks that same banding problem
        #can be resolved by doubling the azres. The default azResFactor  is still one.
        objFormSlc.setAzimuthResolution(azres*self.insar.azResFactor)
   
    ####newInputs
    objSlc = objFormSlc(rawImage=objRaw,
                orbit=self.insar.masterOrbit,
                frame=self.insar.masterFrame,
                planet=self.insar.masterFrame.instrument.platform.planet,
                doppler=self.insar.dopplerCentroid,
                peg=self.insar.peg)

    imageSlc = isceobj.createSlcImage()
    IU.copyAttributes(objSlc, imageSlc)
    imageSlc.setAccessMode('read')
    objSlc.finalizeImage()
    objRaw.finalizeImage()
    recordInputsAndOutputs(self.insar.procDoc, objFormSlc,
        "runFormSLC.master", logger, "runFormSLC.master")

    logger.info('New Width = %d'%(imageSlc.getWidth()))
    self.insar.masterSlcImage = imageSlc
    self.insar.formSLC1 = objFormSlc
    return objFormSlc.numberPatches
Exemple #21
0
    def extractImage(self):
        """
           Use gdal_translate to extract the slc
        """
        import tempfile
        import subprocess

        if (not self.gdal_translate):
            raise TypeError(
                "The path to executable gdal_translate was not specified")
        if (not os.path.exists(self.gdal_translate)):
            raise OSError("Could not find gdal_translate in directory %s" %
                          os.path.dirname(self.gdal_translate))

        self.parse()
        # Use GDAL to convert the geoTIFF file to an raster image
        # There should be a way to do this using the GDAL python api
        curdir = os.getcwd()
        tempdir = tempfile.mkdtemp(dir=curdir)
        #        os.rmdir(tempdir) # Wasteful, but if the directory exists, gdal_translate freaks out
        #instring = 'RADARSAT_2_CALIB:UNCALIB:%s' % self.xml
        #process = subprocess.Popen([self.gdal_translate,'-of','MFF2','-ot','CFloat32',instring,tempdir])
        if (self.tiff is None) or (not os.path.exists(self.tiff)):
            raise Exception(
                'Path to input tiff file: %s is wrong or file doesnt exist.' %
                (self.tiff))

        process = subprocess.Popen([
            self.gdal_translate,
            self.tiff.strip(), '-of', 'ENVI', '-ot', 'CFloat32', '-co',
            'INTERLEAVE=BIP',
            os.path.join(tempdir, 'image_data')
        ])
        process.wait()

        # Move the output of the gdal_translate call to a reasonable file name

        width = self.frame.getNumberOfSamples()
        lgth = self.frame.getNumberOfLines()

        os.rename(os.path.join(tempdir, 'image_data'), self.output)

        #       os.unlink(os.path.join(tempdir,'attrib'))
        os.unlink(os.path.join(tempdir, 'image_data.hdr'))
        os.rmdir(tempdir)

        ####
        slcImage = isceobj.createSlcImage()
        slcImage.setByteOrder('l')
        slcImage.setFilename(self.output)
        slcImage.setAccessMode('read')
        slcImage.setWidth(self.frame.getNumberOfSamples())
        slcImage.setLength(self.frame.getNumberOfLines())
        slcImage.setXmin(0)
        slcImage.setXmax(self.frame.getNumberOfSamples())
        self.frame.setImage(slcImage)
Exemple #22
0
    def extractImage(self, verbose=True):
        '''
        Use gdal to extract the slc.
        '''

        try:
            from osgeo import gdal
        except ImportError:
            raise Exception('GDAL python bindings not found. Need this for RSAT2 / TandemX / Sentinel1A.')

        self.parse()

        width = self.frame.getNumberOfSamples()
        lgth  = self.frame.getNumberOfLines()
        lineFlip = (self.product.imageAttributes.rasterAttributes.lineTimeOrdering.upper() == 'DECREASING')
        pixFlip = (self.product.imageAttributes.rasterAttributes.pixelTimeOrdering.upper() == 'DECREASING')

        src = gdal.Open(self.tiff.strip(), gdal.GA_ReadOnly)
        cJ = np.complex64(1.0j)

        ####Images are small enough that we can do it all in one go - Piyush
        real = src.GetRasterBand(1).ReadAsArray(0,0,width,lgth)
        imag = src.GetRasterBand(2).ReadAsArray(0,0,width,lgth)

        if (real is None) or (imag is None):
            raise Exception('Input Radarsat2 SLC seems to not be a 2 band Int16 image.')

        data = real+cJ*imag

        real = None
        imag = None
        src = None

        if lineFlip:
            if verbose:
                print('Vertically Flipping data')
            data = np.flipud(data)

        if pixFlip:
            if verbose:
                print('Horizontally Flipping data')
            data = np.fliplr(data)

        data.tofile(self.output)

        ####
        slcImage = isceobj.createSlcImage()
        slcImage.setByteOrder('l')
        slcImage.setFilename(self.output)
        slcImage.setAccessMode('read')
        slcImage.setWidth(width)
        slcImage.setLength(lgth)
        slcImage.setXmin(0)
        slcImage.setXmax(width)
#        slcImage.renderHdr()
        self.frame.setImage(slcImage)
Exemple #23
0
    def computeRangeParams(self):
        '''Ensure that the given range parameters are valid.'''
        from isceobj.Constants import SPEED_OF_LIGHT
        import isceobj

        chirpLength = int(self.rangeSamplingRate * self.rangePulseDuration)
        halfChirpLength = chirpLength // 2

        #Add a half-chirp to the user requested extension.
        #To decrease the extension relative to the halfChirpLength
        #the user would have to set rangeCHirpExtensionPoints to a negative
        #value; however, the resulting value must be greater than 0.
        self.logger.info('Default near range chirp extension ' +
                         '(half the chirp length): %d' % (halfChirpLength))
        self.logger.info('Extra Chirp Extension requested: ' + '%d' %
                         (self.rangeChirpExtensionPoints))

        self.rangeChirpExtensionPoints = (self.rangeChirpExtensionPoints +
                                          halfChirpLength)

        if self.rangeChirpExtensionPoints >= 0:
            self.logger.info('Extending range line by ' + '%d pixels' %
                             (self.rangeChirpExtensionPoints))
        elif self.rangeChirpExtensionPoints < 0:
            raise ValueError('Range Chirp Extension cannot be negative.')

        #startRangeBin must be positive.
        #It is an index into the raw data range line
        if self.startRangeBin <= 0:
            raise ValueError('startRangeBin must be positive ')

        self.logger.info('Number of Range Bins: %d' % self.numberRangeBin)
        self.slcWidth = (self.numberRangeBin + self.rangeChirpExtensionPoints +
                         halfChirpLength + self.startRangeBin - 1)
        delr = self.rangeSamplingRate

        #Will be set here and passed on to Fortran. - Piyush
        self.startingRange = (
            self.rangeFirstSample +
            (self.startRangeBin - 1 - self.rangeChirpExtensionPoints) *
            SPEED_OF_LIGHT * 0.5 / self.rangeSamplingRate)

        self.logger.info('Raw Starting Range: %f' % (self.rangeFirstSample))
        self.logger.info('SLC Starting Range: %f' % (self.startingRange))
        self.logger.info('SLC width: %f' % (self.slcWidth))

        #Set width of the SLC image here .
        self.slcImage = isceobj.createSlcImage()
        self.logger.info('Debug fname : %s' % (self.rawImage.getFilename()))
        self.slcImage.setFilename(self.rawImage.getFilename().replace(
            '.raw', '.slc'))
        self.slcImage.setWidth(self.slcWidth)
        self.slcImage.setAccessMode('write')
        self.slcImage.createImage()
Exemple #24
0
 def extractImage(self):
     self.parse()
     slcImage = isceobj.createSlcImage()
     self.slcname = self.metadata['slc_{}_1x1'.format(self.segment_index)]
     slcImage.setFilename(self.slcname)
     slcImage.setXmin(0)
     slcImage.setXmax(self.frame.getNumberOfSamples())
     slcImage.setWidth(self.frame.getNumberOfSamples())
     slcImage.setAccessMode('r')
     self.frame.setImage(slcImage)
     return
Exemple #25
0
    def derampImage(self, offset=0.0, action=True):
        '''
        Deramp the bursts.
        '''

        t0 = self.bursts[0].sensingStart

        lineOffset = 0
        for index, burst in enumerate(self.bursts):
            infile = burst.image.filename
            derampfile = os.path.join(self.outdir,
                                      'deramp_%02d' % (index + 1) + '.slc')

            if action:
                data = np.fromfile(infile, dtype=np.complex64).reshape(
                    (burst.numberOfLines, burst.numberOfSamples))

                ramp = self.computeRamp(burst, offset=offset)

                #####Write Deramped SLC to file
                data *= ramp

                print('Burst Number: %d' % (index + 1))
                print('Number of Lines: %d' % (burst.numberOfLines))
                print('Global Offset: %d' %
                      (np.round(-(t0 - burst.sensingStart).total_seconds() /
                                burst.azimuthTimeInterval)))
                if index > 0:
                    boff = (np.round(-(self.bursts[index - 1].sensingStart -
                                       burst.sensingStart).total_seconds() /
                                     burst.azimuthTimeInterval))
                    lineOffset += boff
                    print('Burst OFfset: %d' % lineOffset)

                fid = open(derampfile, 'wb')
                data.tofile(fid)
                fid.close()

            ####Render ISCE XML
            slcImage = isceobj.createSlcImage()
            slcImage.setByteOrder('l')
            slcImage.setFilename(derampfile)
            slcImage.setAccessMode('read')
            slcImage.setWidth(burst.numberOfSamples)
            slcImage.setLength(burst.numberOfLines)
            slcImage.setXmin(0)
            slcImage.setXmax(burst.numberOfSamples)
            slcImage.renderHdr()
            burst.derampimage = slcImage

        band = None
        src = None
    def extractImage(self):
        import array
        import math

        self.parse()
        try:
            out = open(self.output, 'wb')
        except:
            raise Exception('Cannot open output file: %s' % (self.output))

        self.imageFile.extractImage(output=out)
        out.close()

        rawImage = isceobj.createSlcImage()
        rawImage.setByteOrder('l')
        rawImage.setAccessMode('read')
        rawImage.setFilename(self.output)
        rawImage.setWidth(self.imageFile.width)
        rawImage.setXmin(0)
        rawImage.setXmax(self.imageFile.width)
        self.frame.setImage(rawImage)

        prf = self.frame.getInstrument().getPulseRepetitionFrequency()
        senStart = self.frame.getSensingStart()
        numPulses = int(
            math.ceil(
                DTU.timeDeltaToSeconds(self.frame.getSensingStop() - senStart)
                * prf))
        musec0 = (senStart.hour * 3600 + senStart.minute * 60 +
                  senStart.second) * 10**6 + senStart.microsecond
        maxMusec = (
            24 *
            3600) * 10**6  #use it to check if we went across  a day. very rare
        day0 = (datetime.datetime(senStart.year, senStart.month, senStart.day)
                - datetime.datetime(senStart.year, 1, 1)).days + 1
        outputArray = array.array('d', [0] * 2 * numPulses)
        self.frame.auxFile = self.output + '.aux'
        fp = open(self.frame.auxFile, 'wb')
        j = -1
        for i1 in range(numPulses):
            j += 1
            musec = round((j / prf) * 10**6) + musec0
            if musec >= maxMusec:
                day0 += 1
                musec0 = musec % maxMusec
                musec = musec0
                j = 0
            outputArray[2 * i1] = day0
            outputArray[2 * i1 + 1] = musec

        outputArray.tofile(fp)
        fp.close()
Exemple #27
0
    def extractImage(self, action=True):
        """
           Use gdal python bindings to extract image
        """
        try:
            from osgeo import gdal
        except ImportError:
            raise Exception('GDAL python bindings not found. Need this for RSAT2/ TandemX / Sentinel1.')

        self.parse()

        src = gdal.Open(self.tiff.strip(), gdal.GA_ReadOnly)
        band = src.GetRasterBand(1)

        print('Total Width  = %d'%(src.RasterXSize))
        print('Total Length = %d'%(src.RasterYSize))

        lineOffset = 0

        if os.path.isdir(self.outdir):
            print('Output directory {0} already exists.'.format(self.outdir))
        else:
            print('Creating directory {0} '.format(self.outdir))
            os.makedirs(self.outdir)

        for index, burst in enumerate(self.bursts):
            outfile = os.path.join(self.outdir, 'burst_%02d'%(index+1) + '.slc')

            if action:
                ###Write original SLC to file
                fid = open(outfile, 'wb')
                data = band.ReadAsArray(0, lineOffset, burst.numberOfSamples, burst.numberOfLines)
                data.tofile(fid)
                fid.close()

            ####Render ISCE XML
            slcImage = isceobj.createSlcImage()
            slcImage.setByteOrder('l')
            slcImage.setFilename(outfile)
            slcImage.setAccessMode('read')
            slcImage.setWidth(burst.numberOfSamples)
            slcImage.setLength(burst.numberOfLines)
            slcImage.setXmin(0)
            slcImage.setXmax(burst.numberOfSamples)
            slcImage.renderHdr()
            burst.image = slcImage 

            lineOffset += burst.numberOfLines

        band = None
        src = None
Exemple #28
0
def secondary(self, deltaf=None):
    from isceobj.Catalog import recordInputsAndOutputs
    from iscesys.ImageUtil.ImageUtil import ImageUtil as IU

    v, h = self.insar.vh()

    objRaw = self.insar.rawSecondaryIQImage.clone()
    objRaw.accessMode = 'read'
    objFormSlc = stdproc.createFormSLC(name='insarapp_formslc_secondary')
    objFormSlc.setBodyFixedVelocity(v)
    objFormSlc.setSpacecraftHeight(h)
    objFormSlc.setAzimuthPatchSize(self.patchSize)
    objFormSlc.setNumberValidPulses(self.goodLines)
    objFormSlc.setNumberPatches(self.numPatches)
    objFormSlc.setNumberAzimuthLooks(self.insar.numberAzimuthLooks)
    objFormSlc.setLookSide(self.insar._lookSide)
    logger.info("Focusing Reference image")
    objFormSlc.stdWriter = self.stdWriter

    if (deltaf is not None) and (objFormSlc.azimuthResolution is None):
        ins = self.insar.secondaryFrame.getInstrument()
        prf = ins.getPulseRepetitionFrequency()
        res = ins.getPlatform().getAntennaLength() / 2.0
        azbw = min(v / res, prf)
        res = v / azbw
        factor = 1.0 - (abs(deltaf) / azbw)
        logger.info('SECONDARY AZIMUTH BANDWIDTH FACTOR = %f' % (factor))
        azres = res / factor
        objFormSlc.setAzimuthResolution(azres)

    objSlc = objFormSlc(
        rawImage=objRaw,
        orbit=self.insar.secondaryOrbit,
        frame=self.insar.secondaryFrame,
        planet=self.insar.secondaryFrame.instrument.platform.planet,
        doppler=self.insar.dopplerCentroid,
        peg=self.insar.peg)

    imageSlc = isceobj.createSlcImage()
    IU.copyAttributes(objSlc, imageSlc)
    imageSlc.setAccessMode('read')
    objSlc.finalizeImage()
    objRaw.finalizeImage()
    recordInputsAndOutputs(self.insar.procDoc, objFormSlc,
                           "runFormSLC.secondary", logger,
                           "runFormSLC.secondary")

    logger.info('New Width = %d' % (imageSlc.getWidth()))
    self.insar.secondarySlcImage = imageSlc
    self.insar.formSLC2 = objFormSlc
    return objFormSlc.numberPatches
Exemple #29
0
def extract_burst(inputf, outputf, prf, prf_frac, nb, nbg, bsl, kacoeff, dopcoeff, az_ratio, min_line_offset):
    '''
    see extract_burst.c for usage
    '''

    img = isceobj.createSlcImage()
    img.load(inputf + '.xml')

    width = img.getWidth()
    length = img.getLength()

    inputimage = find_vrt_file(inputf+'.vrt', 'SourceFilename')
    byteorder = find_vrt_keyword(inputf+'.vrt', 'ByteOrder')
    if byteorder == 'LSB':
        byteorder = 0
    else:
        byteorder = 1
    imageoffset = find_vrt_keyword(inputf+'.vrt', 'ImageOffset')
    imageoffset = int(imageoffset)
    lineoffset = find_vrt_keyword(inputf+'.vrt', 'LineOffset')
    lineoffset = int(lineoffset)

    if type(kacoeff) != list:
        raise Exception('kacoeff must be a python list.\n')
        if len(kacoeff) != 4:
            raise Exception('kacoeff must have four elements.\n')
    if type(dopcoeff) != list:
        raise Exception('dopcoeff must be a python list.\n')
        if len(dopcoeff) != 4:
            raise Exception('dopcoeff must have four elements.\n')

    filters = ctypes.cdll.LoadLibrary(os.path.join(os.path.dirname(__file__),'libalos2proc.so'))
    filters.extract_burst(
        ctypes.c_char_p(bytes(inputimage,'utf-8')),
        ctypes.c_char_p(bytes(outputf,'utf-8')),
        ctypes.c_int(width),
        ctypes.c_int(length),
        ctypes.c_float(prf),
        ctypes.c_float(prf_frac),
        ctypes.c_float(nb),
        ctypes.c_float(nbg),
        ctypes.c_float(bsl),
        (ctypes.c_float * len(kacoeff))(*kacoeff),
        (ctypes.c_float * len(dopcoeff))(*dopcoeff),
        ctypes.c_float(az_ratio),
        ctypes.c_float(min_line_offset),
        ctypes.c_int(byteorder),
        ctypes.c_long(imageoffset),
        ctypes.c_long(lineoffset)
        )
def write_xml(shelveFile, slcFile):
    with shelve.open(shelveFile,flag='r') as db:
        frame = db['frame']

    length = frame.numberOfLines 
    width = frame.numberOfSamples

    slc = isceobj.createSlcImage()
    slc.setWidth(width)
    slc.setLength(length)
    slc.filename = slcFile
    slc.setAccessMode('write')
    slc.renderHdr()
    slc.renderVRT()