3. 地形特征提取:地形粗糙度、地形熵、地形标准差、地形坡度与坡向、特征选择原则
各位同学,咱们今天聊点硬核的——地形特征提取。
说实话,做地形匹配导航,核心就一句话:你得让飞行器认路。怎么认?靠的就是从地形数据里抠出来的那些“特征”。我这些年调试过的系统,十有八九的问题都出在特征选得不对上。你想想看,如果特征本身就没区分度,再牛的匹配算法也白搭。
3.1 地形粗糙度
粗糙度,说白了就是地形的“毛刺感”。
我习惯用这个公式来算:
R = (1/N) * Σ|h(i) - h̄|
其中 h(i) 是窗口内每个格网点的高程,h̄ 是窗口平均高程,N 是格网点数。
嗯,这里要注意:窗口大小很关键。窗口选小了,噪声会被当成特征;选大了,真实的地形起伏又被抹平了。我在某次无人机项目中就吃过这个亏——窗口设成 3×3,结果把一片乱石岗识别成了平坦区域,差点让飞机撞山。
3.2 地形熵
地形熵这个概念,我第一次接触时也觉得有点玄乎。其实它衡量的是地形高程值的“混乱程度”。
公式长这样:
E = -Σ p(i) * log₂(p(i))
p(i) 是第 i 个高程区间出现的概率。
为什么会用到熵?我举个例子你就明白了。一片平坦的沙漠,高程值几乎都一样,熵值就很低。而一片喀斯特地貌,高低错落,熵值就高。地形匹配时,我们当然希望熵值高的区域——信息量大,匹配才可靠。
3.3 地形标准差
标准差,大家应该不陌生。它反映的是地形起伏的剧烈程度。
σ = sqrt((1/N) * Σ(h(i) - h̄)²)
我个人觉得,标准差和粗糙度有点像,但侧重点不同。粗糙度更关注“局部突变”,标准差更关注“整体离散程度”。
实际应用中,我一般把标准差和粗糙度配合使用。比如:
- 标准差大 + 粗糙度大 → 地形剧烈起伏,适合做匹配
- 标准差大 + 粗糙度小 → 可能有缓坡或台阶,要小心
- 标准差小 + 粗糙度小 → 平坦区域,匹配价值低
3.4 地形坡度与坡向
坡度和坡向,这俩是“地形导航”里的老搭档了。
坡度,就是地面倾斜的程度。坡向,就是倾斜的方向。我习惯用 3×3 窗口的差分法来算:
// 坡度计算(度)
slope = atan(sqrt(dz/dx² + dz/dy²)) * 180 / π
// 坡向计算(度,从北顺时针)
aspect = atan2(dz/dy, -dz/dx) * 180 / π
你想想看,为什么坡度坡向重要?因为飞行器飞过山脊时,雷达测距的变化规律和坡度坡向直接相关。我做过一个实验:在坡度 30° 以上的区域,匹配成功率比平坦区域高出 40%。
3.5 特征选择原则
好了,特征都讲完了。但问题来了:这么多特征,到底选哪些?
我总结了几条原则,都是拿真金白银换来的教训:
- 互补性原则:选的特征之间不要高度相关。比如粗糙度和标准差,如果相关系数超过 0.8,留一个就够了。
- 稳定性原则:特征对噪声要鲁棒。我曾经试过用二阶导数做特征,结果数据稍微有点噪声,特征就面目全非了。
- 可区分性原则:特征在不同地形类型之间要有明显差异。比如,平原和山地的熵值差异要足够大。
- 计算效率原则:嵌入式系统资源有限,别选太复杂的特征。我一般控制在 3-5 个特征以内。
下面这张图,是我自己总结的地形特征选择流程:
最后说一句:没有万能特征。我在不同项目里用的特征组合都不一样。山地项目偏爱坡度和粗糙度,平原项目更看重地形熵和标准差。关键是要根据你的应用场景和数据特点来选。
好了,这一章就到这里。记住我上面说的那些坑,做项目时能少走不少弯路。
公众号:蓝海资料掘金营,微信deep3321