Sumber yang ditautkan menyebutkan "ubah fusi mode menjadi <Multiply>" , sehingga operasi yang harus dilakukan bukan rata-rata sederhana dari hillshades input (untuk ini, lihat juga Bagaimana cara rata-rata gdal_hillshades? ). Itu sesuatu yang lain. Namun, mari kita buat 3 hillshades arah-matahari yang berbeda:
gdaldem hillshade input.tif hillshades_A.tmp.tif -s 111120 -z 5 -az 315 -alt 60 -compute_edges
gdaldem hillshade input.tif hillshades_B.tmp.tif -s 111120 -z 5 -az 355 -alt 60 -compute_edges
gdaldem hillshade input.tif hillshades_C.tmp.tif -s 111120 -z 5 -az 275 -alt 60 -compute_edges
Pertahankan nilai A, B, C terendah
Algoritma pertama yang saya pikirkan adalah untuk memfilter dan menjaga piksel paling gelap, alias piksel dengan nilai lebih rendah di antara input A, B, CA boolean dapat melakukan itu:
gdal_calc.py -A hillshades_A.tmp.tif -B hillshades_B.tmp.tif -C hillshades_C.tmp.tif --outfile=./hillshades_xl.tmp.tif \
--calc="(A*(A<=B)*(A<=C)+ B*(B<A)*(B<=C)+ C*(C<A)*(C<B))"
Daerah yang didominasi oleh bayangan sekarang lebih dari sisi berlawanan dari satu pusat lignt, telah meningkat sebesar 40⁰ di setiap sisi. Tidak seperti tautan yang disediakan, algoritma saat ini tampaknya kehilangan terlalu banyak area pencerahan.
Sudut 315±30⁰
(variasi sudut yang lebih kecil) daripada arus yang 315±40⁰
akan lebih bagus.
Diagram di bawah ini adalah dasar dari persamaan. Ini menunjukkan sumber cahaya A, B, C, dan Boolean perbandingan untuk nilai piksel A, B, C di setiap bagian. Garis kesetaraan membutuhkan perhatian khusus untuk dimasukkan ke dalam Boolean. Garis tengah memiliki nilai 221
untuk sumber cahaya tegak lurus. Pikirkan tentang bidang pengaruh , sumber cahaya terdekat adalah pengaruh utama, dan pengaruh paling jauh yang terlemah.
Pertahankan nilai ekstrem untuk A, B, C
Algoritma Boolean lainnya mungkin untuk menjaga nilai yang paling ekstrem, baik piksel paling gelap maupun paling putih. Diagram berikut membantu untuk menjelaskan tentang rumus Boolean. Untuk setiap keenam lingkaran, ini mengidentifikasi nilai untuk disimpan dari A, B, C, dan Boolean untuk memilih area segitiga ditambah garis persamaan arah jarum jam, dan hanya itu . Ini memberi (dari atas dan searah jarum jam):
--calc="A*(A>B)*(A>=C) + C*(C>A)*(A>=221) + B*(C>A)*(C>=221) + A*(A<B)*(B<=221) + C*(B>A)*(A<=221) + B*(B>A)*(C<=221)"
Jika variasi sudut tidak terlalu penting, bisa memberikan hasil yang baik.
Boolean lainnya
Anda dapat membuat Boolean yang lebih kompleks untuk menutupi seluruh lingkaran menggunakan kombinasi segmen perbatasan apa saja. Tetap penting bahwa hanya satu nilai dari A, B, C yang disimpan untuk satu segmen.
Berkembang biak
Saya melakukan beberapa upaya terarah ke multiply
nilai piksel tanpa formula yang terbukti atau keberhasilan akhir. @ Radouxju menunjukkan bahwa (a*b*c)^(1/3)
(rata-rata GEOMETRIK) dan bukannya rata (a*b*c)/(255*255)
- rata ARITHMETIC dapat bekerja. Rata-rata geometris lebih rendah atau sama dengan rata-rata aritmatika, yang menonjolkan kegelapan area yang diarsir. Saya belum mengujinya.