Ejemplo n.º 1
0
def enl(image, scale=10):
    #  construct the determinant image
    detmap = {
        'k': image.select(0),
        'ar': image.select(1),
        'ai': image.select(2),
        'pr': image.select(3),
        'pi': image.select(4),
        's': image.select(5),
        'br': image.select(6),
        'bi': image.select(7),
        'z': image.select(8)
    }
    expr = 'k*s*z+2*(ar*br*pr-ai*bi*pr+ai*br*pi+ar*bi*pi)-s*(pr*pr+pi*pi)-k*(br*br+bi*bi)-s*(ar*ar+ai*ai)'
    bands = image.bandNames().length()
    result = ee.Image(ee.Algorithms.If(bands.lte(3), image.select(0), None))
    result = ee.Image(
        ee.Algorithms.If(bands.eq(4),
                         image.expression('b(0)*b(3)-b(1)*b(1)-b(2)*b(2)'),
                         result))
    detimg = ee.Image(
        ee.Algorithms.If(bands.eq(9), image.expression(expr, detmap), result))
    #  7x7 window average of log of determinant image
    avlogdetimg = detimg.log().reduceNeighborhood(ee.Reducer.mean(),
                                                  ee.Kernel.square(3.5),
                                                  optimization='window')
    #  log of 7x7 wíndow average of the determinant image
    logavdetimg = detimg.reduceNeighborhood(ee.Reducer.mean(),
                                            ee.Kernel.square(3.5),
                                            optimization='window').log()
    #  add the lookuptable as 500 bands
    bands = bands.getInfo()
    if bands == 9:
        d = 2
    elif bands == 4:
        d = 1
    else:
        d = 0
    lu = lookup.table()
    diff = avlogdetimg.subtract(logavdetimg)
    arrimg = diff.add(ee.Image.constant(list(lu[:500, d])))
    #  shift and multiply to locate zero crossings
    arrimg1 = diff.add(ee.Image.constant(list(np.roll(lu[:500, d], 1))))
    arrimg = arrimg.multiply(arrimg1)
    #  accumulate enl histogram
    first = ee.Dictionary({
        'arrimg': arrimg,
        'scale': scale,
        'enlhist': ee.List(list(np.zeros(500)))
    })
    lst = ee.List(list(range(500)))
    result = ee.List(
        ee.Dictionary(lst.iterate(enl_iter, first)).get('enlhist'))
    idx = 10 + d * 10
    return result.set(idx, 0).set(0, 0)
Ejemplo n.º 2
0
def enl(infile,dims=None,outfile='enl.tif',fileout=False,xrange=50,sfn=None):    
    try:
        gdal.AllRegister()         
        inDataset = gdal.Open(infile,GA_ReadOnly)     
        cols = inDataset.RasterXSize
        rows = inDataset.RasterYSize    
        bands = inDataset.RasterCount
        if dims == None:
            dims = [0,0,cols,rows]
        x0,y0,cols,rows = dims        
        print( '=========================' )
        print( '     ENL Estimation' )
        print( '=========================' )
        print( time.asctime() )
        print( 'infile:  %s'%infile )   
        if bands == 9:
            print( 'Quad polarimetry' )  
    #      T11 (k)
            band = inDataset.GetRasterBand(1)
            k = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
    #      T12  (a)
            band = inDataset.GetRasterBand(2)
            a = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
            band = inDataset.GetRasterBand(3)    
            im = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
            a = a + 1j*im
    #      T13  (rho)
            band = inDataset.GetRasterBand(4)
            rho = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
            band = inDataset.GetRasterBand(5)
            im = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
            rho = rho + 1j*im     
    #      T22 (xsi)
            band = inDataset.GetRasterBand(6)
            xsi = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()    
    #      T23 (b)        
            band = inDataset.GetRasterBand(7)
            b = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
            band = inDataset.GetRasterBand(8)
            im = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
            b = b + 1j*im     
    #      T33 (zeta)
            band = inDataset.GetRasterBand(9)
            zeta = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()                
            det = k*xsi*zeta + 2*np.real(a*b*np.conj(rho)) - xsi*(abs(rho)**2) - k*(abs(b)**2) - zeta*(abs(a)**2)
            d = 2
        elif bands == 4:
            print( 'Dual polarimetry' )  
    #      C11 (k)
            band = inDataset.GetRasterBand(1)
            k = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
    #      C12  (a)
            band = inDataset.GetRasterBand(2)
            a = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
            band = inDataset.GetRasterBand(3)
            im = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
            a = a + 1j*im       
    #      C22 (xsi)
            band = inDataset.GetRasterBand(4)
            xsi = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel() 
            det = k*xsi - abs(a)**2   
            d = 1   
        elif bands <= 3:
            print( 'Diagonal-only polarimetry, using first band' )         
    #      C11 (k)
            band = inDataset.GetRasterBand(1)
            k = band.ReadAsArray(x0,y0,cols,rows).ravel() 
            det = k
            d = 0      
        enl_ml = np.zeros((rows,cols), dtype= np.float32)
        lu = lookup.table()
        print( 'filtering...' )
        print( 'row: ',end='' )   
        start = time.time()
        for i in range(3,rows-3):
            if i%100 == 0:
                print( '%i '%i,end='' ) 
            windex = get_windex(i,cols)  
            for j in range(3,cols-3):  
                detC = det[windex]
                if np.min(detC) > 0.0:
                    avlogdetC = np.sum(np.log(detC))/49
                    if bands == 9:
                        k1 = np.sum(k[windex])/49
                        a1 = np.sum(a[windex])/49
                        rho1 = np.sum(rho[windex])/49
                        xsi1 = np.sum(xsi[windex])/49
                        b1 = np.sum(b[windex])/49
                        zeta1 = np.sum(zeta[windex])/49                       
                        detavC = k1*xsi1*zeta1 + 2*np.real(a1*b1*np.conj(rho1)) - xsi1*(np.abs(rho1)**2) - k1*(np.abs(b1)**2) - zeta1*(np.abs(a1)**2)
                    elif bands == 4:
                        k1 = np.sum(k[windex])/49
                        xsi1 = np.sum(xsi[windex])/49
                        a1 = np.sum(a[windex])/49   
                        detavC =  k1*xsi1 - np.abs(a1)**2
                    else:
                        detavC = np.sum(k[windex])/49
                    logdetavC = np.log(detavC)    
                    arr =  avlogdetC - logdetavC + lu[:,d]    
                    ell = np.where(arr*np.roll(arr,1)<0)[0]
                    if len(ell)>0:
                        enl_ml[i,j] = float(ell[-1])/10.0
                windex += 1
        if fileout:
            driver = inDataset.GetDriver()   
            outDataset = driver.Create(outfile,cols,rows,1,GDT_Float32)
            projection = inDataset.GetProjection()
            geotransform = inDataset.GetGeoTransform()
            if geotransform is not None:
                gt = list(geotransform)
                gt[0] = gt[0] + x0*gt[1]
                gt[3] = gt[3] + y0*gt[5]
                outDataset.SetGeoTransform(tuple(gt))
            if projection is not None:
                outDataset.SetProjection(projection)          
            outBand = outDataset.GetRasterBand(1)
            outBand.WriteArray(enl_ml,0,0) 
            outBand.FlushCache() 
            outDataset = None   
            print( '\nENL image written to: %s'%outfile )  
        ya,xa = np.histogram(enl_ml,bins=1000)
        ya[0:20] = 0.0
        print( '\nMode: %f'%xa[np.argmax(ya)] )       
        plt.plot(xa[1:-1],ya[1:])
        plt.title('Histogram ENL for %s'%infile)
        plt.xlim([0,xrange])
        plt.grid()  
        if sfn is not None:
            plt.savefig(sfn,bbox_inches='tight')  
            print('\nPlot saved to %s\n'%sfn) 
        plt.show()                     
        print( 'elapsed time: '+str(time.time()-start) )   
        return True
    except Exception as e:
        print( 'error in enlml: %s'%e ) 
Ejemplo n.º 3
0
def main():
    gdal.AllRegister()
    path = auxil.select_directory('Choose working directory')
    if path:
        os.chdir(path)
#  SAR image
    infile = auxil.select_infile(title='Choose SAR image')
    if infile:
        inDataset = gdal.Open(infile, GA_ReadOnly)
        cols = inDataset.RasterXSize
        rows = inDataset.RasterYSize
        bands = inDataset.RasterCount
    else:
        return


#  spatial subset
    x0, y0, rows, cols = auxil.select_dims([0, 0, rows, cols])
    #  output file
    outfile, fmt = auxil.select_outfilefmt()
    if not outfile:
        return
    print '========================='
    print '     ENL Estimation'
    print '========================='
    print time.asctime()
    print 'infile:  %s' % infile
    start = time.time()
    if bands == 9:
        print 'Quad polarimetry'
        #      C11 (k)
        band = inDataset.GetRasterBand(1)
        k = np.nan_to_num(band.ReadAsArray(x0, y0, cols, rows)).ravel()
        #      C12  (a)
        band = inDataset.GetRasterBand(2)
        a = np.nan_to_num(band.ReadAsArray(x0, y0, cols, rows)).ravel()
        band = inDataset.GetRasterBand(3)
        im = np.nan_to_num(band.ReadAsArray(x0, y0, cols, rows)).ravel()
        a = a + 1j * im
        #      C13  (rho)
        band = inDataset.GetRasterBand(4)
        rho = np.nan_to_num(band.ReadAsArray(x0, y0, cols, rows)).ravel()
        band = inDataset.GetRasterBand(5)
        im = np.nan_to_num(band.ReadAsArray(x0, y0, cols, rows)).ravel()
        rho = rho + 1j * im
        #      C22 (xsi)
        band = inDataset.GetRasterBand(6)
        xsi = np.nan_to_num(band.ReadAsArray(x0, y0, cols, rows)).ravel()
        #      C23 (b)
        band = inDataset.GetRasterBand(7)
        b = np.nan_to_num(band.ReadAsArray(x0, y0, cols, rows)).ravel()
        band = inDataset.GetRasterBand(8)
        im = np.nan_to_num(band.ReadAsArray(x0, y0, cols, rows)).ravel()
        b = b + 1j * im
        #      C33 (zeta)
        band = inDataset.GetRasterBand(9)
        zeta = np.nan_to_num(band.ReadAsArray(x0, y0, cols, rows)).ravel()
        det = k * xsi * zeta + 2 * np.real(a * b * np.conj(rho)) - xsi * (
            abs(rho)**2) - k * (abs(b)**2) - zeta * (abs(a)**2)
        d = 2
    elif bands == 4:
        print 'Dual polarimetry'
        #      C11 (k)
        band = inDataset.GetRasterBand(1)
        k = np.nan_to_num(band.ReadAsArray(x0, y0, cols, rows)).ravel()
        #      C12  (a)
        band = inDataset.GetRasterBand(2)
        a = np.nan_to_num(band.ReadAsArray(x0, y0, cols, rows)).ravel()
        band = inDataset.GetRasterBand(3)
        im = np.nan_to_num(band.ReadAsArray(x0, y0, cols, rows)).ravel()
        a = a + 1j * im
        #      C22 (xsi)
        band = inDataset.GetRasterBand(4)
        xsi = np.nan_to_num(band.ReadAsArray(x0, y0, cols, rows)).ravel()
        det = k * xsi - abs(a)**2
        d = 1
    elif bands == 1:
        print 'Single polarimetry'
        #      C11 (k)
        band = inDataset.GetRasterBand(1)
        k = band.ReadAsArray(x0, y0, cols, rows).ravel()
        det = k
        d = 0
    enl_ml = np.zeros((rows, cols), dtype=np.float32)
    lu = lookup.table()
    print 'filtering...'
    print 'row: ',
    sys.stdout.flush()
    start = time.time()
    for i in range(3, rows - 3):
        if i % 50 == 0:
            print '%i ' % i,
            sys.stdout.flush()
        windex = get_windex(i, cols)
        for j in range(3, cols - 3):
            detC = det[windex]
            if np.min(detC) > 0.0:
                avlogdetC = np.sum(np.log(detC)) / 49
                if bands == 9:
                    k1 = np.sum(k[windex]) / 49
                    a1 = np.sum(a[windex]) / 49
                    rho1 = np.sum(rho[windex]) / 49
                    xsi1 = np.sum(xsi[windex]) / 49
                    b1 = np.sum(b[windex]) / 49
                    zeta1 = np.sum(zeta[windex]) / 49
                    detavC = k1 * xsi1 * zeta1 + 2 * np.real(
                        a1 * b1 * np.conj(rho1)) - xsi1 * (
                            np.abs(rho1)**
                            2) - k1 * (np.abs(b1)**2) - zeta1 * (np.abs(a1)**2)
                elif bands == 4:
                    k1 = np.sum(k[windex]) / 49
                    xsi1 = np.sum(xsi[windex]) / 49
                    a1 = np.sum(a[windex]) / 49
                    detavC = k1 * xsi1 - np.abs(a1)**2
                else:
                    detavC = np.sum(k[windex]) / 49
                logdetavC = np.log(detavC)
                arr = avlogdetC - logdetavC + lu[:, d]
                ell = np.where(arr * np.roll(arr, 1) < 0)[0]
                if ell != []:
                    enl_ml[i, j] = float(ell[-1]) / 10.0
            windex += 1
    driver = gdal.GetDriverByName(fmt)
    outDataset = driver.Create(outfile, cols, rows, 1, GDT_Float32)
    projection = inDataset.GetProjection()
    geotransform = inDataset.GetGeoTransform()
    if geotransform is not None:
        gt = list(geotransform)
        gt[0] = gt[0] + x0 * gt[1]
        gt[3] = gt[3] + y0 * gt[5]
        outDataset.SetGeoTransform(tuple(gt))
    if projection is not None:
        outDataset.SetProjection(projection)
    outBand = outDataset.GetRasterBand(1)
    outBand.WriteArray(enl_ml, 0, 0)
    outBand.FlushCache()
    outDataset = None
    ya, xa = np.histogram(enl_ml, bins=50)
    ya[0] = 0
    plt.plot(xa[0:-1], ya)
    plt.show()
    print ''
    print 'ENL image written to: %s' % outfile
    print 'elapsed time: ' + str(time.time() - start)
Ejemplo n.º 4
0
def main():
    usage = '''
Usage:
------------------------------------------------

Calculate the equivalent number of looks for 
a polarimetric matrix image

python %s [OPTIONS] filename

Options:

   -h    this help
   -n    suppress graphics output
   -d    spatial subset list e.g. -d [0,0,400,400]

An ENL image will be written to the same directory with '_enl' appended.

------------------------------------------------''' %sys.argv[0]
    options,args = getopt.getopt(sys.argv[1:],'hnd:')
    dims = None
    graphics = True
    for option, value in options: 
        if option == '-h':
            print( usage )
            return 
        elif option == '-d':
            dims = eval(value)  
        elif option == '-n':
            graphics = False       
    if len(args) != 1:
        print( 'Incorrect number of arguments' )
        print( usage )
        sys.exit(1)        
    infile = args[0]
    path = os.path.dirname(infile)    
    basename = os.path.basename(infile)
    root, ext = os.path.splitext(basename)
    outfile = path + '/' + root + '_enl' + ext  
    
    gdal.AllRegister()         
    inDataset = gdal.Open(infile,GA_ReadOnly)     
    cols = inDataset.RasterXSize
    rows = inDataset.RasterYSize    
    bands = inDataset.RasterCount
    if dims == None:
        dims = [0,0,cols,rows]
    x0,y0,cols,rows = dims        
    print( '=========================' )
    print( '     ENL Estimation' )
    print( '=========================' )
    print( time.asctime() )
    print( 'infile:  %s'%infile )   
    if bands == 9:
        print( 'Quad polarimetry' )  
#      T11 (k)
        band = inDataset.GetRasterBand(1)
        k = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
#      T12  (a)
        band = inDataset.GetRasterBand(2)
        a = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
        band = inDataset.GetRasterBand(3)    
        im = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
        a = a + 1j*im
#      T13  (rho)
        band = inDataset.GetRasterBand(4)
        rho = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
        band = inDataset.GetRasterBand(5)
        im = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
        rho = rho + 1j*im     
#      T22 (xsi)
        band = inDataset.GetRasterBand(6)
        xsi = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()    
#      T23 (b)        
        band = inDataset.GetRasterBand(7)
        b = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
        band = inDataset.GetRasterBand(8)
        im = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
        b = b + 1j*im     
#      T33 (zeta)
        band = inDataset.GetRasterBand(9)
        zeta = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()                
        det = k*xsi*zeta + 2*np.real(a*b*np.conj(rho)) - xsi*(abs(rho)**2) - k*(abs(b)**2) - zeta*(abs(a)**2)
        d = 2
    elif bands == 4:
        print( 'Dual polarimetry' )  
#      C11 (k)
        band = inDataset.GetRasterBand(1)
        k = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
#      C12  (a)
        band = inDataset.GetRasterBand(2)
        a = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
        band = inDataset.GetRasterBand(3)
        im = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
        a = a + 1j*im       
#      C22 (xsi)
        band = inDataset.GetRasterBand(4)
        xsi = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel() 
        det = k*xsi - abs(a)**2   
        d = 1   
    elif bands <= 3:
        print( 'Diagonal-only polarimetry' )         
#      C11 (k)
        band = inDataset.GetRasterBand(1)
        k = band.ReadAsArray(x0,y0,cols,rows).ravel() 
        det = k
        d = 0      
    enl_ml = np.zeros((rows,cols), dtype= np.float32)
    lu = lookup.table()
    print( 'filtering...' )
    print( 'row: ', )
    sys.stdout.flush()    
    start = time.time()
    for i in range(3,rows-3):
        if i%100 == 0:
            print( '%i '%i, ) 
            sys.stdout.flush()
        windex = get_windex(i,cols)  
        for j in range(3,cols-3):  
            detC = det[windex]
            if np.min(detC) > 0.0:
                avlogdetC = np.sum(np.log(detC))/49
                if bands == 9:
                    k1 = np.sum(k[windex])/49
                    a1 = np.sum(a[windex])/49
                    rho1 = np.sum(rho[windex])/49
                    xsi1 = np.sum(xsi[windex])/49
                    b1 = np.sum(b[windex])/49
                    zeta1 = np.sum(zeta[windex])/49
                    detavC = k1*xsi1*zeta1 + 2*np.real(a1*b1*np.conj(rho1)) - xsi1*(np.abs(rho1)**2) - k1*(np.abs(b1)**2) - zeta1*(np.abs(a1)**2)
                elif bands == 4:
                    k1 = np.sum(k[windex])/49
                    xsi1 = np.sum(xsi[windex])/49
                    a1 = np.sum(a[windex])/49   
                    detavC =  k1*xsi1 - np.abs(a1)**2
                else:
                    detavC = np.sum(k[windex])/49
                logdetavC = np.log(detavC)    
                arr =  avlogdetC - logdetavC + lu[:,d]    
                ell = np.where(arr*np.roll(arr,1)<0)[0]
                if len(ell) >0:
                    enl_ml[i,j] = float(ell[-1])/10.0
            windex += 1
    driver = inDataset.GetDriver()   
    outDataset = driver.Create(outfile,cols,rows,1,GDT_Float32)
    projection = inDataset.GetProjection()
    geotransform = inDataset.GetGeoTransform()
    if geotransform is not None:
        gt = list(geotransform)
        gt[0] = gt[0] + x0*gt[1]
        gt[3] = gt[3] + y0*gt[5]
        outDataset.SetGeoTransform(tuple(gt))
    if projection is not None:
        outDataset.SetProjection(projection)          
    outBand = outDataset.GetRasterBand(1)
    outBand.WriteArray(enl_ml,0,0) 
    outBand.FlushCache() 
    outDataset = None   
    ya,xa = np.histogram(enl_ml,bins=500)
    ya[0] = 0    
    if graphics:
        plt.plot(xa[0:-1],ya)
        plt.title('Histogram ENL for %s'%infile)
        plt.show()       
    print( 'ENL image written to: %s'%outfile )             
    print( 'elapsed time: '+str(time.time()-start) )                    
Ejemplo n.º 5
0
def main():
    usage = '''
Usage:
------------------------------------------------

Calculate the equivalent number of looks for 
a polarimetric matrix image

python %s [OPTIONS] filename

Options:

   -h    this help
   -n    suppress graphics output
   -d    spatial subset list e.g. -d [0,0,400,400]

An ENL image will be written to the same directory with '_enl' appended.

------------------------------------------------''' %sys.argv[0]
    options,args = getopt.getopt(sys.argv[1:],'hnd:')
    dims = None
    graphics = True
    for option, value in options: 
        if option == '-h':
            print usage
            return 
        elif option == '-d':
            dims = eval(value)  
        elif option == '-n':
            graphics = False       
    if len(args) != 1:
        print 'Incorrect number of arguments'
        print usage
        sys.exit(1)        
    infile = args[0]
    path = os.path.abspath(infile)    
    dirn = os.path.dirname(path)
    basename = os.path.basename(infile)
    root, ext = os.path.splitext(basename)
    outfile = dirn + '/' + root + '_enl' + ext  
    
    gdal.AllRegister()         
    inDataset = gdal.Open(infile,GA_ReadOnly)     
    cols = inDataset.RasterXSize
    rows = inDataset.RasterYSize    
    bands = inDataset.RasterCount
    if dims == None:
        dims = [0,0,cols,rows]
    x0,y0,cols,rows = dims        
    print '========================='
    print '     ENL Estimation'
    print '========================='
    print time.asctime()
    print 'infile:  %s'%infile   
    if bands == 9:
        print 'Quad polarimetry'  
#      T11 (k)
        band = inDataset.GetRasterBand(1)
        k = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
#      T12  (a)
        band = inDataset.GetRasterBand(2)
        a = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
        band = inDataset.GetRasterBand(3)    
        im = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
        a = a + 1j*im
#      T13  (rho)
        band = inDataset.GetRasterBand(4)
        rho = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
        band = inDataset.GetRasterBand(5)
        im = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
        rho = rho + 1j*im     
#      T22 (xsi)
        band = inDataset.GetRasterBand(6)
        xsi = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()    
#      T23 (b)        
        band = inDataset.GetRasterBand(7)
        b = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
        band = inDataset.GetRasterBand(8)
        im = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
        b = b + 1j*im     
#      T33 (zeta)
        band = inDataset.GetRasterBand(9)
        zeta = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()                
        det = k*xsi*zeta + 2*np.real(a*b*np.conj(rho)) - xsi*(abs(rho)**2) - k*(abs(b)**2) - zeta*(abs(a)**2)
        d = 2
    elif bands == 4:
        print 'Dual polarimetry'  
#      C11 (k)
        band = inDataset.GetRasterBand(1)
        k = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
#      C12  (a)
        band = inDataset.GetRasterBand(2)
        a = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
        band = inDataset.GetRasterBand(3)
        im = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
        a = a + 1j*im       
#      C22 (xsi)
        band = inDataset.GetRasterBand(4)
        xsi = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel() 
        det = k*xsi - abs(a)**2   
        d = 1   
    elif bands == 1:
        print 'Single polarimetry'         
#      C11 (k)
        band = inDataset.GetRasterBand(1)
        k = band.ReadAsArray(x0,y0,cols,rows).ravel() 
        det = k
        d = 0      
    enl_ml = np.zeros((rows,cols), dtype= np.float32)
    lu = lookup.table()
    print 'filtering...'
    print 'row: ',
    sys.stdout.flush()    
    start = time.time()
    for i in range(3,rows-3):
        if i%100 == 0:
            print '%i '%i, 
            sys.stdout.flush()
        windex = get_windex(i,cols)  
        for j in range(3,cols-3):  
            detC = det[windex]
            if np.min(detC) > 0.0:
                avlogdetC = np.sum(np.log(detC))/49
                if bands == 9:
                    k1 = np.sum(k[windex])/49
                    a1 = np.sum(a[windex])/49
                    rho1 = np.sum(rho[windex])/49
                    xsi1 = np.sum(xsi[windex])/49
                    b1 = np.sum(b[windex])/49
                    zeta1 = np.sum(zeta[windex])/49
                    detavC = k1*xsi1*zeta1 + 2*np.real(a1*b1*np.conj(rho1)) - xsi1*(np.abs(rho1)**2) - k1*(np.abs(b1)**2) - zeta1*(np.abs(a1)**2)
                elif bands == 4:
                    k1 = np.sum(k[windex])/49
                    xsi1 = np.sum(xsi[windex])/49
                    a1 = np.sum(a[windex])/49   
                    detavC =  k1*xsi1 - np.abs(a1)**2
                else:
                    detavC = np.sum(k[windex])/49
                logdetavC = np.log(detavC)    
                arr =  avlogdetC - logdetavC + lu[:,d]    
                ell = np.where(arr*np.roll(arr,1)<0)[0]
                if ell != []:
                    enl_ml[i,j] = float(ell[-1])/10.0
            windex += 1
    driver = inDataset.GetDriver()   
    outDataset = driver.Create(outfile,cols,rows,1,GDT_Float32)
    projection = inDataset.GetProjection()
    geotransform = inDataset.GetGeoTransform()
    if geotransform is not None:
        gt = list(geotransform)
        gt[0] = gt[0] + x0*gt[1]
        gt[3] = gt[3] + y0*gt[5]
        outDataset.SetGeoTransform(tuple(gt))
    if projection is not None:
        outDataset.SetProjection(projection)          
    outBand = outDataset.GetRasterBand(1)
    outBand.WriteArray(enl_ml,0,0) 
    outBand.FlushCache() 
    outDataset = None   
    ya,xa = np.histogram(enl_ml,bins=500)
    ya[0] = 0    
    if graphics:
        plt.plot(xa[0:-1],ya)
        plt.title('Histogram ENL for %s'%infile)
        plt.show()       
    print 'ENL image written to: %s'%outfile             
    print 'elapsed time: '+str(time.time()-start)                    
Ejemplo n.º 6
0
def main():
    gdal.AllRegister()
    path = auxil.select_directory('Choose working directory')
    if path:
        os.chdir(path)        
#  SAR image    
    infile = auxil.select_infile(title='Choose SAR image') 
    if infile:                   
        inDataset = gdal.Open(infile,GA_ReadOnly)     
        cols = inDataset.RasterXSize
        rows = inDataset.RasterYSize    
        bands = inDataset.RasterCount
    else:
        return
#  spatial subset    
    x0,y0,rows,cols=auxil.select_dims([0,0,rows,cols])    
#  output file
    outfile,fmt = auxil.select_outfilefmt() 
    if not outfile:
        return       
    print '========================='
    print '     ENL Estimation'
    print '========================='
    print time.asctime()
    print 'infile:  %s'%infile   
    start = time.time()
    if bands == 9:
        print 'Quad polarimetry'  
#      C11 (k)
        band = inDataset.GetRasterBand(1)
        k = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
#      C12  (a)
        band = inDataset.GetRasterBand(2)
        a = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
        band = inDataset.GetRasterBand(3)    
        im = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
        a = a + 1j*im
#      C13  (rho)
        band = inDataset.GetRasterBand(4)
        rho = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
        band = inDataset.GetRasterBand(5)
        im = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
        rho = rho + 1j*im     
#      C22 (xsi)
        band = inDataset.GetRasterBand(6)
        xsi = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()    
#      C23 (b)        
        band = inDataset.GetRasterBand(7)
        b = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
        band = inDataset.GetRasterBand(8)
        im = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
        b = b + 1j*im     
#      C33 (zeta)
        band = inDataset.GetRasterBand(9)
        zeta = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()                
        det = k*xsi*zeta + 2*np.real(a*b*np.conj(rho)) - xsi*(abs(rho)**2) - k*(abs(b)**2) - zeta*(abs(a)**2)
        d = 2
    elif bands == 4:
        print 'Dual polarimetry'  
#      C11 (k)
        band = inDataset.GetRasterBand(1)
        k = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
#      C12  (a)
        band = inDataset.GetRasterBand(2)
        a = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
        band = inDataset.GetRasterBand(3)
        im = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel()
        a = a + 1j*im       
#      C22 (xsi)
        band = inDataset.GetRasterBand(4)
        xsi = np.nan_to_num(band.ReadAsArray(x0,y0,cols,rows)).ravel() 
        det = k*xsi - abs(a)**2   
        d = 1   
    elif bands == 1:
        print 'Single polarimetry'         
#      C11 (k)
        band = inDataset.GetRasterBand(1)
        k = band.ReadAsArray(x0,y0,cols,rows).ravel() 
        det = k
        d = 0      
    enl_ml = np.zeros((rows,cols), dtype= np.float32)
    lu = lookup.table()
    print 'filtering...'
    print 'row: ',
    sys.stdout.flush()    
    start = time.time()
    for i in range(3,rows-3):
        if i%50 == 0:
            print '%i '%i, 
            sys.stdout.flush()
        windex = get_windex(i,cols)  
        for j in range(3,cols-3):  
            detC = det[windex]
            if np.min(detC) > 0.0:
                avlogdetC = np.sum(np.log(detC))/49
                if bands == 9:
                    k1 = np.sum(k[windex])/49
                    a1 = np.sum(a[windex])/49
                    rho1 = np.sum(rho[windex])/49
                    xsi1 = np.sum(xsi[windex])/49
                    b1 = np.sum(b[windex])/49
                    zeta1 = np.sum(zeta[windex])/49
                    detavC = k1*xsi1*zeta1 + 2*np.real(a1*b1*np.conj(rho1)) - xsi1*(np.abs(rho1)**2) - k1*(np.abs(b1)**2) - zeta1*(np.abs(a1)**2)
                elif bands == 4:
                    k1 = np.sum(k[windex])/49
                    xsi1 = np.sum(xsi[windex])/49
                    a1 = np.sum(a[windex])/49   
                    detavC =  k1*xsi1 - np.abs(a1)**2
                else:
                    detavC = np.sum(k[windex])/49
                logdetavC = np.log(detavC)    
                arr =  avlogdetC - logdetavC + lu[:,d]    
                ell = np.where(arr*np.roll(arr,1)<0)[0]
                if ell != []:
                    enl_ml[i,j] = float(ell[-1])/10.0
            windex += 1
    driver = gdal.GetDriverByName(fmt)   
    outDataset = driver.Create(outfile,cols,rows,1,GDT_Float32)
    projection = inDataset.GetProjection()
    geotransform = inDataset.GetGeoTransform()
    if geotransform is not None:
        gt = list(geotransform)
        gt[0] = gt[0] + x0*gt[1]
        gt[3] = gt[3] + y0*gt[5]
        outDataset.SetGeoTransform(tuple(gt))
    if projection is not None:
        outDataset.SetProjection(projection)          
    outBand = outDataset.GetRasterBand(1)
    outBand.WriteArray(enl_ml,0,0) 
    outBand.FlushCache() 
    outDataset = None   
    ya,xa = np.histogram(enl_ml,bins=50)
    ya[0] = 0    
    plt.plot(xa[0:-1],ya)
    plt.show() 
    print ''        
    print 'ENL image written to: %s'%outfile                  
    print 'elapsed time: '+str(time.time()-start)