Объединение перекрывающихся растров по минимальному значению в python

Я хотел бы объединить некоторые 1-полосные растровые изображения. Я бы хотел, чтобы перекрытие обрабатывалось так, чтобы было выбрано наименьшее значение в пикселе. Все изображения имеют одинаковую проекцию.

Я попытался посмотреть на gdalwarp и gdal_merge (в командной строке), но в перекрытии они просто используют значения из последнего изображения.

Я также видел предложения использовать смесь PIL или пасту, но для этого требуется альфа-слой, который указывает, как следует смешивать перекрытия, чего, конечно, у меня нет.

Есть ли кто-нибудь, кто знает, как сделать перекрытие зависимым от фактических значений на изображениях?

1 ответ

Насколько я знаю, нет способа сделать это с помощью стандартных утилит командной строки. Вы попробуйте 'gdal_calc.py', который обычно поставляется с GDAL, для этого требуется, чтобы растр имел одинаковые размеры, поэтому, возможно, потребуется некоторая предварительная обработка (например, с 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, есть поддержка функций VRT Pixel, написанных на Python:

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

После этого вы сможете сделать 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, будут встроены функции пикселей, что является отличной идеей. Я пока не вижу агрегации, такие как min, max, означает, но это, вероятно, будет легко добавить, когда инфраструктура будет там. http://www.gdal.org/gdal_vrttut.html

Другие вопросы по тегам