3. 地形特征提取:地形粗糙度、地形熵、地形标准差、地形坡度与坡向、特征选择原则

各位同学,咱们今天聊点硬核的——地形特征提取。

说实话,做地形匹配导航,核心就一句话:你得让飞行器认路。怎么认?靠的就是从地形数据里抠出来的那些“特征”。我这些年调试过的系统,十有八九的问题都出在特征选得不对上。你想想看,如果特征本身就没区分度,再牛的匹配算法也白搭。

3.1 地形粗糙度

粗糙度,说白了就是地形的“毛刺感”。

我习惯用这个公式来算:

R = (1/N) * Σ|h(i) - h̄|

其中 h(i) 是窗口内每个格网点的高程,h̄ 是窗口平均高程,N 是格网点数。

嗯,这里要注意:窗口大小很关键。窗口选小了,噪声会被当成特征;选大了,真实的地形起伏又被抹平了。我在某次无人机项目中就吃过这个亏——窗口设成 3×3,结果把一片乱石岗识别成了平坦区域,差点让飞机撞山。

我的经验:对于 30 米分辨率的 DEM 数据,窗口取 5×5 或 7×7 比较稳妥。如果是激光雷达点云数据,可以适当缩小。

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%。

小技巧:坡向是循环变量(0° 和 360° 是一样的),做特征匹配时别直接拿数值去比。我一般会转成 sin/cos 分量来处理。

3.5 特征选择原则

好了,特征都讲完了。但问题来了:这么多特征,到底选哪些?

我总结了几条原则,都是拿真金白银换来的教训:

  1. 互补性原则:选的特征之间不要高度相关。比如粗糙度和标准差,如果相关系数超过 0.8,留一个就够了。
  2. 稳定性原则:特征对噪声要鲁棒。我曾经试过用二阶导数做特征,结果数据稍微有点噪声,特征就面目全非了。
  3. 可区分性原则:特征在不同地形类型之间要有明显差异。比如,平原和山地的熵值差异要足够大。
  4. 计算效率原则:嵌入式系统资源有限,别选太复杂的特征。我一般控制在 3-5 个特征以内。

下面这张图,是我自己总结的地形特征选择流程:

地形特征选择流程 原始 DEM 数据 数据清洗与滤波 特征计算 粗糙度 | 地形熵 | 标准差 | 坡度 | 坡向 特征选择(互补性+稳定性+可区分性) 特征向量(3-5维) 原则: • 特征间低相关 • 对噪声鲁棒 • 地形区分度高 • 计算开销小

最后说一句:没有万能特征。我在不同项目里用的特征组合都不一样。山地项目偏爱坡度和粗糙度,平原项目更看重地形熵和标准差。关键是要根据你的应用场景和数据特点来选。

总结一下:地形特征提取,不是把能算的都算一遍就完事了。你得理解每个特征的物理含义,知道它适合什么场景,有什么局限性。这才是工程师和“调包侠”的区别。

好了,这一章就到这里。记住我上面说的那些坑,做项目时能少走不少弯路。


公众号:蓝海资料掘金营,微信deep3321