Bisakah saya mempertahankan lapisan alfa yang pudar saat membuat mosaik gambar dengan gdal?

12

Saya merosot beberapa gambar dengan gdal dan ingin meningkatkan hasil akhir dengan menggunakan lapisan alpha fading / bertahap ke tepi setiap gambar untuk menghilangkan tepi tajam di tengah-tengah mosaik. Masalah yang saya alami adalah bahwa bagian dari masing-masing gambar individu dengan lapisan alpha bertahap menutupi gambar di bawahnya di mosaik akhir, daripada semi-transparan, seperti yang ditunjukkan di bawah ini:

mosaik dengan lapisan masking alpha bertahap gambar

Idealnya saya ingin satu gambar memudar ke yang berikutnya menggunakan transparansi bertahap ini.

Langkah-langkah yang saya lakukan untuk menghasilkan mosaik adalah sebagai berikut:

Tambahkan gcps ke gambar asli untuk melakukan geolokasi dan orientasikan dengan benar (dilakukan pada setiap gambar secara bergantian):

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 gambar ke geotiff baru yang berorientasi dengan benar (dilakukan untuk setiap gambar pada gilirannya):

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

Gabungkan semua gambar yang bengkok menjadi satu mosaik:

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

Gambar yang saya tautkan adalah mosaic.tif.

gdalinfo untuk file input sampel:

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 untuk geotiff yang bengkok dengan lapisan alpha bertahap:

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 untuk mosaik terakhir:

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

Saya telah menyertakan gambar sampel setelah setiap tahap proses dan mosaik terakhir di dalam tautan dropbox di sini - saya dapat memberikan seluruh gambar yang ditetapkan jika perlu.

jeremyeastwood
sumber
2
Ada bug yang dikenal dengan saluran alpha di gdal_warp. Cobalah membengkokkan pita alfa dari setiap raster secara terpisah dan kemudian bergabung kembali nanti (lihat gis.stackexchange.com/questions/49706/… )
Michael Stimson
Hebat, terima kasih atas tanggapan cepatnya! maksud Anda memisahkan lapisan alpha dari band rgb sebelum melakukan gdalwarp, lalu bergabung kembali setelah?
jeremyeastwood
Itu dia. gdal_warp memiliki masalah warping dengan alpha, jadi perlakukan sebagai RGB dan bukan RGBA. Untuk memisahkan gdal_translate -of GTIFF -b 1 -b 2 -b 3 (membuat gambar RGB dari RGBA).
Michael Stimson
ok keren, lalu gabungkan kembali melalui vrt sesuai tautan Anda? ketika menggabungkan kembali menggunakan gdalbuildvrt -separate, apakah ada cara untuk mengambil 3 band dari gambar pertama dan 1 dari yang kedua, atau haruskah saya menggunakan opsi gdalbuildvrt untuk menggabungkan?
jeremyeastwood
1
Tidak, saya tidak berpikir salah satu alat baris perintah dapat melakukan alpha blending. Apakah Anda memiliki QGIS (atau ArcGis) keduanya memiliki kalkulator raster yang dapat melakukan fungsi ini setelah warping. Tentunya tidak akan semudah hanya dengan menjatuhkannya ke dalam VRT ... Saya percaya bahwa VRT sepenuhnya menimpa piksel yang mendasarinya, bukan campuran Alpha; mungkin itu sesuatu yang bisa diajukan kepada pengembang sebagai permintaan perbaikan.
Michael Stimson

Jawaban:

1

Masalah dengan alur kerja Anda tidak tertaut ke lapisan alfa, tetapi kenyataan bahwa hanya gambar terakhir yang digunakan saat Anda membuat vrt.

gdalmerge doc

Di area tumpang tindih, gambar terakhir akan disalin dari yang sebelumnya.

gdalbuildvrt doc:

Jika ada beberapa jumlah spasial yang tumpang tindih antara file, urutan file yang muncul dalam daftar materi sumber: file yang terdaftar di bagian akhir adalah file dari mana konten akan diambil. Perhatikan bahwa nodata akan diperhitungkan untuk berpotensi mengambil data dari kumpulan data yang lebih sedikit, tetapi saat ini, saluran alfa tidak diperhitungkan untuk melakukan pengomposisian alfa (sehingga sumber dengan alfa = 0 muncul di atas sumber lain akan menimpa konten) . Ini mungkin diubah di versi yang lebih baru.

Jadi sebenarnya area transparan itu hanya transparan, dan tidak ada yang bisa dilihat di bawahnya.

Jika Anda ingin menggunakan blending, Anda perlu melakukannya menggunakan gdalwarp: ia menangani band alpha dan juga blending berdasarkan jarak yang diberikan dalam piksel (-cblend distance)

radouxju
sumber