ism模型python算法_RANSAC算法详解(附Python拟合直线模型代码)

ism模型python算法_RANSAC算法详解(附Python拟合直线模型代码)_第1张图片

之前只是简单了解RANSAC模型,知道它是干什么的。然后今天有个课程设计的报告,上去讲了一下RANSAC,感觉这个东西也没那么复杂,所以今天就总结一些RASAC并用Python实现一下直线拟合。

RANSAC简介

RANSAC(RAndom SAmple Consensus,随机采样一致)算法是从一组含有“外点”(outliers)的数据中正确估计数学模型参数的迭代算法。“外点”一般指的的数据中的噪声,比如说匹配中的误匹配和估计曲线中的离群点。所以,RANSAC也是一种“外点”检测算法。RANSAC算法是一种不确定算法,它只能在一种概率下产生结果,并且这个概率会随着迭代次数的增加而加大(之后会解释为什么这个算法是这样的)。RANSAC算最早是由Fischler和Bolles在SRI上提出用来解决LDP(Location Determination Proble)问题的。

对于RANSAC算法来说一个基本的假设就是数据是由“内点”和“外点”组成的。“内点”就是组成模型参数的数据,“外点”就是不适合模型的数据。同时RANSAC假设:在给定一组含有少部分“内点”的数据,存在一个程序可以估计出符合“内点”的模型。

以上文字翻译于wiki,并加有一些博主自己的理解。

算法基本思想和流程

RANSAC是通过反复选择数据集去估计出模型,一直迭代到估计出认为比较好的模型。
具体的实现步骤可以分为以下几步:

  1. 选择出可以估计出模型的最小数据集;(对于直线拟合来说就是两个点,对于计算Homography矩阵就是4个点)
  2. 使用这个数据集来计算出数据模型;
  3. 将所有数据带入这个模型,计算出“内点”的数目;(累加在一定误差范围内的适合当前迭代推出模型的数据)
  4. 比较当前模型和之前推出的最好的模型的“内点“的数量,记录最大“内点”数的模型参数和“内点”数;
  5. 重复1-4步,直到迭代结束或者当前模型已经足够好了(“内点数目大于一定数量”)。

迭代次数推导

这里有一点就是迭代的次数我们应该选择多大呢?这个值是否可以事先知道应该设为多少呢?还是只能凭经验决定呢? 这个值其实是可以估算出来的。下面我们就来推算一下。

假设“内点”在数据中的占比为

那么我们每次计算模型使用

个点的情况下,选取的点至少有一个外点的情况就是

也就是说,在迭代

次的情况下,
就是
次迭代计算模型都至少采样到一个“外点”去计算模型的概率。那么能采样到正确的
个点去计算出正确模型的概率就是

通过上式,可以求得

“内点”的概率
通常是一个先验值。然后
是我们希望RANSAC得到正确模型的概率。如果事先不知道
的值,可以使用自适应迭代次数的方法。也就是一开始设定一个无穷大的迭代次数,然后每次更新模型参数估计的时候,用当前的“内点”比值当成
来估算出迭代次数。

用Python实现直线拟合

import 

最后得到结果如下图:

ism模型python算法_RANSAC算法详解(附Python拟合直线模型代码)_第2张图片
RANSAC拟合曲线效果 RANSAC算法详解(附Python拟合曲线和平面)​lixin97.com
ism模型python算法_RANSAC算法详解(附Python拟合直线模型代码)_第3张图片

你可能感兴趣的:(ism模型python算法,pcl中ransac提取直线,sift算法详解及代码解析)