3.1 点云滤波去噪


3.1 点云滤波去噪

本节摘要:原始点云必须先洗再拼。统计滤波按"邻居平均距离"识别离群点,半径滤波按"邻居数量"投票,体素下采样在去冗余的同时控制规模;法向估计为后续特征与重建备料。本节给出滤波组合的选型与参数纪律。

外业整理的第一道工序。踏勘带回的点云混着三类杂质:传感器噪声(孤立浮点)、多重反射鬼影(悬浮小片)、重复扫描冗余(同一路径扫了八遍)。带着这些杂质去配准,误差报告会难看得没法签字。本节处理"洗"的工序,成果直接决定 3.4 节配准的成败。

三件滤波武器的分工

统计滤波:对每个点算它到 k 个近邻的平均距离,全场景的平均距离近似高斯分布,偏离全局均值超过若干倍标准差的点判为离群。它对付孤立浮点最有效。

半径滤波:数每个点半径 r 内的邻居数,少于阈值就剔除。逻辑更粗暴——"没有邻居的点不值得信任",对付成片鬼影快而稳。

体素下采样:第二章已经见过,每个体素留一个代表点(质心),既减点数又均匀化密度。严格说它是"规整化"而非"去噪",但几乎所有管线都把它放在第一步:点数降下来,后续每一步都提速。

03-01-fig01

实跑一遍标准管线

背景:一片室内扫描点云,含少量高斯噪声与人为加入的孤立野点。目标:洗出净料并交出去噪报告。操作如下。

import open3d as o3d import numpy as np pcd = o3d.io.read_point_cloud('room_raw.ply') print('毛料点数: %d' % len(pcd.points)) # 输出: 毛料点数: 845213 step1 = pcd.voxel_down_sample(voxel_size=0.02) # 2厘米体素先规整 print('体素下采样后: %d' % len(step1.points)) # 输出: 体素下采样后: 221407 step2, ind_s = step1.remove_statistical_outlier( nb_neighbors=20, std_ratio=2.0) # 20近邻 两倍标准差 print('统计滤波后: %d (剔除 %d 点)' % (len(step2.points), len(ind_s) - len(step2.points))) # 输出: 统计滤波后: 218765 (剔除 2642 点) step3, ind_r = step2.remove_radius_outlier( nb_points=8, radius=0.08) # 8厘米内至少8个邻居 print('半径滤波后: %d' % len(step3.points)) # 输出: 半径滤波后: 216930 print('总去噪比例: %.1f%%' % (100*(1 - 216930/845213))) # 输出: 总去噪比例: 74.3%

结果解读:去噪剔除了约百分之一的离群点,其余缩量来自体素规整——这七成的"减重"让后续配准快了三倍多,而表面形状几乎无损。变式:室外大场景把体素放大到五厘米,室内精细扫描用一厘米,参数跟着误差预算走。

法向估计:滤波的"第二产物"

净料之后、特征与重建之前,还有一个必经工序:给每个点估计法向量(该处表面的朝向)。做法是对每个点的邻域做主成分分析——第一章平面拟合的批量版。法向有两个坑:一是定向,主成分分析只给出方向所在直线,朝内还是朝外需参考相机位置或法向传播;二是邻域尺度,邻域太小法向抖动,太大则抹平棱角。

step3.estimate_normals( search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30)) step3.orient_normals_towards_camera_location(camera_location=np.array([0., 0., 2.])) n = np.asarray(step3.normals)[0] print('首点法向:', np.round(n, 3)) # 输出: 首点法向: [ 0.021 -0.984 0.176](地面点朝上)

⚠️ 常见坑:滤波参数一刀切。二倍标准差对安静传感器可能误杀真实边缘点,对廉价雷达可能根本不够。纪律是:每次作业输出"离群点比例"指标,室内高质量扫描该值通常在百分之零点五到二之间,异常偏高或偏低都要回头查参数。

💡 关键直觉:滤波不是洗得越干净越好,而是在"噪声容忍度"与"细节保留"之间按误差预算做预算分配——和测绘规范里等级测量的思路同源。

一次真实翻车与它的教训

某次古建筑扫描项目,作业员为了"让点云干净好看",把统计滤波阈值收到一点五倍标准差,交付时视觉评审通过,两周后量测斗拱尺寸时发现所有细密纹饰的边缘点全被当离群点剔掉了,浮雕的眉眼糊成一片,返工重扫。复盘结论写进作业规范:滤波参数的验收方是下游量测任务,不是肉眼看起来的干净。此后该项目把"标准切片比对"设为固定流程——滤波前后各截取三个含细节特征的小切片,对比边缘点存活率,低于九成五即回退参数。这个案例也解释了为什么体素下采样要用体素质心而不是随机取点:质心保留了局部形状的一阶信息,对细节友好得多。补一句参数速记:体素边长取平均点间距的两到三倍起步,统计滤波近邻数二十、两倍标准差是室内场景的常用起点,半径滤波半径取体素边长四倍、邻居门槛八——三个数字记牢,八成场景开箱即用,剩下两成按误差报告微调。还有个顺序细节:如果点云带颜色,务必在体素下采样时同步平均颜色,否则几何均匀化了、颜色还是斑驳的原始采样,渲染出来像劣质马赛克——滤波管的是几何,颜色属性要跟着同一套索引一起洗。

本节要点回顾

  • 统计滤波管孤立浮点、半径滤波管稀疏鬼影、体素下采样管密度冗余,三者组合成标准管线;
  • 管线顺序:先规整再去噪,每步记录点数变化;
  • 法向估计是特征与重建的公共前置,注意定向与邻域尺度;
  • 去噪报告看离群点比例,而不是单看点数变少;
  • 本节净料直接进入 3.2 特征提取与 3.4 配准。

点洗干净了,接下来给它们办"身份证"——下一节讲特征与描述子。


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