将GeoTIFF图像划分为常规网格并计算平均值

时间:2013-12-03 11:55:05

标签: python numpy matplotlib scipy gdal

如何将GeoTIFF(单波段)图像(例如,1000 x 1000像素)子集化为常规方形网格(例如,50 x 50像素;总共400个网格对象);并计算每个对象的平均纬度,平均经度和平均DN值?任何想法都将受到高度赞赏。

输入数据只是图像,例如从以下位置下载: http://eoimages.gsfc.nasa.gov/images/imagerecords/57000/57752/land_shallow_topo_2048.tif

这可以使用gdal打开到python中,如下所示:

import gdal
geotiff = gdal.Open ('land_shallow_topo_2048.tif')
colum_numbers,row_numbers,band_numbers=geotiff.RasterXSize,geotiff.RasterYSize,geotiff.RasterCount
print (colum_numbers,row_numbers,band_numbers)
2048 1024 3

2 个答案:

答案 0 :(得分:3)

有一个Numpy重塑技巧来做到这一点。您可以将原始2D阵列重新整形为4D阵列,其中所有位于单个50 * 50网格中的单元格将放入两个唯一维度。在这些轴上调用任何函数将为您提供聚合结果。

让我们制作一个样本2D数组:

n = 1000
grid_size = 20

grid = np.arange(n*n).reshape(n,n)

然后计算聚合因子和两个维度中的网格数量:

factor = n / grid_size
yblocks, xblocks = np.array(grid.shape) / factor

然后,您可以将原始grid数组重新整形为4维,并在第二维和第四维上应用mean

grid_small = grid.reshape(yblocks, factor, xblocks, factor).mean(axis=3).mean(axis=1)

您可以通过自己切割一些网格并在其上应用平均值来测试它:

assert(grid[:factor,:factor].mean() == grid_small[0,0])
assert(grid[-factor:,-factor:].mean() == grid_small[-1,-1])

结果和差异可视化: enter image description here

答案 1 :(得分:1)

快速便捷的方法是生成整体图像(AKA求和区域表)。然后,您可以使用四个查找计算任何矩形块中的均值。

如果你在问题中提供更多细节(例如,你的数据格式是什么样的Python代码?)我可以提供更具体的建议。

http://en.wikipedia.org/wiki/Summed_area_table

相关问题