用gdal拼接图像时能否保留褪色的alpha图层?


12

我正在用gdal镶嵌一些图像,并想通过朝每个图像的边缘使用淡入/渐变Alpha层来消除马赛克中间的尖锐边缘来改善最终结果。我遇到的问题是,每个带有渐变Alpha层的图像的一部分在最终的镶嵌图中都将其下方的图像掩盖了,而不是半透明的,如下所示:

渐变的Alpha图层掩盖图像的马赛克

理想情况下,我希望使用这种渐变透明度将一张图像逐渐淡入另一张图像。

我执行的生成镶嵌的步骤如下:

将gcps添加到原始图像以对其进行地理位置定位和正确定向(依次对每个图像进行处理):

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

将图像扭曲到正确定向的新geotiff(依次对每个图像执行):

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

将所有变形的图像合并到一个马赛克中:

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

我链接的图像是mosaic.tif。

gdalinfo提供样本输入文件:

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

带有渐变Alpha层的扭曲Geotiff的gdalinfo:

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:

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

在该过程的每个阶段之后,我都包括了一个示例图像,最后一个镶嵌图位于此处的保管箱链接中-如有必要,我可以提供整个图像集。


2
gdal_warp中存在一个带有alpha通道的已知错误。尝试单独翘曲每个栅格的α带再后来重新结合(见gis.stackexchange.com/questions/49706/...
迈克尔史汀生

太好了,谢谢您的快速回复!您是说在进行gdalwarp之前将alpha层与rgb谱带分开,然后再进行重组?
jeremyeastwood 2015年

而已。gdal_warp的alpha扭曲存在问题,因此请视为RGB,而不是RGBA。分隔gTIFF的gdal_translate -b 1 -b 2 -b 3(从RGBA创建RGB图像)。
Michael Stimson

好的,然后根据您的链接通过vrt重新组合?使用gdalbuildvrt -separate进行重组时,是否有办法从第一个映像中提取3个频段,从第二个映像中提取1个频段,还是应该使用gdalbuildvrt选项进行合并?
jeremyeastwood

1
不,我不认为任何命令行工具都可以进行Alpha混合。您是否有QGIS(或ArcGis)都具有可在变形后执行此功能的栅格计算器。当然,这不如将它们放入VRT那样容易。我相信VRT会完全覆盖基础像素,而不是Alpha混合;也许这可以作为改进要求提交给开发人员。
Michael Stimson

Answers:


1

工作流程的问题并不与alpha层相关,而是与创建vrt时仅使用最后一张图像有关。

gdalmerge文档

在重叠区域,最后一张图像将被复制到较早的图像上。

gdalbuildvrt doc:

如果文件之间存在一定程度的空间重叠,则文件在源事项列表中的显示顺序:最后列出的文件是从中获取内容的文件。请注意,将不会考虑使用nodata来潜在地从优先级较低的数据集中获取数据,但是目前,不考虑使用alpha通道进行Alpha合成(因此,在另一个源顶部出现alpha = 0的源将覆盖内容) 。在以后的版本中可能会更改。

因此,实际上,透明区域只是透明的,在其下方没有任何可见的内容。

如果要使用某些混合,则需要使用gdalwarp:它可以处理alpha波段,并根据给定的像素距离(-cblend distance)进行混合

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.