链接的源提到“将其融合模式更改为<乘>”,因此要做的操作不是输入山形阴影的简单平均(为此,另请参见如何平均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布尔值中值较低的像素可以做到这一点:
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)
(GEOMETRIC均值)可以代替ARITHMETIC均值(a*b*c)/(255*255)
。几何平均值小于或等于算术平均值,这加重了阴影区域的黑暗度。我还没有测试。