3.2 数据预处理与特征提取


3.2 数据预处理与特征提取

本节摘要:原始传感器数据不能直接用——点云里有灰尘与悬浮噪点,图像里有光照起伏与无关纹理。本节按"降噪 → 降采样 → 分割 → 特征"的次序讲流水线,每一步都交代丢掉了什么、为什么值得,并给出点云处理的最小代码。

激光雷达看到的"灰尘"

把一台室内激光雷达的原始单帧点云直接可视化,你会看到墙、地面之外还有一层"雾"——悬浮在空气中的噪点:灰尘反光、多径反射、动态物体的残影。扫描匹配算法若把这些点当真,定位就会被"墙根本不在那"的假点云拉偏。预处理的存在理由由此而来:把数据从"物理传感器吐出的样子"整理成"算法需要的样子",并且诚实地记录每次整理丢掉了什么

流水线四步

降噪。点云的统计离群剔除:对每个点统计其半径 r(比如 10 厘米)内的邻居数,少于阈值的判为离群。原理是真实表面上的点必有邻居,悬浮噪点没有。图像侧对应的是高斯滤波与中值滤波,后者对椒盐噪声特别有效。

降采样。一帧室内点云动辄数万点,而扫描匹配的精度收益在点数超过某个量级后趋平。体素滤波把空间切成边长 d 的立方格,每格保留质心(或重心),点数可压掉九成而几何形状基本不变。d 的选择有讲究:定位任务常用 5–10 厘米,建图存档用更细。

分割。把点云按归属拆开:地面、可通行区、障碍物。室内移动机器人最常用的是"法线朝上 + 高度带"的地面判据——估计局部平面法向量,与 z 轴夹角小于 5 度且高度在某带内的点归为地面。地面点对导航是干扰(会跟墙面配准拉偏),对建图却是宝贝。

特征。把"一堆点"压缩成"少量带描述子的关键点"。图像侧是角点与 SIFT/ORB 这类描述子;点云侧是法向量、曲率、平面/边缘基元。特征的价值在"少而稳":扫描匹配只需要几百个稳定特征点就能工作,比用全部点又快又抗噪。

import numpy as np def voxel_downsample(pts, d=0.08): """体素降采样:边长 d 米的格内取质心""" idx = np.floor(pts / d).astype(np.int32) _, first = np.unique(idx, axis=0, return_index=True) return pts[first] # 教学简化:取格内任一点代表 def radius_outlier_reject(pts, r=0.1, min_nb=4): """统计离群剔除:半径 r 内邻居少于 min_nb 的点丢弃""" keep = [] for i, p in enumerate(pts): dist = np.linalg.norm(pts - p, axis=1) if (dist < r).sum() - 1 >= min_nb: keep.append(i) return pts[keep] # 单帧典型数字 # 原始 42000 点 -> 体素 8cm 后 6100 点 -> 离群剔除后 5800 点

第三行的注释数字值得读两遍:两步处理丢掉了 86% 的点,几何轮廓完好无损。这就是预处理的经济学——用可控的信息损失,换取下游算法一个数量级的加速与鲁棒性。

特征提取的两个小例子

平面基元。对每点邻域拟合平面,把"平面大、法线一致"的区域合并成平面基元。室内环境的墙、桌面、柜面都是平面,扫描匹配若改用"平面对平面对齐",比逐点配准更稳——平面无法向歧义、抗噪点。这也是为什么结构化室内环境里点云配准效果好,而空旷广场上"没有平面可抓",匹配质量骤降。

图像角点与描述子。角点是"两个方向上梯度都剧烈变化"的点,角、纹理交点、标记图案的顶点都是。描述子把角点邻域编码成向量,两帧图像间靠向量距离找对应。机器人语境下的经典应用是视觉里程计:连续帧间追踪角点,反推相机自身运动。

图:点云从原始到特征的流水线

图:点云从原始到特征的流水线

丢掉的或许正是要找的

预处理有一条必须警惕的暗面:每一步都在按"常规任务"的假设丢信息。地面分割假设地面平坦——斜坡机器人会被误伤;体素降采样对细杆状障碍(椅子腿、栏杆)不友好——一根 3 厘米的杆在 8 厘米体素里可能整格被平均掉,避障恰恰最需要它。所以成熟的感知栈会按用途维护多条并行的处理分支:定位分支用粗体素,安全避障分支保留原始细密度并单独跑一个"细杆检测"。

💡 关键直觉:预处理不是越干净越好,而是"按下游需要保留信息"。给定位的特征可以丢细节,给安全的点云一条都不能乱丢——两者用同一份原始数据、两套不同口径。

本节要点

  • 流水线四步:降噪、降采样、分割、特征;每步的信息取舍必须显式记录。
  • 体素降采样与统计离群剔除是点云处理的标配,数字上常见"丢九成点、保几何形"。
  • 结构化环境里平面基元是扫描匹配的好特征;空旷无结构环境特征退化,方案要预判。
  • 预处理的暗面是按常规假设丢信息,细杆障碍、斜坡、弱纹理是三处经典翻车点。

图像侧的预处理补充

点云流水线之外,图像侧有对应的四步。降噪对应去模糊与坏点修复;降采样对应金字塔缩放(多尺度表达,让检测在大目标与小目标上都工作);分割对应语义分割或简单的颜色阈值;特征对应角点与描述子。光照是图像预处理躲不开的主题:直方图均衡把过暗过亮的分布拉回可用区间,白平衡校正让"红色盒子在不同灯光下仍是红色"——这两步对下游识别的稳定性贡献常超过换更好的检测模型。值得记住的工程判断:光照不可控的场景,预处理预算要大于模型预算

法线估计:点云分割的地基

3.2 节的地面分割依赖法向量,而法向量本身的估计质量决定了分割上限。估计方法:对每个点取 k 近邻(典型 k 取 10 到 30)拟合局部平面,平面法向量即该点法向;k 的选择是平滑度与细节的交换——k 小保留细节但噪声大,k 大反之。地面判据里的"高度带"参数也有讲究:写死"z 小于 0.1 米算地面"在有坡道的场地必挂,稳健写法是先估计主导平面(用 RANSAC 在全点云里找最大的平面基元),再把该平面定义为地面、以它为基准定义高度带。这个细节区分了"实验室能跑"与"现场能跑"。

问题:预处理参数怎么定才不是玄学

给每个参数找一个可观察的依据。体素边长:取下游配准容许误差的二分之一(定位容差 5 厘米则体素取 2.5 厘米上下);离群剔除的邻居数:按点云密度的统计分布取尾部(比如要求保留 99% 的表面点);法线的 k:观察可视化结果里"细节是否被抹平"。原则是参数跟着下游指标走、跟着数据统计走,而不是在仿真里凭感觉试。参数定了之后冻结并写进配置管理——参数漂移是感知系统"越跑越差"的常见原因。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U