В связанном источнике упоминается «изменить его режим слияния на <Multiply>» , поэтому выполняемая операция не является простым средним значением входных теней (для этого см. Также Как усреднить gdal_hillshades? ). Это что-то еще. Тем не менее, давайте создадим 3 разноцветных холма:
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
Держите наименьшее значение A, B, C
Первый алгоритм, о котором я расскажу, - это отфильтровать и сохранить самые темные пиксели, то есть пиксели с более низкими значениями среди входных A, B, CA boolean:
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))"
Область, в которой доминируют тени, теперь составляет больше, чем противоположная сторона одного центрального светляка, она была увеличена на 40⁰ с каждой стороны. В отличие от приведенной ссылки, этот текущий алгоритм, похоже, слишком много потерял в области просветления.
Угол 315±30⁰
(меньший угол наклона) скорее, что ток 315±40⁰
будет лучше.
Диаграмма ниже является основой уравнения. Он показывает источники света A, B, C и логическое сравнение значений пикселей A, B, C в каждой части. Линии равенства требуют особого внимания для включения в логическое значение. Срединные линии имеют значение 221
для перпендикулярного источника света. Подумайте об областях влияния , ближайший источник света - главное влияние, а самый слабый - самый слабый.
Сохранить крайние значения для A, B, C
Другим логическим алгоритмом может быть сохранение самых экстремальных значений, как самых темных, так и самых белых пикселей. Следующая диаграмма помогает разобраться в булевой формуле. Для каждой шестой части круга указывается значение, которое нужно сохранить из A, B, C и логическое значение, чтобы выбрать треугольную область плюс линию равенства по часовой стрелке, и только это . Это дает (сверху и по часовой стрелке):
--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)"
Если изменения углов не слишком важны, это может дать хорошие результаты.
Другие логические значения
Вы можете создать более сложное логическое значение для покрытия целых кругов, используя любую комбинацию сегментов границы. Важно, чтобы для одного сегмента оставалось только одно значение из A, B, C.
Умножение
Я сделал несколько неудачных попыток получить multiply
значения пикселей без проверенной формулы или окончательного успеха. @Radouxju указал, что (a*b*c)^(1/3)
(среднее геометрическое ) вместо среднего арифметического (a*b*c)/(255*255)
может работать. Среднее геометрическое ниже или равно среднему арифметическому, что подчеркивает темноту затененных областей. Я еще не проверял это.