Czy mogę zachować zanikającą warstwę alfa podczas mozaikowania obrazów za pomocą gdal?


12

Mozaikuję niektóre obrazy za pomocą gdal i chciałbym poprawić końcowy wynik, używając zanikającej / stopniowej warstwy alfa w kierunku krawędzi każdego obrazu, aby usunąć ostre krawędzie na środku mozaiki. Problem polega na tym, że część każdego pojedynczego obrazu ze stopniową warstwą alfa maskuje obrazy pod nim w końcowej mozaice, a nie jest półprzezroczysta, jak pokazano poniżej:

mozaika ze stopniowymi warstwami alfa maskującymi obrazy

Idealnie chciałbym, aby jeden obraz przechodził do następnego przy użyciu tej stopniowej przezroczystości.

Kroki, które wykonuję, aby wygenerować mozaikę, są następujące:

Dodaj gcps do oryginalnych obrazów, aby geolokalizować je i odpowiednio zorientować (zrobione kolejno dla każdego obrazu):

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

Wypacz obrazy do nowych geotiffów, które są odpowiednio zorientowane (wykonywane kolejno dla każdego obrazu):

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

Połącz wszystkie wypaczone obrazy w jedną mozaikę:

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

Obraz, który połączyłem, to: mozaika.tif.

gdalinfo dla przykładowego pliku wejściowego:

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 dla wypaczonej geotiffu ze stopniową warstwą 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 za ostatnią mozaikę:

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

Zamieszczam przykładowy obraz po każdym etapie procesu i ostatnią mozaikę w linku dropbox tutaj - w razie potrzeby mogę dostarczyć cały zestaw obrazów.


2
Znany jest błąd z kanałami alfa w gdal_warp. Spróbuj wypaczać pasmo alfa każdego rastra osobno, a następnie połączyć go ponownie później (patrz gis.stackexchange.com/questions/49706/... )
Michael Stimson,

świetnie, dziękuję za szybką odpowiedź! masz na myśli oddzielenie warstwy alfa od pasm rgb przed wykonaniem gdalwarp, a następnie ponowne połączenie?
jeremyeastwood,

Otóż ​​to. gdal_warp ma problemy z wypaczaniem się z alfa, więc traktuj jako RGB, a nie RGBA. Aby oddzielić gdal_translate -of GTIFF -b 1 -b 2 -b 3 (tworzy obraz RGB z RGBA).
Michael Stimson,

ok fajnie, a następnie zrekombinuj przez vrt zgodnie z linkiem? podczas rekombinacji za pomocą gdalbuildvrt -separate, czy istnieje sposób na pobranie 3 pasm z pierwszego obrazu i 1 z drugiego, czy też powinienem użyć opcji gdalbuildvrt do połączenia?
jeremyeastwood,

1
Nie, nie sądzę, aby którekolwiek z narzędzi wiersza poleceń mogło mieszać alfa. Czy masz QGIS (lub ArcGis), oba mają kalkulatory rastrowe, które mogłyby wykonywać tę funkcję po wypaczeniu. Z pewnością nie byłoby to tak proste, jak upuszczenie ich do VRT ... Wierzę, że VRT całkowicie zastępuje podstawowe piksele, a nie mieszankę Alpha; być może jest to coś, co można przekazać programistom jako prośbę o ulepszenie.
Michael Stimson,

Odpowiedzi:


1

Problem z przepływem pracy nie jest związany z warstwą alfa, ale faktem, że podczas tworzenia vrt używany jest tylko ostatni obraz.

gdalmerge doc

W obszarach nakładania się ostatni obraz zostanie skopiowany na poprzednie.

gdalbuildvrt doc:

Jeśli między plikami zachodzi pewne nakładanie się przestrzeni, kolejność plików pojawiających się na liście materii źródłowej: pliki wymienione na końcu to te, z których zawartość zostanie pobrana. Zauważ, że nodata będzie brana pod uwagę przy potencjalnym pobieraniu danych z mniej priorytetowych zestawów danych, ale obecnie kanał alfa nie jest brany pod uwagę przy tworzeniu alfa (więc źródło o kodzie alfa = 0 pojawiającym się nad innym źródłem nadpisze treść) . Można to zmienić w późniejszych wersjach.

W rzeczywistości obszar przezroczysty jest po prostu przezroczysty i pod nim nie ma nic do zobaczenia.

Jeśli chcesz użyć miksowania, musisz to zrobić za pomocą gdalwarp: obsługuje pasma alfa, a także miksowanie na podstawie podanej odległości w pikselach (odległość mieszania)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.