Posso preservar uma camada alfa desbotada ao fazer mosaico de imagens com gdal?

12

Estou fazendo mosaico de algumas imagens com gdal e gostaria de melhorar o resultado final usando uma camada alfa gradual / desbotada na borda de cada imagem para remover as bordas afiadas no meio do mosaico. O problema que estou tendo é que a parte de cada imagem individual com a camada alfa gradual está mascarando as imagens abaixo dela no mosaico final, em vez de ser semitransparente, como mostrado abaixo:

mosaico com camadas alfa graduais mascarando imagens

O ideal é que uma imagem desapareça na próxima usando essa transparência gradual.

As etapas que eu executo para gerar o mosaico são as seguintes:

Adicione gcps às imagens originais para geolocalizá-las e orientá-las adequadamente (feito para cada imagem, por sua vez):

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

Warp as imagens para novos geotiffs que são orientados corretamente (feito para cada imagem por sua vez):

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

Combine todas as imagens distorcidas em um mosaico:

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

A imagem que eu vinculei é mosaic.tif.

gdalinfo para um arquivo de entrada de amostra:

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 o geotiff deformado com camada 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 o 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

Incluí uma imagem de amostra após cada etapa do processo e o mosaico final em um link do dropbox aqui - posso fornecer todo o conjunto de imagens, se necessário.

jeremyeastwood
fonte
2
Há um bug conhecido com canais alfa em gdal_warp. Tente entortar a banda alfa de cada raster separadamente e depois recombinar depois (veja gis.stackexchange.com/questions/49706/... )
Michael Stimson
ótimo, obrigado pela resposta rápida! você quer dizer separar a camada alfa das bandas rgb antes de executar gdalwarp e depois recombinar depois?
jeremyeastwood
É isso aí. gdal_warp tem problemas de distorção com alfa, então trate como RGB e não RGBA. Para separar gdal_translate -de GTIFF -b 1 -b 2 -b 3 (cria uma imagem RGB a partir de RGBA).
Michael Stimson
ok legal, então recombine via um vrt conforme seu link? ao recombinar usando gdalbuildvrt -separate, existe uma maneira de obter 3 bandas da primeira imagem e 1 da segunda, ou devo usar uma opção gdalbuildvrt para combinar?
jeremyeastwood
1
Não, acho que nenhuma das ferramentas de linha de comando pode fazer a mistura alfa. Você possui QGIS (ou ArcGis), ambos possuem calculadoras de varredura que podem executar essa função após a deformação. Certamente não seria tão fácil quanto simplesmente colocá-los em um VRT ... Eu acredito que o VRT substitui completamente os pixels subjacentes, não a mistura Alpha; talvez isso seja algo que possa ser apresentado aos desenvolvedores como uma solicitação de melhoria.
Michael Stimson

Respostas:

1

O problema com o fluxo de trabalho não está vinculado à camada alfa, mas o fato de que somente a última imagem é usada quando você cria uma vrt.

gdalmerge doc

Em áreas de sobreposição, a última imagem será copiada sobre as anteriores.

gdalbuildvrt doc:

Se houver alguma sobreposição espacial entre os arquivos, a ordem dos arquivos que aparecem na lista de assuntos de origem: os arquivos listados no final são aqueles dos quais o conteúdo será buscado. Observe que os nodatas serão levados em consideração para buscar dados potencialmente de conjuntos de dados menos prioritários, mas atualmente o canal alfa não é levado em consideração para a composição alfa (portanto, uma fonte com alpha = 0 aparecendo no topo de outra fonte substituirá o conteúdo) . Isso pode ser alterado em versões posteriores.

De fato, a área transparente é simplesmente transparente e não há nada para ver embaixo dela.

Se você deseja usar um pouco de mesclagem, é necessário fazê-lo usando gdalwarp: ele lida com as bandas alfa e com base em uma determinada distância em pixels (-cblend distance)

radouxju
fonte