Могу ли я сохранить исчезающий альфа-слой при наложении мозаики на изображения с помощью gdal?

12

Я накладываю мозаику на некоторые изображения с помощью gdal и хотел бы улучшить конечный результат, используя постепенный / постепенный альфа-слой к краю каждого изображения, чтобы убрать острые края в середине мозаики. У меня проблема в том, что часть каждого отдельного изображения с постепенным альфа-слоем маскирует изображения под ним в конечной мозаике, а не является полупрозрачной, как показано ниже:

мозаика с постепенным альфа-слоем, маскирующим изображения

В идеале я хотел бы, чтобы одно изображение постепенно переходило в другое, используя эту постепенную прозрачность.

Шаги, которые я выполняю для создания мозаики, следующие:

Добавьте gcps к исходным изображениям, чтобы определить их местоположение и правильно их ориентировать (выполняется для каждого изображения по очереди):

gdal_translate -of GTiff -a_srs EPSG:4326 -a_srs EPSG:4326 -gcp 1616 0 -88.2728612066 40.5175787437 -gcp <etc., etc.> <original_image_with_gradual_alpha>.tif <image_with_gradual_alpha_and_gcps>.tif

Деформируйте изображения для новых геотифов, которые правильно ориентированы (выполняется для каждого изображения по очереди):

gdalwarp -s_srs EPSG:4326 -t_srs EPSG:4326 -dstnodata 0 <image_with_gradual_alpha_and_gcps>.tif <warped_geotiff_with_alpha>.tif

Объедините все деформированные изображения в одну мозаику:

gdalbuildvrt -srcnodata 0 mosaic.vrt <warped_geotiff_with_alpha_root>*.tif
gdal_translate mosaic.vrt mosaic.tif

Изображение, которое я связал, является mosaic.tif.

gdalinfo для примера входного файла:

Driver: GTiff/GeoTIFF
Files: dsc00562.tif
Size is 1616, 1080
Coordinate System is `'
Metadata:
  TIFFTAG_RESOLUTIONUNIT=2 (pixels/inch)
  TIFFTAG_XRESOLUTION=350
  TIFFTAG_YRESOLUTION=350
Image Structure Metadata:
  INTERLEAVE=PIXEL
Corner Coordinates:
Upper Left  (    0.0,    0.0)
Lower Left  (    0.0, 1080.0)
Upper Right ( 1616.0,    0.0)
Lower Right ( 1616.0, 1080.0)
Center      (  808.0,  540.0)
Band 1 Block=1616x1 Type=Byte, ColorInterp=Red
  Mask Flags: PER_DATASET ALPHA 
Band 2 Block=1616x1 Type=Byte, ColorInterp=Green
  Mask Flags: PER_DATASET ALPHA 
Band 3 Block=1616x1 Type=Byte, ColorInterp=Blue
  Mask Flags: PER_DATASET ALPHA 
Band 4 Block=1616x1 Type=Byte, ColorInterp=Alpha

gdalinfo для деформированного геотифа с постепенным альфа-слоем:

Driver: GTiff/GeoTIFF
Files: geo_dsc00603.tif
Size is 1944, 1356
Coordinate System is:
GEOGCS["WGS 84",
    DATUM["WGS_1984",
        SPHEROID["WGS 84",6378137,298.257223563,
            AUTHORITY["EPSG","7030"]],
        AUTHORITY["EPSG","6326"]],
    PRIMEM["Greenwich",0],
    UNIT["degree",0.0174532925199433],
    AUTHORITY["EPSG","4326"]]
Origin = (-88.275727919349990,40.518829195724997)
Pixel Size = (0.000001599004942,-0.000001599004942)
Metadata:
  AREA_OR_POINT=Area
  TIFFTAG_RESOLUTIONUNIT=2 (pixels/inch)
  TIFFTAG_XRESOLUTION=350
  TIFFTAG_YRESOLUTION=350
Image Structure Metadata:
  INTERLEAVE=PIXEL
Corner Coordinates:
Upper Left  ( -88.2757279,  40.5188292) ( 88d16'32.62"W, 40d31' 7.79"N)
Lower Left  ( -88.2757279,  40.5166609) ( 88d16'32.62"W, 40d30'59.98"N)
Upper Right ( -88.2726195,  40.5188292) ( 88d16'21.43"W, 40d31' 7.79"N)
Lower Right ( -88.2726195,  40.5166609) ( 88d16'21.43"W, 40d30'59.98"N)
Center      ( -88.2741737,  40.5177451) ( 88d16'27.03"W, 40d31' 3.88"N)
Band 1 Block=1944x1 Type=Byte, ColorInterp=Red
  NoData Value=0
Band 2 Block=1944x1 Type=Byte, ColorInterp=Green
  NoData Value=0
Band 3 Block=1944x1 Type=Byte, ColorInterp=Blue
  NoData Value=0
Band 4 Block=1944x1 Type=Byte, ColorInterp=Alpha
  NoData Value=0

gdalinfo для окончательной мозаики:

Driver: GTiff/GeoTIFF
Files: mosaic.tif
Size is 5702, 6846
Coordinate System is:
GEOGCS["WGS 84",
    DATUM["WGS_1984",
        SPHEROID["WGS 84",6378137,298.257223563,
            AUTHORITY["EPSG","7030"]],
        AUTHORITY["EPSG","6326"]],
    PRIMEM["Greenwich",0],
    UNIT["degree",0.0174532925199433],
    AUTHORITY["EPSG","4326"]]
Origin = (-88.278946072799997,40.524561377550008)
Pixel Size = (0.000001509761581,-0.000001509761581)
Metadata:
  AREA_OR_POINT=Area
Image Structure Metadata:
  INTERLEAVE=PIXEL
Corner Coordinates:
Upper Left  ( -88.2789461,  40.5245614) ( 88d16'44.21"W, 40d31'28.42"N)
Lower Left  ( -88.2789461,  40.5142255) ( 88d16'44.21"W, 40d30'51.21"N)
Upper Right ( -88.2703374,  40.5245614) ( 88d16'13.21"W, 40d31'28.42"N)
Lower Right ( -88.2703374,  40.5142255) ( 88d16'13.21"W, 40d30'51.21"N)
Center      ( -88.2746417,  40.5193935) ( 88d16'28.71"W, 40d31' 9.82"N)
Band 1 Block=5702x1 Type=Byte, ColorInterp=Red
  NoData Value=0
Band 2 Block=5702x1 Type=Byte, ColorInterp=Green
  NoData Value=0
Band 3 Block=5702x1 Type=Byte, ColorInterp=Blue
  NoData Value=0
Band 4 Block=5702x1 Type=Byte, ColorInterp=Alpha
  NoData Value=0

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

jeremyeastwood
источник
2
В gdal_warp есть известная ошибка с альфа-каналами. Попробуйте деформировать альфа-полосу каждого растра отдельно, а затем рекомбинировать позже (см. Gis.stackexchange.com/questions/49706/… )
Майкл Стимсон,
отлично, спасибо за быстрый ответ! Вы имеете в виду отделение альфа-слоя от полос rgb перед выполнением gdalwarp, а затем рекомбинацию после?
Джеремивудвуд
Вот и все. У gdal_warp есть проблемы с деформацией альфа-канала, поэтому относитесь к RGB, а не к RGBA. Для разделения gdal_translate -of GTIFF -b 1 -b 2 -b 3 (создает изображение RGB из RGBA).
Майкл Стимсон
ок круто, потом рекомбинируй через vrt по твоей ссылке? При рекомбинации с использованием gdalbuildvrt -separate, есть ли способ взять 3 полосы из первого изображения и 1 из второго, или я должен использовать опцию gdalbuildvrt для объединения?
Джеремивудвуд
1
Нет, я не думаю, что какой-либо из инструментов командной строки может делать альфа-смешивание. У вас есть QGIS (или ArcGis), у обоих есть растровые калькуляторы, которые могут выполнять эту функцию после деформации. Конечно, это было бы не так просто, как просто поместить их в VRT ... Я считаю, что VRT полностью перезаписывает базовые пиксели, а не Alpha blend; возможно, это то, что можно было бы представить разработчикам как запрос на улучшение.
Майкл Стимсон

Ответы:

1

Проблема с вашим рабочим процессом связана не с альфа-слоем, а с тем фактом, что при создании vrt используется только последнее изображение.

гдальмерге док

В областях перекрытия последнее изображение будет скопировано поверх более ранних.

gdalbuildvrt doc:

Если существует некоторое пространственное перекрытие между файлами, порядок файлов, отображаемых в списке источников, имеет значение: файлы, перечисленные в конце, являются теми, из которых будет извлекаться содержимое. Обратите внимание, что nodata будет приниматься во внимание, чтобы потенциально извлекать данные из менее приоритетных наборов данных, но в настоящее время альфа-канал не учитывается при альфа-компоновке (поэтому источник с альфа = 0, появляющийся поверх другого источника, будет переопределять контент) , Это может быть изменено в более поздних версиях.

Так что на самом деле прозрачная область просто прозрачна, и под ней ничего не видно.

Если вы хотите использовать смешивание, вы должны сделать это с помощью gdalwarp: он обрабатывает альфа-полосы, а также смешивание на основе заданного расстояния в пикселях (-cblend distance)

radouxju
источник