¿ComputeBandStats tiene en cuenta el nodata?

Estoy tratando de calcular las estadísticas de una imagen que solo está parcialmente cubierta por datos. Me gustaría saber si ComputeBandStats ignora los píxeles con el mismo valor que los archivos nodata.

Aquí está mi código:

inIMG = gdal.Open(infile) # getting stats for the first 3 bands # Using ComputeBandStats insted of stats array has min, max, mean and sd values print "Computing band statistics" bandas = [inIMG.GetRasterBand(b+1) for b in range(3)] minMax = [b.ComputeRasterMinMax() for b in bandas] meanSD = [b.ComputeBandStats(1) for b in bandas] print minMax print meanSD 

Para la imagen sin el atributo nodata la salida es:

 Computing band statistics [(0.0, 26046.0), (0.0, 24439.0), (0.0, 22856.0)] [(762.9534697777777, 647.9056493556284), (767.642869, 516.0531530834181), (818.0449643333334, 511.5360132592902)] 

Para la imagen con nodata = 0 la salida es:

 Computing band statistics [(121.0, 26046.0), (202.0, 24439.0), (79.0, 22856.0)] [(762.9534697777777, 647.9056493556284), (767.642869, 516.0531530834181), (818.0449643333334, 511.5360132592902)] 

Los valores mínimo y máximo han cambiado, de modo que 0 ya no es mínimo, lo que tiene sentido, porque en la segunda versión es nodata y, por lo tanto, ComputeRasterMinMax () no lo considera. Sin embargo, la media y la desviación estándar no ha cambiado.

¿Significa esto que ComputeBandStats no ignora los valores de nodata?
¿Hay alguna forma de forzar a ComputeBandStats a ignorar los valores de nodata?

Establecer el valor NoData no tiene ningún efecto en los datos en sí. Puedes intentarlo de esta manera:

 # First image, all valid data data = numpy.random.randint(1,10,(10,10)) driver = gdal.GetDriverByName('GTIFF') ds = driver.Create("stats1.tif", 10, 10, 1, gdal.GDT_Byte) ds.GetRasterBand(1).WriteArray(data) print ds.GetRasterBand(1).ComputeBandStats(1) print ds.GetRasterBand(1).ComputeStatistics(False) ds = None # Second image, values of "1" set to no data driver = gdal.GetDriverByName('GTIFF') ds = driver.Create("stats2.tif", 10, 10, 1, gdal.GDT_Byte) ds.GetRasterBand(1).SetNoDataValue(1) ds.GetRasterBand(1).WriteArray(data) print ds.GetRasterBand(1).ComputeBandStats(1) print ds.GetRasterBand(1).ComputeStatistics(False) ds = None 

Tenga en cuenta que las estadísticas que devuelve ComputeBandStats se modifican, pero que las ComputeStatistics devueltas por ComputeStatistics son:

 >>> (4.97, 2.451346568725035) >>> [1.0, 9.0, 4.970000000000001, 2.4513465687250346] >>> (4.97, 2.451346568725035) >>> [2.0, 9.0, 5.411111111111111, 2.1750833672117] 

Puedes confirmar manualmente que las estadísticas son correctas:

 numpy.mean(data) numpy.mean(data[data != 1]) numpy.std(data) numpy.std(data[data != 1]) >>> 4.9699999999999998 >>> 5.4111111111111114 >>> 2.4513465687250346 >>> 2.1750833672117