PCL之RANSAC
RANSAC 学习路线与原理框架:从几何本质到工程应用
该博客非vip, 如果被改为vip请后台联系。
一、前言
在点云处理、计算机视觉和几何估计中,经常会遇到这样一类问题:
- 想从一堆点中拟合一条直线
- 想从点云中提取一个平面
- 想从带噪数据中找到主要几何结构
如果数据中只有少量高斯噪声,那么最小二乘往往已经够用。
但现实工程中,数据里通常还会混入很多外点(outliers),例如:
- 测量误差较大的异常点
- 背景干扰点
- 错误匹配点
- 其他结构上的点
- 浮点噪声或毛刺点
这时候,普通最小二乘往往会被这些外点严重带偏。
RANSAC(Random Sample Consensus)正是在这种背景下提出的一种经典鲁棒估计方法。
它的核心目标不是“单纯拟合一个模型”,而是:
在存在大量外点的情况下,仍然找到由主要内点支持的几何模型。
本文从学习路线的角度,系统整理 RANSAC 应该怎么学,以及它背后的几何本质、数学逻辑、工程意义和实践建议。
二、RANSAC 到底在解决什么问题
2.1 模型估计问题
很多几何任务,本质上都是模型估计问题。
例如:
- 用两点确定一条直线
- 用三点确定一个平面
- 用点集拟合圆、圆柱、球面
这些任务本质上都是:
已知一组观测数据,求一个最能解释这些数据的几何模型参数。
2.2 为什么普通最小二乘会失败
最小二乘法的前提通常是:
- 大部分点都来自同一个真实模型
- 噪声是小扰动
- 没有严重离群点
但在实际数据中,往往会有一部分点根本不属于目标模型。
例如拟合一条直线时,数据中可能混有很多随机点。
这时如果直接最小二乘,结果会出现两个问题:(因为最小二乘优化的是整体目标函数最优, 因此噪声越多最小二乘越差)
- 模型被少量大偏差点拉偏
- 模型不再代表真正的主结构
因此,问题不再只是“拟合”,而是:
在一堆混杂数据中,先识别出哪些点支持同一个模型。
这正是 RANSAC 的出发点。
三、RANSAC 的核心思想
RANSAC 的名字可以拆成两部分:
- Random Sample:随机采样
- Consensus:一致性
它的核心思想可以概括成一句话:
通过不断随机抽取最小样本集生成模型假设,再用全体数据验证这个模型能获得多少支持,最终选择支持最多的模型。
这个思想可以分成四步。
3.1 第一步:随机抽取最小样本集
对于某种几何模型,先随机抽取一组足以确定模型的最小点集。
例如:
- 直线:2 个点
- 平面:3 个点
- 圆:3 个点
这组点叫做最小采样集(Minimal Sample Set)。
3.2 第二步:由样本生成模型假设
利用这组最小样本,直接求出一个候选模型。
例如:
- 两点求一条直线
- 三点求一个平面
这一步生成的模型叫做假设(Hypothesis)。
3.3 第三步:用所有点验证该模型
把这个候选模型拿去检查所有数据点,判断每个点到该模型的距离是否小于某个阈值。
如果满足:
d(pi,model)<τ d(p_i,\text{model}) < \tau d(pi,model)<τ
那么该点就被认为是这个模型的内点(Inlier)。
所有内点组成的集合,叫做该模型的一致集(Consensus Set)。
3.4 第四步:重复多次,选最优模型
不断重复以上过程。
最后选择:
- 内点数最多的模型
- 或者得分最高的模型
再进一步,可以使用最终内点集进行一次更稳定的精拟合。
四、RANSAC 为什么有效
RANSAC 并不是因为“随机”就神奇,而是因为它利用了一个非常关键的事实:
只要某一次随机采样恰好全部来自真实内点,那么由这些点生成的模型大概率就接近真实模型。
而一旦模型接近真实模型,它就会吸引大量真正的内点,形成一个大的 consensus set。
因此,RANSAC 的本质其实是:
通过反复随机采样,去碰撞出一个纯内点的最小样本集。
只要这个“纯内点采样”发生过一次,模型通常就有机会被恢复出来。
五、RANSAC 的数学核心:迭代次数公式
理解 RANSAC,最关键的数学部分之一就是:
为什么它需要多次迭代,以及需要多少次迭代。
设:
如果每个点独立地以概率 ( w ) 成为内点,那么一次随机抽取 ( s ) 个点,并且这 ( s ) 个点全是内点的概率为:
ws w^s ws
因此,一次采样失败的概率为:
1−ws 1 - w^s 1−ws
连续 ( N ) 次都失败的概率为:
(1−ws)N (1 - w^s)^N (1−ws)N
因此,至少成功一次的概率为:
1−(1−ws)N 1 - (1 - w^s)^N 1−(1−ws)N
如果希望这个概率不低于 ( p ),则要求:
1−(1−ws)N≥p 1 - (1 - w^s)^N \ge p 1−(1−ws)N≥p
整理得到:
N≥log(1−p)log(1−ws) N \ge \frac{\log(1-p)}{\log(1-w^s)} N≥log(1−ws)log(1−p)
这就是 RANSAC 最经典的迭代次数公式。
六、如何理解这个公式的工程意义
这个公式不是只用来背的,它有非常直接的工程含义。
6.1 内点比例越高,越容易成功
如果 ( w ) 越大,则 wsw^sws 越大,说明一次抽到“纯内点样本”的概率更高,需要的迭代次数也更少。
这意味着:
预处理越好,外点越少,RANSAC 越容易成功。
6.2 最小采样点数越多,越难成功
如果 ( s ) 越大,则wsw^sws 会迅速减小。
例如:
- 直线只要 2 个点
- 平面要 3 个点
- 更复杂模型可能需要更多点
这意味着:
模型越复杂,RANSAC 往往越难,所需迭代次数越高。
6.3 置信度越高,计算代价越大
如果你希望成功概率 ( p ) 非常高,例如 0.99 甚至更高,那么所需迭代次数会增加。
这意味着:
“更高把握”通常要用更多计算换取。
七、RANSAC 中最关键的参数:距离阈值
如果说迭代次数是 RANSAC 的数学核心,那么距离阈值就是它最关键的工程参数。
7.1 阈值的本质
RANSAC 中的阈值,本质上是在定义:
一个点距离模型多近,才算支持这个模型。
例如:
- 点到直线的距离
- 点到平面的距离
- 点到圆柱面的距离
这不是一个随便调的数,而是一个几何判别尺度。
7.2 阈值过小会怎样
如果阈值太小:
- 原本属于模型的真实内点,也可能因为噪声被排除
- 内点数会偏少
- 正确模型不容易被识别出来
- 结果对噪声更敏感
7.3 阈值过大会怎样
如果阈值太大:
- 许多本不属于模型的点也会被当作内点
- 一致集被污染
- 不同结构容易混在一起
- 后续精拟合会受到影响
7.4 阈值应该怎么定
阈值的设置应当与以下因素相关:
- 传感器精度
- 点云噪声水平
- 采样分辨率
- 重建误差尺度
- 模型尺寸大小
- 后续任务允许的偏差范围
对于工业点云任务来说,阈值通常应该和:
- 线扫采样精度
- 结构光重建误差
- ROI 后残余噪声水平
联系起来理解,而不能脱离数据尺度孤立设定。
八、RANSAC 在点云中的典型作用
RANSAC 在点云处理中非常常见,尤其适合下面这些任务:
- 平面提取
- 直线提取
- 圆柱提取
- 球面提取
- 初步几何分割
但学习时必须建立一个正确认识:
RANSAC 更擅长“粗提取主结构”,而不是直接给出最终高精度结果。
也就是说,它的长处通常是:
- 从外点很多的数据中找出主模型
- 提取内点集
- 给出较好的初始模型
后面常常还需要:
- 最小二乘精拟合
- TLS 精拟合
- PCA 精修
- 加几何约束优化
因此,在工程流程中,RANSAC 往往扮演的是:
鲁棒初始化 / 粗分割 / 内点提取 的角色。
九、RANSAC 的常见失败模式
RANSAC 虽然经典,但绝不是万能的。
理解它什么时候失效,同样重要。
9.1 内点比例太低
如果数据中真正支持目标模型的内点比例太低,那么抽到纯内点最小样本的概率就会非常小,RANSAC 很容易失败。(50%以下 失败率就会高)
9.2 存在多个规模接近的模型
如果数据中有两条点数差不多的直线,或者多个平面规模接近,那么 RANSAC 可能会不稳定,结果依赖随机采样过程。
9.3 阈值设置不合理
阈值太小会导致真实内点被排除,阈值太大会导致结构混杂,都会让结果变差。
9.4 采样配置退化
即使抽到的点看起来来自内点,如果这些点本身处于退化配置,例如过于接近、几何约束不足,也可能导致模型不稳定。
9.5 数据不是“少量离群点 + 一个主模型”
如果数据本身不是这种结构,而是多个复杂结构强烈交叠,那么单一 RANSAC 往往不够,需要结合:
- 聚类
- 先验几何约束
- 多模型分解
- 其他鲁棒估计方法
10.1 为什么建议手写
(下篇补代码)
如果你只调用 PCL 或 Open3D 的 RANSAC 接口,你会“用”,但未必真正理解:
- 最小采样集怎么选
- 模型是怎么从样本点解出来的
- 点到模型距离怎么定义
- 阈值在判断什么
- 一致集是怎么形成的
- 为什么结果会有随机性
- 为什么 RANSAC 常常要接精拟合
而如果你手写过一版,这些都会一下子变得清晰。
10.2 最值得手写的版本
最推荐的顺序是:
第一版:2D 直线 RANSAC
这是最适合入门和吃透原理的版本。
原因:
- 模型简单
- 距离公式清晰
- 可视化方便
- 可以直观看到外点、内点、阈值和结果变化
第二版:3D 平面 RANSAC
这是和点云任务最接近的一版。
原因:
- 平面是点云中最常见的结构之一
- 很适合和 PCL 的
SACSegmentation对应理解 - 可以自然过渡到真实点云任务
10.3 手写到什么程度算合适
建议你至少手写以下内容:
- 随机采样
- 由最小样本解模型
- 计算所有点到模型距离
- 根据阈值统计内点数
- 重复迭代,保存最优模型
- 最后用最佳内点集再精拟合一次
如果你把这条链手写通了,RANSAC 的理解会非常扎实。
十一、问题测试
如果想判断自己是否真正学懂了 RANSAC,可以用下面几个问题自测。
原理层
-
RANSAC 和最小二乘最本质的区别是什么?
最小二乘默认所有数据都参与模型估计,因此对外点敏感;RANSAC 的核心思想是先通过随机采样和一致性验证,将支持同一模型的内点集找出来,再基于这些内点估计模型。(一个直接使用所有点, 一个是先筛选内点) -
为什么随机采样会有效?
随机采样之所以有效,是因为只要某一次采样恰好全部来自真实内点,那么由这组点生成的模型就大概率接近真实模型;一旦模型接近真实模型,它就会得到大量真实内点的支持,从而形成大的 consensus set。经过足够多次随机采样后,抽到纯内点最小样本集的概率就会越来越高。 -
为什么 RANSAC 适合外点多的场景?
RANSAC 适合外点多的场景,是因为它不依赖所有数据共同参与模型估计,而是通过随机抽样寻找纯内点最小样本集。即使外点很多,只要内点比例不是低到几乎无法抽中,经过足够多次迭代,仍有机会找到真实模型。
数学层
-
迭代次数公式怎么来的?
设内点比例为 ( w ),每次最小采样点数为 ( s ),则一次采样全部为内点的概率为 wsw^sws,一次失败的概率为1−ws1-w^s1−ws,连续 ( N ) 次都失败的概率为(1−ws)N(1-w^s)^N(1−ws)N。因此至少成功一次的概率为1−(1−ws)N1-(1-w^s)^N1−(1−ws)N。若希望该成功概率不低于给定阈值 ( p ),就可以推导出 RANSAC 的迭代次数公式。 -
为什么内点率越低,迭代次数越高?
因为一次成功采样要求最小样本集中的所有点都来自内点。当内点率降低时,抽到纯内点样本的概率 wsw^sws会明显下降,因此为了保证至少成功一次,需要更多次迭代。 -
为什么模型最小采样点数越大,成功越难?
因为一次成功采样的概率是wsw^sws。当最小采样点数 ( s ) 增大时,wsw^sws 会迅速减小,因此抽到纯内点最小样本集的难度会显著增加。
工程层
-
阈值的几何意义是什么?
阈值的几何意义,是判断一个点相对于某个候选模型的误差是否足够小,从而决定该点是否属于该模型的内点。这个误差通常表现为点到模型的距离或残差,例如点到直线的正交距离、点到平面的垂直距离等。 -
阈值过大和过小分别会怎样?
阈值过大时,原本不属于该模型的外点也会被纳入内点集,导致一致集被污染,模型区分能力下降;阈值过小时,一些受到噪声扰动但本应属于模型的真实内点会被排除,导致内点数不足,甚至错失正确模型。 -
为什么 RANSAC 常常只是粗提取,而不是最终结果?
因为 RANSAC 的主要目标是鲁棒地找到主模型及其对应的内点集,而不是在所有内点上做最优精度估计。它更像一个“粗提取 + 内点筛选”步骤,后续通常还需要基于最佳内点集做最小二乘、TLS 或其他精拟合,才能得到更稳定、更精确的最终结果。
项目层
-
在自己的数据中,RANSAC 更适合提什么结构?
在自己的数据中,RANSAC 更适合提取线和平面这类参数化简单、局部主结构明显的几何模型。例如在线扫数据中提取主边缘线,在结构光点云中提取主平面区域,这类任务都比较适合先用 RANSAC 做鲁棒粗提取。 -
哪些预处理会影响 RANSAC 效果?
会影响 RANSAC 效果的预处理包括:ROI 截取、统计滤波 / 半径滤波、去除漂浮点、聚类分割以及下采样。这些操作会直接改变外点比例、点云密度和结构完整性,从而影响 RANSAC 成功率与阈值设置。 -
在自己的任务里,RANSAC 最容易失败在哪些地方?
在自己的任务里,RANSAC 最容易失败的情况包括:数据中存在多个规模接近的直线或平面,直接拟合会不稳定;ROI 或分割不合理,导致目标结构和干扰结构混在一起;阈值设置不合适,导致内点不足或一致集污染;目标结构本身点数太少,内点比例过低。因此在实际使用时,往往需要先做分割或预处理,再进行 RANSAC。
十三、小结
RANSAC 是一种经典的鲁棒模型估计方法,它真正解决的问题不是单纯拟合,而是:
在包含大量外点的数据中,找到由主要内点支持的几何模型。
它的核心思想是:
- 随机抽取最小样本集
- 生成候选模型
- 用全体数据验证一致性
- 选择支持最多的模型
其背后的关键数学是成功概率和迭代次数公式,关键工程问题是阈值设置和内点比例。
在点云处理中,RANSAC 非常适合做:
- 粗提取主结构
- 内点筛选
- 初始模型生成
但通常还需要结合精拟合,才能得到更高精度的最终结果。
如果想真正学懂 RANSAC,最好的方式不是只会调库,而是:
先吃透原理,再手写一版,再回到 PCL/Open3D 中理解工程实现。
十四、后续学习建议
在理解 RANSAC 原理之后,建议继续推进下面几个方向:
- 手写 2D 直线 RANSAC
- 手写 3D 平面 RANSAC
- 学习 PCL 中的
SACSegmentation - 学习 RANSAC 后的精拟合方法(TLS / 最小二乘 / PCA)
- 结合自己的线扫或结构光数据,分析阈值、噪声和预处理对结果的影响
如果这些都打通,RANSAC 就不再只是一个“调用函数”,而会真正变成你可分析、可控制、可解释的工具。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)