Puis-je conserver une couche alpha décolorée lors de la mosaïque d'images avec gdal?

12

Je mosaïque certaines images avec gdal et j'aimerais améliorer le résultat final en utilisant une couche d'altération progressive / graduelle vers le bord de chaque image pour supprimer les bords nets au milieu de la mosaïque. Le problème que j'ai, c'est que la partie de chaque image individuelle avec la couche alpha progressive masque les images en dessous dans la mosaïque finale, plutôt que d'être semi-transparente, comme indiqué ci-dessous:

mosaïque avec des couches alpha progressives masquant les images

Idéalement, j'aimerais qu'une image se fane dans la suivante en utilisant cette transparence progressive.

Les étapes que j'effectue pour générer la mosaïque sont les suivantes:

Ajoutez des gcps aux images originales pour les géolocaliser et les orienter correctement (faites à chaque image à tour de rôle):

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

Déformez les images vers de nouveaux géotiffes qui sont correctement orientés (effectués à tour de rôle sur chaque image):

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

Combinez toutes les images déformées en une seule mosaïque:

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

L'image que j'ai liée est mosaic.tif.

gdalinfo pour un exemple de fichier d'entrée:

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 pour le géotiff déformé avec couche alpha progressive:

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 pour la mosaïque finale:

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

J'ai inclus un exemple d'image après chaque étape du processus et la mosaïque finale dans un lien dropbox ici - je peux fournir l'ensemble de l'image si nécessaire.

jeremyeastwood
la source
2
Il y a un bug connu avec les canaux alpha dans gdal_warp. Essayez de déformer la bande alpha de chaque raster séparément, puis de recombiner plus tard (voir gis.stackexchange.com/questions/49706/… )
Michael Stimson
super, merci pour la réponse rapide! voulez-vous dire séparer la couche alpha des bandes RVB avant d'effectuer gdalwarp, puis recombiner après?
jeremyeastwood
C'est ça. gdal_warp a des problèmes de déformation avec alpha, alors traitez-le comme RGB et non RGBA. Pour séparer gdal_translate -of GTIFF -b 1 -b 2 -b 3 (crée une image RGB à partir de RGBA).
Michael Stimson
ok cool, puis recombiner via un vrt selon votre lien? lors de la recombinaison à l'aide de gdalbuildvrt -separate, existe-t-il un moyen de prendre 3 bandes de la première image et 1 de la seconde, ou devrais-je utiliser une option gdalbuildvrt pour combiner?
jeremyeastwood
1
Non, je pense qu'aucun des outils de ligne de commande ne peut faire de mélange alpha. Avez-vous QGIS (ou ArcGis), les deux ont des calculatrices raster qui pourraient exécuter cette fonction après la déformation. Ce ne serait certainement pas aussi facile que de simplement les déposer dans un VRT ... Je crois que le VRT écrase complètement les pixels sous-jacents, pas le mélange Alpha; c'est peut-être quelque chose qui pourrait être proposé aux développeurs comme une demande d'amélioration.
Michael Stimson

Réponses:

1

Le problème avec votre flux de travail n'est pas lié à la couche alpha, mais au fait que seule la dernière image est utilisée lorsque vous créez un vrt.

gdalmerge doc

Dans les zones de chevauchement, la dernière image sera copiée sur les précédentes.

gdalbuildvrt doc:

S'il y a un certain chevauchement spatial entre les fichiers, l'ordre des fichiers apparaissant dans la liste du sujet source: les fichiers répertoriés à la fin sont ceux dont le contenu sera extrait. Notez que nodata sera pris en compte pour potentiellement récupérer des données à partir d'ensembles de données moins prioritaires, mais actuellement, le canal alpha n'est pas pris en compte pour effectuer la composition alpha (donc une source avec alpha = 0 apparaissant au-dessus d'une autre source remplacera son contenu) . Cela pourrait être modifié dans les versions ultérieures.

En fait, la zone transparente est simplement transparente, et il n'y a rien à voir en dessous.

Si vous souhaitez utiliser un mélange, vous devez le faire en utilisant gdalwarp: il gère les bandes alpha ainsi que le mélange basé sur une distance donnée en pixels (-cblend distance)

radouxju
la source