¿Puedo preservar una capa alfa que se desvanece al mosaicar imágenes con gdal?

12

Mosaico algunas imágenes con gdal y me gustaría mejorar el resultado final mediante el uso de una capa alfa desvanecimiento / gradual hacia el borde de cada imagen para eliminar los bordes afilados en el medio del mosaico. El problema que tengo es que la parte de cada imagen individual con la capa alfa gradual está enmascarando las imágenes debajo de ella en el mosaico final, en lugar de ser semitransparente, como se muestra a continuación:

mosaico con capas alfa graduales que enmascaran imágenes

Idealmente, me gustaría que una imagen se desvanezca en la siguiente usando esta transparencia gradual.

Los pasos que realizo para generar el mosaico son los siguientes:

Agregue gcps a las imágenes originales para geolocalizarlas y orientarlas adecuadamente (hecho a su vez en cada imagen):

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

Deforma las imágenes en nuevos geotiffs que estén orientados correctamente (hecho a su vez en cada imagen):

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

Combina todas las imágenes deformadas en un solo mosaico:

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

La imagen que vinculé es mosaic.tif.

gdalinfo para un archivo de entrada de muestra:

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 para el geotiff deformado con capa alfa gradual:

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 para el mosaico final:

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

He incluido una imagen de muestra después de cada etapa del proceso y el mosaico final en un enlace de Dropbox aquí : puedo proporcionar el conjunto de imágenes completo si es necesario.

jeremyeastwood
fuente
2
Hay un error conocido con canales alfa en gdal_warp. Intente deformar la banda alfa de cada ráster por separado y luego recombínelo más tarde (consulte gis.stackexchange.com/questions/49706/… )
Michael Stimson
genial, gracias por la rápida respuesta! ¿te refieres a separar la capa alfa de las bandas rgb antes de realizar gdalwarp, luego recombinar después?
jeremyeastwood
Eso es. gdal_warp tiene problemas de deformación con alfa, así que trátelo como RGB y no como RGBA. Para separar gdal_translate -of GTIFF -b 1 -b 2 -b 3 (crea una imagen RGB a partir de RGBA).
Michael Stimson
ok genial, entonces recombinar a través de un vrt según su enlace? al recombinar usando gdalbuildvrt -separate, ¿hay alguna forma de tomar 3 bandas de la primera imagen y 1 de la segunda, o debería usar una opción de gdalbuildvrt para combinar?
jeremyeastwood
1
No, no creo que ninguna de las herramientas de línea de comandos pueda hacer una mezcla alfa. ¿Tiene QGIS (o ArcGis)? Ambos tienen calculadoras ráster que podrían realizar esta función después de la deformación. Ciertamente no sería tan fácil como simplemente colocarlos en un VRT ... Creo que VRT sobrescribe completamente los píxeles subyacentes, no la mezcla Alpha; Tal vez eso sea algo que se podría poner a los desarrolladores como una solicitud de mejora.
Michael Stimson

Respuestas:

1

El problema con su flujo de trabajo no está vinculado a la capa alfa, sino al hecho de que solo se usa la última imagen cuando crea un vrt.

doc gdalmerge

En áreas de superposición, la última imagen se copiará sobre las anteriores.

gdalbuildvrt doc:

Si hay una cierta superposición espacial entre archivos, el orden de los archivos que aparecen en la lista de fuentes es importante: los archivos que se enumeran al final son aquellos de los que se obtendrá el contenido. Tenga en cuenta que los nodatos se tendrán en cuenta para obtener datos potencialmente de conjuntos de datos menos prioritarios, pero actualmente, el canal alfa no se tiene en cuenta para hacer la composición alfa (por lo que una fuente con alfa = 0 que aparece encima de otra fuente anulará su contenido) . Esto podría modificarse en versiones posteriores.

De hecho, el área transparente es simplemente transparente y no hay nada que ver debajo.

Si desea utilizar alguna combinación, debe hacerlo utilizando gdalwarp: maneja las bandas alfa y la combinación en función de una distancia dada en píxeles (-cblend distance)

radouxju
fuente