RANSAC和Flitline

本文对比了RANSAC和FitLine两种算法的特点及适用场景。RANSAC是一种随机算法,通过迭代找出最佳模型参数;FitLine则通过遍历所有点来计算直线。RANSAC适用于已知模型的情形,而FitLine更适用于计算量较小的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【blog算法原理】RANSAC和FitLine

     ​ 如果已经有一系列图片,需要拟合出最为合适的一条直线出来,这个时候你会选择RANSAC还是FitLine。

一、算法定义;

 RANSAC是实际运用非常广泛的算法,它的数学表示为

"Ransac 是解决这类问题的代表性算法。它是一种随机算法,步骤如下:

输入:k,n,t,d,model,data
BestModel = null;
迭代k次——
(1) 从data中随机取出n个点,用这n个点去拟合model和模型的model,将得到的带参数的model记为MaybeBestModel。
(2) 依次取出剩下的点,计算该点对应MaybeBestModel模型的误差,如果这个误差小于阈值t,则认为这个点是有效的,把这个点也放进MaybeBestModel中。
(3) 所有点取完了。这时,MaybeBestModel中有效点的数量是否大于或等于d,如果是,则对于MaybeBestModel,重新计算一下它的模型参数。

(4) 评估一下MaybeBestModel和BestModel哪一个好?如果MaybeBestModel更好,则将MaybeBestModel 记做新的 BestModel。"

       而FitLine的官方定义为:

基本上的思路还是生成直线之后,遍历所有的点,并且采用不同的方法计算结果:

二、运用场合

     在opencv中,已经实现了FitLine的算法;但是关于RANSAC还自己编写一些程序。除此之外,我认为,RANSAC的最总要特征在于“它假设了一个模型”,如果我已经知道模型就是直线,那么使用FitLine会更直接。

      特别是在一些计算量不是非常大的情况下,综合考虑所有的点之间的关系肯定随机取出一些点然后判断的结果要好一些。





转载于:https://www.cnblogs.com/jsxyhelu/p/5174348.html

### RANSAC PCA 的基本概念 随机采样一致性 (Random Sample Consensus, RANSAC)[^1] 是一种通过迭代方式估计数学模型参数的方法,特别适用于存在大量离群点的数据集。它通过对数据子集反复抽样来寻找最佳拟合模型。 主成分分析 (Principal Component Analysis, PCA)[^2] 则是一种统计方法,用于降维并提取数据的主要特征方向。在直线拟合场景下,PCA 可以用来找到一组数据点的最佳拟合直线。 --- ### RANSAC 在线性拟合中的应用 RANSAC 方法的核心在于其鲁棒性,能够有效处理含有噪声异常值的情况。以下是具体过程: - **初始化**: 随机选取最小数量的数据点(对于直线拟合而言通常为两点),构建初始假设模型。 - **验证**: 使用剩余未参与建模的点测试当前模型的有效性,计算内点比例。 - **优化**: 不断重复上述步骤直至达到预设条件(如最大迭代次数或足够高的置信度)。最终选择具有最多支持者的模型作为最优解。 这种方法非常适合于计算机视觉领域内的任务比如图像配准或者三维重建等场合,在这些地方经常遇到由于遮挡等原因造成的错误测量值即所谓的外点(outliers)问题[^3]。 ```python import numpy as np from sklearn.linear_model import RANSACRegressor from sklearn.datasets import make_regression # Generate synthetic data with outliers X, y = make_regression(n_samples=100, n_features=1, noise=10, random_state=42) y[-10:] += 50 # Add some artificial outliers at the end of dataset. ransac = RANSACRegressor() ransac.fit(X, y) inlier_mask = ransac.inlier_mask_ outlier_mask = ~inlier_mask ``` --- ### PCA 在线性拟合中的应用 相比之下,PCA 更关注整体趋势而忽略局部细节差异。当给定一系列二维空间上的散乱分布坐标集合时,可以通过如下操作实现简单的一次函数形式回归线条描绘工作流程描述如下所示: - 计算协方差矩阵 Covariance Matrix 并求得对应的特征向量 Eigenvectors; - 特征值 Eigenvalues 表明各个维度的重要性程度大小关系,则取对应较大那个特征值得单位化后的特征矢量当作所需求的方向向量 Direction Vector; - 原始质心 Centroid 结合作为目标直线上某固定参考位置 Reference Point; 此技术广泛应用于模式识别 Pattern Recognition 中诸如人脸识别 Face Recognition 或者手势跟踪 Hand Gesture Tracking 这样的实际工程项目当中去完成初步轮廓简化表示的任务目标达成效果良好[^4]. ```python def pca_line_fitting(points): points_centered = points - np.mean(points, axis=0) _, _, Vt = np.linalg.svd(points_centered.T @ points_centered / len(points)) direction_vector = Vt[0] centroid = np.mean(points, axis=0) return centroid, direction_vector points = np.random.rand(100, 2)*10 centroid, direction_vector = pca_line_fitting(points) print(f"Centroid: {centroid}, Direction vector: {direction_vector}") ``` --- ### RANSAC 与 PCA 的主要区别 | 方面 | RANSAC | PCA | |---------------|---------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| | 数据敏感性 | 对离群点不敏感 | 易受离群点影响 | | 输出稳定性 | 较稳定 | 当样本间差距悬殊可能导致不稳定 | | 时间复杂度 | O(N * k),其中 N 是总点数,k 是每次尝试所需的最少点数 | 主要是 SVD 分解的时间成本 | | 应用范围 | 处理含噪数据、结构化环境下的几何形状恢复 | 维度压缩、探索性数据分析 | 尽管两者都可以解决类似的直线拟合问题,但在面对不同类型的挑战时各有千秋。如果应用场景中有较多不可靠观测值的话推荐优先考虑采用前者方案; 而后者则更适合那些希望快速获取全局概览信息而又无需过分纠结个别极端情况的情形之下加以运用[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值