Posso conservare uno strato alfa in dissolvenza quando mosaichiamo immagini con gdal?


12

Sto creando un mosaico di alcune immagini con gdal e vorrei migliorare il risultato finale usando uno strato alfa sfumato / graduale verso il bordo di ogni immagine per rimuovere i bordi nitidi nel mezzo del mosaico. Il problema che sto riscontrando è che la porzione di ogni singola immagine con lo strato alfa graduale sta mascherando le immagini sottostanti nel mosaico finale, piuttosto che essere semi-trasparente, come mostrato di seguito:

mosaico con strati alfa graduali che mascherano immagini

Idealmente, vorrei che un'immagine svanisse nella successiva usando questa trasparenza graduale.

I passaggi che eseguo per generare il mosaico sono i seguenti:

Aggiungi gcps alle immagini originali per geolocalizzarle e orientarle correttamente (fatto a turno a ciascuna immagine):

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

Trasforma le immagini in nuovi geotiff che sono orientati correttamente (fatto a turno a ciascuna immagine):

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

Combina tutte le immagini deformate in un unico mosaico:

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

L'immagine che ho collegato è mosaic.tif.

gdalinfo per un file di input di esempio:

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 per il geotiff deformato con graduale strato alfa:

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 per il mosaico 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

Ho incluso un'immagine di esempio dopo ogni fase del processo e il mosaico finale in un collegamento a dropbox qui : posso fornire l'intero set di immagini se necessario.


2
C'è un bug noto con i canali alfa in gdal_warp. Prova a deformare la banda alfa di ciascun raster separatamente e poi ricombina più tardi (vedi gis.stackexchange.com/questions/49706/… )
Michael Stimson,

ottimo, grazie per la rapida risposta! vuoi dire separare lo strato alfa dalle bande rgb prima di eseguire gdalwarp, quindi ricombinare dopo?
jeremyeastwood,

Questo è tutto. gdal_warp ha problemi a deformarsi con l'alfa, quindi trattalo come RGB e non RGBA. Per separare gdal_translate -of GTIFF -b 1 -b 2 -b 3 (crea un'immagine RGB da RGBA).
Michael Stimson,

ok cool, quindi ricombinarsi tramite un vrt secondo il tuo link? quando si ricombina usando gdalbuildvrt -separate, c'è un modo per prendere 3 bande dalla prima immagine e 1 dalla seconda, o dovrei usare un'opzione gdalbuildvrt per combinare?
jeremyeastwood,

1
No, non credo che nessuno degli strumenti della riga di comando possa eseguire la fusione alfa. Hai QGIS (o ArcGis) entrambi hanno calcolatori raster che potrebbero eseguire questa funzione dopo la deformazione. Certamente non sarebbe facile come farli cadere in un VRT ... Credo che VRT sovrascriva completamente i pixel sottostanti, non la fusione Alpha; forse è qualcosa che potrebbe essere presentato agli sviluppatori come richiesta di miglioramento.
Michael Stimson,

Risposte:


1

Il problema con il flusso di lavoro non è collegato al livello alfa, ma al fatto che viene utilizzata solo l'ultima immagine quando si crea un vrt.

gdalmerge doc

Nelle aree di sovrapposizione, l'ultima immagine verrà copiata su quelle precedenti.

gdalbuildvrt doc:

Se c'è una certa quantità di sovrapposizione spaziale tra i file, l'ordine dei file che appare nell'elenco degli argomenti di origine: i file elencati alla fine sono quelli da cui verrà recuperato il contenuto. Si noti che i nodati verranno presi in considerazione per recuperare potenzialmente i dati da meno set di dati prioritari, ma attualmente il canale alfa non viene preso in considerazione per eseguire la composizione alfa (quindi una fonte con alpha = 0 che appare sopra un'altra fonte avrà la precedenza sul contenuto) . Questo potrebbe essere cambiato nelle versioni successive.

Quindi in effetti l'area trasparente è semplicemente trasparente e non c'è nulla da vedere sotto di essa.

Se vuoi usare un po 'di fusione, devi farlo usando gdalwarp: gestisce le bande alfa e la fusione in base a una data distanza in pixel (-classe distanza)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.