使用Python将重叠的栅格图层按最小值合并

3

我想要组合一些单波段的栅格图像。希望处理重叠部分时选择像素中最小的值。

所有图像都具有相同的投影。

我尝试使用gdalwarp和gdal_merge (在命令行中),但它们只使用最后一张图像的值来处理重叠部分。

我还看到有建议使用PIL blend或paste,但这些需要一个alpha层,指示重叠部分应该如何混合,而我没有这个东西。

有人知道如何使重叠部分取决于图像中实际的值吗?

1个回答

1
据我所知,使用标准命令行工具无法实现此操作。您可以尝试使用通常随 GDAL 一起提供的 'gdal_calc.py',但这要求栅格具有相同的尺寸,因此可能需要进行一些预处理(例如使用 gdalwarp)。可以使用以下方式计算两个栅格的最小值:
python gdal_calc.py -A file1.tif -B file2.tif --calc="minimum(A,B)" --outfile=res.tif

我不确定在没有重叠区域的情况下会发生什么,也许需要添加nodata关键字,更多信息请参见: http://www.gdal.org/gdal_calc.html

您必须指定gdal_calc.py的完整路径。

对于未来的版本:

从GDAL 2.2开始,支持使用Python编写的VRT像素函数:

http://www.gdal.org/gdal_vrttut.html#gdal_vrttut_derived_python

您可以制作一个类似下面这样的VRT:
<VRTDataset rasterXSize="20" rasterYSize="20">
  <SRS>EPSG:26711</SRS>
  <GeoTransform>440720,60,0,3751320,0,-60</GeoTransform>
  <VRTRasterBand dataType="Byte" band="1" subClass="VRTDerivedRasterBand">
    <PixelFunctionType>add</PixelFunctionType>
    <PixelFunctionLanguage>Python</PixelFunctionLanguage>
    <PixelFunctionCode><![CDATA[
import numpy as np
def add(in_ar, out_ar, xoff, yoff, xsize, ysize, raster_xsize,
                   raster_ysize, buf_radius, gt, **kwargs):
    np.round_(np.clip(np.minimum(in_ar, axis = 0, dtype = 'uint16'),0,255),
              out = out_ar)
]]>
    </PixelFunctionCode>
    <SimpleSource>
      <SourceFilename relativeToVRT="1">byte.tif</SourceFilename>
    </SimpleSource>
    <SimpleSource>
      <SourceFilename relativeToVRT="1">byte2.tif</SourceFilename>
    </SimpleSource>
  </VRTRasterBand>
</VRTDataset>

从GDAL 2.2开始,将内置像素函数,这是一个很好的想法。我还没有看到最小值、最大值、平均数等聚合函数,但一旦基础设施到位,添加这些功能应该很容易。

http://www.gdal.org/gdal_vrttut.html#gdal_vrttut_derived_c

对于超过两个参数的最小值,可以这样做: minimum(minimum(A,B),C) - alphabetasoup

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接