随机一致性采样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

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

被折叠的 条评论
为什么被折叠?



