2016-06-16 10 views
2

Ich versuche die Statistiken für ein Bild zu berechnen, das nur teilweise von Daten bedeckt ist. Ich würde gerne wissen, ob ComputeBandStats die Pixel mit dem gleichen Wert wie die Dateien nodata ignoriert.Berücksichtigt ComputeBandStats nodata?

Hier ist mein Code:

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 

Für das Bild ohne das nodata Attribut der Ausgang ist:

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

Für das Bild mit nodata = 0 ist der Ausgang:

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

Die Min- und Max-Werte haben sich so geändert, dass 0 nicht mehr min ist, was sinnvoll ist, weil in der zweiten ve rsion es ist nodata und daher nicht von ComputeRasterMinMax() betrachtet. Der Mittelwert und die Standardabweichung haben sich jedoch nicht geändert.

Bedeutet dies, dass ComputeBandStats die Nodata-Werte nicht ignoriert?
Gibt es eine Möglichkeit, ComputeBandStats zu zwingen, die Nodata-Werte zu ignorieren?

Antwort

1

Das Festlegen des NoData-Werts hat keine Auswirkungen auf die Daten selbst. Sie können es auf diese Weise versuchen:

# 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 

Hinweis, dass die von ComputeBandStats zurück Statistiken unverändert sind, sondern dass die von ComputeStatistics zurückgekehrt sind:

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

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

Sie manuell bestätigen können, dass die Statistiken korrekt sind:

numpy.mean(data) 
numpy.mean(data[data != 1]) 
numpy.std(data) 
numpy.std(data[data != 1]) 

>>> 4.9699999999999998 
>>> 5.4111111111111114 
>>> 2.4513465687250346 
>>> 2.1750833672117 
+0

Danke, das ist genau das, was ich brauchte! Sie legen den Parameter für ComputeStatistics auf False fest. Weißt du, was der Parameter ist, und gibt es eine Dokumentation, wo ich es nachschlagen kann? –

+0

Ich finde, dass ich in der Regel die Python-Bindungen herausfinden kann, indem ich mir die Originaldokumente anschaue: http://www.gdal.org/classGDALRasterBand.html#a48883c1dae195b21b37b51b10e910f9b. Der Parameter ist 'bApproxOK'; wenn "True", werden die Statistiken aus den Übersichten oder einer Teilmenge der Datei berechnet, wenn sie "False" sind, werden sie unter Verwendung aller tatsächlichen Datenwerte der Daten berechnet. – Benjamin

Verwandte Themen