RANSAC 随机一致性采样

RANSAC(随机一致性采样)是一种用于从含有噪声数据中估计数学模型的算法。该算法通过随机选取子集来拟合模型,并确定哪些数据点与模型一致,从而有效地去除外点。在RANSAC的迭代过程中,它会计算内点比例并选择最佳模型。应用RANSAC的关键参数包括最小样本数、迭代次数、距离阈值和模型验证条件。

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

随机一致性采样RANSAC是一种鲁棒的模型拟合算法,能够从有外点的数据中拟合准确的模型。


RANSAC过程中用到的参数

N-- 拟合模型所需要的最少的样本个数

K--算法的迭代次数

t--用于判断数据是否是内点

d--判定模型是否符合使用于数据集,也就是判断是否是好的模型


RANSAC算法过程

1  for K 次迭代

2     从数据中均匀随机采样N个点

3     利用采样的N个点拟合你个模型

4     for 对于除采样点外的每一个样本点

5          利用t检测样本点到模型的距离,如果小于t则认为是一致,否则认为是外点

6     end

7     如果有d或者更多的一致点,则认为拟合的模型是好的

8 end

9 使用拟合误差作为标准,选择最好的拟合模型



迭代次数的计算

假设 r = 内点个数/所有点的个数

 则:

   p0 = pow(r, N) 表示采样的N个点全为内点,也就是是一次有效采样的概率

   p1 = 1 - pow(r, N) 表示采样的N个点中至少有一个外点,即一次无效采样的概率

   p2 = pow(p1, K) 表示K次无效采样的概率

假设p表示K次采样中至少一次采样是有效采样,则有1-p = pow(p1, K), 两边取对数

则有 K = log(1- p )/log(1-p1).


 附一份来自google 的RANSAC的代码框架

#ifndef FVISION_RANSAC_H_
#define FVISION_RANSAC_H_

#include <fvision/utils/random_utils.h>
#include <fvision/utils/misc.h>

#include <vector>
#include <iostream>
#include <cassert>

namespace fvision {

class RANSAC_SamplesNumber {
public:
        RANSAC_SamplesNumber(int modelSampleSize) {
                this->s = modelSampleSize;
                this->p = 0.99;
        }
        ~RANSAC_SamplesNumber(void) {}

public:
        long calcN(int inliersNumber, int samplesNumber) {
                double e = 1 - (double)inliersNumber / samplesNumber;
                //cout<<"e: "<<e<<endl;
                if (e > 0.9) e = 0.9;
                //cout<<"pow: "<<pow((1 - e), s)<<endl;
                //cout<<log(1 - pow((1 - e), s))<<endl;
                long N = (long)(log(1 - p) / log(1 - pow((1 - e), s)));
                if (N < 0) return (long)1000000000;
                else return N;
        }

private:                
        int s;      //samples size for fitting a model
        double p;   //probability that at least one of the random samples if free from outliers
                    //usually 0.99
};

//fit a model to a set of samples
template
### RANSAC算法简介 随机样本一致性(RANSAC)是一种迭代方法,用于估计数学模型的参数,特别是当数据包含异常值时。该算法通过反复选取最小的数据子集来拟合模型,并评估这些模型对整个数据集的有效性[^1]。 ### RANSAC算法实现原理 RANSAC的核心思想是从观测数据集中随机抽取一个内点子集,利用此子集计算模型参数;然后统计所有满足当前模型误差条件的数据数目(即支持此模型的内点数),重复上述过程直到找到最佳模型或达到最大迭代次数为止[^2]。 ### C++中的RANSAC实现示例 下面是一个简单的线性回归场景下的RANSAC算法C++实现: ```cpp #include <vector> #include <random> #include <limits> struct Point { double x; double y; }; class LineModel { public: void fit(const std::vector<Point>& points); bool evaluate(const Point& point, const double threshold); private: double slope_; // 斜率 double intercept_; // 截距 }; void ransac(std::vector<Point> dataPoints, int minNumOfInliers, double errorThreshold, int maxIterations, LineModel* model) { int bestScore = 0; for (int i = 0; i < maxIterations && bestScore < minNumOfInliers; ++i) { auto sampleSet = getRandomSample(dataPoints); // 获取随机抽样的两个点 model->fit(sampleSet); // 使用这两个点构建直线方程 int score = countInliers(*model, // 计算有多少个点符合这条直线 dataPoints, errorThreshold); if (score > bestScore) { // 更新最优解 bestScore = score; } } } // 辅助函数定义... std::vector<Point> getRandomSample(const std::vector<Point>& allPoints){ static std::default_random_engine rng((unsigned long)new char); std::uniform_int_distribution<int> dist(0,allPoints.size()-1); return {allPoints[dist(rng)], allPoints[dist(rng)]}; } ``` 这段代码展示了如何使用RANSAC框架寻找最适合给定点集合的最佳线条模型。注意这里省略了一些辅助功能的具体实现,比如`getRandomSample()`和`countInliers()`, 实际应用中需要补充完整逻辑[^3].
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值