Singkatnya
Setiap rangkaian 3 gambar di bawah ini harus dibaca seperti "grey (band) + opacity (band) = hasil transparan" . Anda dapat menguji proses ini dalam beberapa menit melalui makefile yang dihosting github yang terkait . Proses # 3 adalah yang saya rekomendasikan, dengan ambang batas antara 170 (membuat bayangan kuat) dan 220 (membuat semua bayangan). Proses 3 memberikan bayangan terkuat dan menghindari efek memutih yang memutih. Sesuaikan opacity keseluruhan layer yang dihasilkan sesuai kebutuhan. Persamaan di --calc="<equation>"
dapat ditingkatkan sesuai kebutuhan juga, menggunakan gdal_calc
.
Untuk video yang santai tentang pendekatan ini, dijelaskan oleh desainer Photoshop, lihat Menambahkan Relief Berbayang di Photoshop (16 menit).
Latar Belakang
gdaldem hillshade
menghasilkan file skala abu-abu satu band dengan nilai piksel range = [1-255], alias dari bayangan paling gelap hingga piksel paling mencerahkan. Untuk bidang datar, px = 221 (#DDDDDD). NoDataValue
piksel mendapatkan nilai nodata default 0
, juga, input dan keluaran hitam paling gelap adalah dan seharusnya 1
. Tanpa band opacity yang ditentukan, opacity adalah 100% .
gdaldem hillshade input.tif hillshade.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges

Kami ingin mendefinisikan dan mengontrol band opacity ke-2!
Tujuan
Kami ingin satu band skala abu-abu -b 1
, itu adalah hillshade. Di luar gdal, ini adalah pita abu-abu dengan rentang kontinu seperti px = [1-255]. Kami dapat memotong area yang tidak relevan (# 2), atau menghitamkannya menjadi px = 1 dan mengandalkan band opacity (# 3).
Kami ingin satu band opacity -b 2
, umumnya terbalik hillshade atau fungsi terkait itu. Kami dapat memangkas area yang tidak relevan (# 2). Ini harus berupa kisaran kekeruhan yang terus menerus seperti px = [1-255], selain itu tidak ada keanggunan.
gdal_calc
dapat digunakan untuk melakukan matematika pada piksel dari file input A, B, C ... dan memeriksa nilai boolean seperti A<220
, yang mengembalikan 1 (benar) atau 0 (salah). Ini memungkinkan kalkulus bersyarat. Jika kondisinya salah, bagian persamaan yang terkait dibatalkan.
1. Grey hillshade dibuat transparan
Berikut ini memberikan hasil dua band yang sangat baik dengan gdal hillshade
abu-abu standar dan area yang lebih putih dibuat semakin transparan:
# hillshade px=A, opacity is its invert: px=255-A
gdal_calc.py -A ./hillshade.tmp.tif --outfile=./opacity.tif --calc="255-A"
# assigns to relevant bands -b 1 and -b 2
gdalbuildvrt -separate ./final.vrt ./hillshade.tmp.tif ./opacity.tif

2. Optimasi melalui pseudo-crop (-b 1 & -b 2)
2/3 dari piksel aktif -b 1
(skala abu-abu) menjadi tidak terlihat oleh mata ketika opacity -b 2
ditambahkan, namun, piksel ini menyimpan berbagai nilai -b 1
opacity yang lebih putih dan rendah -b 2
. Mereka dapat dibuat semua [255,1]
piksel transparan putih , memungkinkan tingkat kompresi yang lebih baik:
# filter the color band, keep greyness of relevant shadows below limit
gdal_calc.py -A ./hillshade.tmp.tif --outfile=./color_crop.tmp.tif \
--calc="255*(A>220) + A*(A<=220)"
# filter the opacity band, keep opacity of relevant shadows below limit
gdal_calc.py -A ./hillshade.tmp.tif --outfile=./opacity_crop.tmp.tif \
--calc=" 1*(A>220) +(256-A)*(A<=220)"
# gdalbuildvrt -separate ./final.vrt ./color_crop.tmp.tif ./opacity_crop.tmp.tif
# gdal_translate -co COMPRESS=LZW -co ALPHA=YES ./final.vrt ./final_crop.tif

3. Selanjutnya -b 1 optimasi (memotong + menghitamkan)
Karena kami memiliki band opacity progresif yang -b 2
diandalkan, kami dapat membuat -b 1
piksel putih px = 255 via 255*(A>220)
, atau hitam px = 1 via 1*(A>220)
.
gdal_calc.py -A ./hillshade.tmp.tif --outfile=./color.tmp.tif \
--calc="255*(A>220) + 1*(A<=220)"
# gdal_calc.py -A ./hillshade.tmp.tif --outfile=./opacity_crop.tmp.tif \
# --calc=" 1*(A>220) +(256-A)*(A<=220)".
# gdalbuildvrt -separate ./final.vrt ./color.tmp.tif ./opacity_crop.tif
# gdal_translate -co COMPRESS=LZW -co ALPHA=YES ./final.vrt ./final.tif

Hasil ini menunjukkan bayangan yang lebih kuat .
Hasil
Buat hillshade transparan memiliki tujuan langsung untuk menghilangkan bekas wilayah abu-abu dan efek abu-abu yang tidak diinginkan tetapi ada di mana - mana . Produk sampingan yang diinginkan adalah peningkatan kontrol atas produk visual akhir. Proses yang dijelaskan menghapus sebagian besar piksel abu-abu dan semua putih. Gambar polos latar belakang yang berwarna-warni akan mempertahankan warna yang dipilih saat dilapis oleh penutup bukit transparan ke hitam, hanya area yang gelap yang akan digelapkan. Perbandingan proses # 2 (kiri) dan # 3 (kanan) di bawah ini.
Ikhtisar:

Zoom, harap perhatikan bayangan (sebelum vs sesudah):

Optimasi lebih lanjut
Area putih : Seseorang mungkin juga ingin menjaga area yang paling tercerahkan untuk meningkatkan rasa 3D. Ini benar-benar akan menjadi simetris dari pendekatan saat ini dengan perubahan ambang batas kecil, kemudian gabungan dari kedua output melalui gdal_calc. Dataran akan 100% transparan, bayangan paling gelap dan area pencerahan paling terang buram.
Menghaluskan: Input hillshade mungkin dipra-smoothing untuk mendapatkan hasil akhir yang lebih baik, lihat Menghaluskan DEM menggunakan GRASS?
Hillshade komposit ( Cara membuat hillshade komposit? ).
Bumped hillshade juga menarik ( deskripsi )
Catatan
- The ambang batas daerah datar di
gdal hillshade
output px = 221 (#dddddd = [221.221.221]), menandai area datar. Selain itu, hillshade's px = 221 membagi gambar antara piksel dalam-bayangan (A <221) dan piksel dalam-cahaya (A> 221) piksel.
- Sebuah ambang batas pengolahan di px = [170-220] sebagai terbukti baik, itu membuat hampir 100% dari mata-terlihat bayangan, yang sendiri hampir tidak berdiri untuk 15-35% dari luas lega.
- Filesize> Compression: final.tif dari # 1, # 2, # 3 adalah ~ 1.3MB tanpa kompresi, kemudian ~ 0.3-0.16MB setelah kompresi, hemat 80%!
- Filesize> memotong: Dari .326KB di # 1, krop warna & opacity (# 2) mencapai 310kb, menghitamkan warna (# 3) mencapai 160kb. Efek pangkas pada filesize adalah antara pengurangan 5 ~ 50% dengan ambang px = 220 dan input saya.