PCL去离群点 之SOR和ROR详解
在 Point Cloud Library 里去离群点最经典的就是SORStatisticalOutlierRemoval统计滤波RORRadiusOutlierRemoval半径滤波SOR用“统计分布”找异常点全局思维ROR用“局部密度”找孤立点局部思维一、SOR统计离群点详解核心思想本质用统计学判断“谁不合群” SOR 看每个点“和邻居的平均距离”太远的就是离群点步骤对每个点 pi找 K 个邻居计算这些邻居的平均距离得到所有点的距离分布近似高斯超过阈值的点 → 删除数学直觉这就是StddevMulThresh特点总结自适应自动根据数据分布对随机噪声非常鲁棒在边缘容易误删典型效果去掉“漂浮噪声”点云整体更干净保持结构举例说明假设有一段 1D 点为了简单正常点 0.0, 0.1, 0.2, 0.15, 0.18 离群点 5.0步骤1对每个点找邻居假设 K3比如点 0.1邻居0.0, 0.2, 0.15平均距离点 5.0离群点步骤2统计所有点的“平均距离分布”点平均距离正常点~0.08离群点~4.82步骤3计算均值 标准差步骤4设阈值StddevMulThresh 1值效果小10不稳定中30~50推荐大100平滑但慢值效果0.5删很多激进1.0常用2.0保守pcl::StatisticalOutlierRemovalpcl::PointXYZ sor; sor.setInputCloud(cloud); // 每个点找50个邻居 sor.setMeanK(50); // 标准差倍数越小越严格 sor.setStddevMulThresh(1.0); sor.filter(*cloud_filtered);二、ROR半径离群点详解核心思想用“邻居数量”判断是否孤立步骤对每个点画一个半径 rrr统计邻居数量 NNN如果本质理解空间密度约束正常区域点密集离群点孤零零特点总结直观、可控对“孤立点”非常有效对密度变化敏感致命点r效果小删得多容易误删中推荐大几乎不删值效果小2~5宽松中5~20常用大50严格pcl::RadiusOutlierRemovalpcl::PointXYZ ror; ror.setInputCloud(cloud); // 搜索半径单位米 ror.setRadiusSearch(0.05); // 最少邻居数 ror.setMinNeighborsInRadius(10); ror.filter(*cloud_filtered);三、SOR vs ROR 本质区别重点维度SORROR判断依据距离统计邻居数量是否自适应✅ 是❌ 否对密度变化稳定敏感对孤立点一般很强对边缘易误删保留好参数难度中等高依赖尺度