Membuat hillshade transparan?

34

Saya mendapatkan bukit transparan yang elegan melalui kombinasi gdaldan convert. Dibandingkan dengan hillshade berbasis abu-abu yang biasa digunakan, hillshade transparan seperti itu sangat keren karena dapat ditempatkan di antara latar belakang peta dan lapisan atas lainnya (jalan, buiding) untuk memberikan rasa 3D apa pun jenis dan warna latar belakangnya.

Bagaimana itu bekerja

Caranya: Dimulai dengan hillshade skala abu-abu yang dihasilkan oleh gdal hillshade, triknya adalah untuk mengambil nilai-nilai saluran abu-abu, membalikkan setiap nilai, dan mengalirkan hasil ini ke saluran opacity baru. Piksel hitam [0,0,0] menjadi [0,0,0255] (opacity = 255), piksel abu-abu [120.120.120] semakin rendah menjadi [120.120.120.135] (opacity = 135, alias 255-120), piksel putih [255.255.255] menjadi transparan [255.255.255,0] (opacity = 0, alias 255-255) dan seterusnya. Nuansa bukit yang buram dan hitam , dataran semakin transparan (putih) . Secara konseptual, persamaan pita piksel adalah sesuatu seperti:

alpha_value([0])    = 255-0 = 255;   // black pixels get full opacity
alpha_value([Grey]) = 255-Grey;
// grey pixels get 255-GreyValue opacity.
alpha_value([255])  = 255-255 = 0  // white pixels get null opacity !

Untuk video yang santai tentang pendekatan ini, dijelaskan oleh desainer Photoshop, lihat Menambahkan Relief Berbayang di Photoshop (16 menit).

Pertanyaan

Mengambil hillshade berbasis abu-abu berbasis ETOPO atau SRTM ( gdaldem hillshade crop_xl.tmp.tif shadedrelief.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges, file tersedia untuk diunduh di sini ) sebagai input ...

... Bagaimana melakukan trik yang dikutip di atas melalui gdal atau cara lain yang tidak merusak GIS pada file .tif tersebut?

Perhatikan bahwa saya ingin menjaga properti GIS (geolocalisation).

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Hugolpz
sumber
1
Bergantung pada bagaimana data referensi disimpan dalam tiff, mungkin semudah mengganti nama file dunia yang terkait dengan tiff.
Steve
@Steve: ini untuk file .tif yang dihasilkan dari raster seperti SRTM atau ETOPO setelahgdaldem hillshade etopo_crop.tif shadedrelief.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges
Hugolpz
Saya pikir gdal_tranlatedengan kombinasi -b band , -mask band , -perbaikan abu - abu | rgb | rgba bersama-sama dengan formula opacity=-(px_grey_value)+255mungkin cara untuk pergi, tapi saya tidak pernah menyentuh band dan saya masih tidak tahu apa-apa.
Hugolpz
Sudahkah Anda mencoba gdal_edit.py untuk menulis ulang koordinat, ukuran sel, dan sistem referensi?
radouxju

Jawaban:

42

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 hillshademenghasilkan 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). NoDataValuepiksel 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

hillshade.tmp.tif

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_calcdapat 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 hillshadeabu-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

hillshade.tmp.tif # 1, opacity.tif # 1, final.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 2ditambahkan, namun, piksel ini menyimpan berbagai nilai -b 1opacity 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

# 2, color.tif (terpotong) # 2, opacity.tif (terpotong) # 2, final_crop.tif

3. Selanjutnya -b 1 optimasi (memotong + menghitamkan)

Karena kami memiliki band opacity progresif yang -b 2diandalkan, kami dapat membuat -b 1piksel 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

# 3, color.tif # 2, opacity.tif (terpotong) # 3, 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:

Perbandingan proses # 2 (kiri) dan # 3 (kanan), tampilan umum.

Zoom, harap perhatikan bayangan (sebelum vs sesudah):

Perbandingan proses # 2 (kiri) dan # 3 (kanan), tampilan detail.

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 hillshadeoutput 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.
Hugolpz
sumber
2
Mendorong +1 selamat datang.
Hugolpz
2
Tutorial selesai. Bahasa Inggris saya mungkin rusak, jangan ragu untuk meningkat.
Hugolpz
3
Meskipun Anda harus menjawab sendiri utas ini adalah tutorial yang sangat bagus tentang banyak pertanyaan mengenai hillshading. Sudah selesai dilakukan dengan baik!
Kersten
Tutorial Anda hanya berfungsi. Kerja bagus. Bisakah Anda mempertimbangkan untuk menjawab pertanyaan saya => di sini ? Apakah mungkin membuat .ovr untuk GeoTIFF jenis ini, skala abu-abu dengan pita alpha?
sandthorn
1
Halo @sththorn, meskipun cintaku untuk itu aku tidak di bidang ini lagi. Biaya untuk menemukan jawabannya kemungkinan akan lebih tinggi untuk saya-2018 daripada untuk Anda-2018. Semoga barang saya menunjuk ke arah yang benar untuk masalah Anda!
Hugolpz
7

Cara lain untuk mendapatkan hasil yang sama dari kanvas non-abu-abu yang lebih cocok untuk digabungkan dengan lapisan lain adalah opsi 'gabungan' di gdaldem.

Ini melakukan kemiringan lereng dan bukit dan menggabungkan keduanya dalam satu operasi. Area 0 lereng berwarna putih. Area dengan kemiringan 90 derajat berwarna hitam untuk naungan kemiringan, dengan beberapa pencahayaan ditambahkan oleh layer hillshade.

gdaldem hillshade -combined -compute_edges infile outfile.tif

Kemudian gunakan mode penggabungan lapisan multiply untuk 'menggantungkan' ini di atas lapisan lain.

Penandaan bukit standar / gabungan

Hillshading standar

Kombinasi shading dikalikan dengan lapisan dasar OSM (opacity sekitar 50%) Kombinasi shading dikalikan dengan lapisan dasar OSM

rampok
sumber
2

gdal+ convertalur kerja berbasis

Ada solusi gdal+ convertyang memberikan hasil visual yang baik. Masalah dengan solusi ini adalah yang convertmenghancurkan informasi geografis yang kemudian harus Anda pulihkan. Ini meningkatkan jumlah aksi untuk dijalankan.

# Basic crop
gdal_translate -projwin 67 35.92 99 5 ../data/noaa/ETOPO1_Ice_g_geotiff.tif crop_xl.tmp.tif
# Grey-based hillshade
gdaldem hillshade crop_xl.tmp.tif shadedrelief.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges
# create a transparent hillshade:
convert shadedrelief.tmp.tif -fuzz 7% -fill "#FFFFFF" -opaque "#DDDDDD"  whited.jpg # makes all grey values white to lighten the filesize
convert whited.jpg -alpha copy -channel alpha -negate +channel trans.png # <=== TRICK HERE.
# Restore georeferencing & reproject            
gdal_translate -a_ullr 67 35.92 99 5 trans.png trans.tmp.gis.tif
gdalwarp -s_srs EPSG:4326 -t_srs ESPG:3857 ./trans.tmp.gis.tif ./trans_reproj.tmp.gis.tif
# Compress from 11MB to 2MB:
gdal_translate -co COMPRESS=LZW -co ALPHA=YES ./trans_reproj.tmp.gis.tif ./trans.gis.tif

Untuk penjelasan perintah 4, lihat: https://stackoverflow.com/a/23018544/1974961

Hugolpz
sumber