Деформация GDAL с векторами сдвига - PullRequest
0 голосов
/ 03 апреля 2019

Есть ли способ деформировать изображение, используя векторы смещения с помощью GDAL (с Python API)?

Под векторами сдвига я имею в виду, например. Файл CSV (или пустой) со следующими столбцами: starting_x,starting_y,target_x,target_y. Изображение, например. файл Tiff (или GeoTiff).

Я не нашел ничего похожего на поддержку нескольких векторов сдвига в документации (https://www.gdal.org/gdalwarp.html, https://gdal.org/gdal_translate.html), но, возможно, кто-то знает, как это сделать.

EDIT

Я сгенерировал файл VRT с некоторыми примерами координат. Это команда, которую я использовал:

gdal_translate -gcp 100 100 200 200 -gcp 200 200 300 300 -gcp 500 500 600 600 -of VRT original.tif original.vrt

И это выходной файл:

<VRTDataset rasterXSize="16285" rasterYSize="8251">
  <Metadata>
    <MDI key="TIFFTAG_RESOLUTIONUNIT">1 (unitless)</MDI>
    <MDI key="TIFFTAG_XRESOLUTION">1</MDI>
    <MDI key="TIFFTAG_YRESOLUTION">1</MDI>
  </Metadata>
  <Metadata domain="IMAGE_STRUCTURE">
    <MDI key="INTERLEAVE">BAND</MDI>
  </Metadata>
  <GCPList>
    <GCP Id="" Pixel="100.0000" Line="100.0000" X="2.000000000000E+02" Y="2.000000000000E+02" />
    <GCP Id="" Pixel="200.0000" Line="200.0000" X="3.000000000000E+02" Y="3.000000000000E+02" />
    <GCP Id="" Pixel="500.0000" Line="500.0000" X="6.000000000000E+02" Y="6.000000000000E+02" />
  </GCPList>
  <VRTRasterBand dataType="Byte" band="1">
    <Metadata domain="IMAGE_STRUCTURE">
      <MDI key="NBITS">1</MDI>
    </Metadata>
    <Metadata>
      <MDI key="STATISTICS_MAXIMUM">1</MDI>
      <MDI key="STATISTICS_MEAN">0.074397271632616</MDI>
      <MDI key="STATISTICS_MINIMUM">0</MDI>
      <MDI key="STATISTICS_STDDEV">0.26241630590769</MDI>
    </Metadata>
    <ColorInterp>Palette</ColorInterp>
    <ColorTable>
      <Entry c1="255" c2="255" c3="255" c4="255" />
      <Entry c1="0" c2="0" c3="0" c4="255" />
    </ColorTable>
    <SimpleSource>
      <SourceFilename relativeToVRT="1">original.tif</SourceFilename>
      <SourceBand>1</SourceBand>
      <SourceProperties RasterXSize="16285" RasterYSize="8251" DataType="Byte" BlockXSize="16285" BlockYSize="4" />
      <SrcRect xOff="0" yOff="0" xSize="16285" ySize="8251" />
      <DstRect xOff="0" yOff="0" xSize="16285" ySize="8251" />
    </SimpleSource>
  </VRTRasterBand>
</VRTDataset>

Теперь я попытался использовать это как ввод для деформации:

import gdal

InputImage = 'original.vrt'
OutTileName = 'warped.tif'
OutTile = gdal.Warp(OutTileName, InputImage, options=gdal.WarpOptions(tps=True))
OutTile = None

Он не ломается, но в результате я получаю точно такое же изображение - как будто оно вообще не было искажено. Другое дело, что размер входного изображения составляет 16 МБ, а размер результирующего изображения - 140 МБ. Что я делаю не так?

1 Ответ

1 голос
/ 04 апреля 2019

Вы можете назначить gpc указание сдвига с помощью gdal_translate -gcp x1 y1 x2 x2 для вашего файла. Запись выходных данных в файл VRT позволяет увидеть формат, поэтому в случае, если у вас есть безумное количество gcp, может быть проще сгенерировать VRT из некоторого шаблона, вместо использования командной строки.

После назначения gcp вы можете использовать gdalwarp, чтобы «применить» преобразование. Если во входном файле уже указана проекция, вам может потребоваться добавить флаг -tps, чтобы принудительно использовать gcp вместо проекции. Я не уверен насчет последней части.

...