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)
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 )
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)
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) )
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)
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)