Чи можу я зберегти зникаючий альфа-шар під час мозаїки зображень за допомогою 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

Зображення, яке я пов’язав, - мозаїка.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

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


2
У gdal_warp відома помилка з альфа-каналами. Спробуйте викривити альфа-діапазон кожного растра окремо, а потім повторно комбінуйте його (див. Gis.stackexchange.com/questions/49706/… )
Майкл

чудово, дякую за швидку відповідь! ти маєш на увазі відокремити альфа-шар від Rgb-діапазонів перед виконанням gdalwarp, а потім рекомбінувати після?
jeremyeastwood

Це воно. gdal_warp має проблеми з викривленням альфа, тому трактуйте як RGB, а не RGBA. Для відокремлення gdal_translate від GTIFF -b 1 -b 2 -b 3 (створює RGB-зображення від RGBA).
Майкл Стимсон

гаразд, круто, потім рекомбінуйте через сад, як за вашим посиланням? при рекомбінації з використанням gdalbuildvrt -separate, чи є спосіб взяти 3 смуги з першого зображення та 1 з другого, або я повинен використовувати параметр gdalbuildvrt для поєднання?
jeremyeastwood

1
Ні, я не думаю, що жоден із інструментів командного рядка не може робити альфа-змішування. У вас QGIS (або ArcGis) обидва мають растрові калькулятори, які могли б виконувати цю функцію після викривлення. Це, звичайно, не буде так просто, як просто скинути їх у VRT ... Я вважаю, що VRT повністю перезаписує основні пікселі, а не альфа-суміш; можливо, це щось, що може бути поставлено розробникам як запит на вдосконалення.
Майкл Стімсон

Відповіді:


1

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

gdalmerge doc

У місцях перекриття останнє зображення буде скопійовано на попередні.

gdalbuildvrt doc:

Якщо між файлами є деяка кількість просторових перекриттів, порядок файлів, що відображаються у списку вихідної матерії: файли, перелічені в кінці, є тими, з яких буде отримано вміст. Зауважте, що нодатні дані будуть враховані для потенційного отримання даних з менш пріоритетних наборів даних, але в даний час альфа-канал не враховується для створення альфа-композиції (тому джерело з альфа-0, яке з’являється поверх іншого джерела, буде заміняти вміст) . Це може бути змінено в пізніших версіях.

Тож насправді прозора область просто прозора, і під цим нічого не бачити.

Якщо ви хочете скористатися деяким змішуванням, вам потрібно зробити це за допомогою gdalwarp: він обробляє альфа-смуги, а також змішування на основі заданої відстані в пікселях (-cblend distance)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.