2016-06-16 18 views
2

データで部分的にしかカバーされていない画像の統計情報を計算しようとしています。 ComputeBandStatsがファイルnodataと同じ値を持つピクセルを無視するかどうかを知りたいと思います。ここで ComputeBandStatsはnodataを考慮に入れていますか?

が私のコードです:

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 

NODATAない画像の属性出力は次のとおりです。NODATAを持つ画像に対して

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

= 0出力は、次のとおりです。

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

最小値と最大値が変更され、0はもはや最小値になりません。これは意味があります。それはnodataであり、したがってComputeRasterMinMax()によって考慮されない。しかし、平均および標準偏差は変化していない。

これは、ComputeBandStatsがnodata値を無視しないことを意味しますか?
ComputeBandStatsに強制的にnodata値を無視させる方法はありますか?

答えて

1

NoData値を設定しても、データ自体には影響しません。あなたはこの方法でそれを試すことができます。

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

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

あなたは統計情報が正しいことを手動で確認することができます:ComputeBandStatsによって返された統計情報は変更されませんが、ComputeStatisticsによって返されたものであることがあること

# 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 

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

ありがとう、それは私が必要としたものです! ComputeStatisticsのパラメータをFalseに設定します。パラメータが何であるか知っていますか、それを調べることができるドキュメントはありますか? –

+0

私は通常、元のドキュメントを見てPythonのバインディングを理解することができます:http://www.gdal.org/classGDALRasterBand.html#a48883c1dae195b21b37b51b10e910f9bパラメータは 'bApproxOK'です。 'True'の場合、統計はファイルの概要または部分集合から計算され、' False'の場合はすべてのデータの実際のデータ値を使用して計算されます。 – Benjamin

関連する問題