德鲁周记13--最小二乘、RANSAC与霍夫变换的区别

最近看orb-slam2代码和图像处理问题的时候发现了多种处理直线拟合的方法,特此也记录一下。
分别是直线拟合的最小二乘法,RANSAC和直线检测的霍夫变换,其本质都是对直接的拟合。

最小二乘与RANSAC

普通最小二乘是保守派:在现有数据下,如何实现最优。是从一个整体误差最小的角度去考虑,尽量谁也不得罪。

RANSAC是改革派:首先假设数据具有某种特性(目的),为了达到目的,适当割舍一些现有的数据。

给出最小二乘拟合(红线)、RANSAC(绿线)对于一阶直线、二阶曲线的拟合对比:

在这里插入图片描述

最小二乘

在此先列举一下最小二乘家族成员。最小二乘法直线拟合,最小二乘法多项式(曲线)拟合,机器学习中线性回归的最小二乘法,系统辨识中的最小二乘辨识法,参数估计中的最小二乘法,等等。由此可见,我们每次碰到的都是最小二乘法这个多面体的其中一个面。如果只从单个面研究,就看不到它的整体,也就不能理解它的内涵。因此,为了搞明白这个多面体,我们就要从它的核心入手,剖析它最本质的内容。
先从最小二乘的名字来看,所谓最小二乘,其实也可以叫做最小平方和。那么,是什么的平方和最小呢?那肯定是误差最小,那是什么的误差呢?就是目标对象和拟合对象的误差。连起来看,就是通过最小化误差的平方和,使得拟合对象无限接近目标对象,这就是最小二乘的核心思想。可以看出,最小二乘解决的是一类问题,就是需要拟合现有对象的问题。这么看来,是不是也就可以理解为什么最小二乘应用如此广泛了呢

举个最简单的例子理解最小二乘

假设身高是变量X,体重是变量Y,我们都知道身高与体重有比较直接的关系。生活经验告诉我们:一般身高比较高的人,体重也会比较大。但是这只是我们直观的感受,只是很粗略的定性的分析。在数学世界里,我们大部分时候需要进行严格的定量计算:能不能根据一个人的身高,通过一个式子就能计算出他或者她的标准体重?
接下来,我们肯定会找一堆人进行采用(请允许我把各位当成一个样本)。采样的数据,自然就是各位的身高与体重。(为了方便计算与说明,请允许我只对男生采样)经过采样以后,我们肯定会得到一堆数据
在这里插入图片描述
其中x是身高,y是体重。 得到这堆数据以后,接下来肯定是要处理这堆数据了。生活常识告诉我们:身高与体重是一个近似的线性关系,用最简单的数学语言来描述就是:
在这里插入图片描述
于是,接下来的任务就变成了:怎么根据我们现在得到的采样数据,求出这两个β呢?这个时候,就轮到最小二乘法发飙显示威力了。

最小二乘的cost function

在讲最小二乘的详情之前,首先明确两点:1.我们假设在测量系统中不存在有系统误差,只存在有纯偶然误差。比如体重计或者身高计本身有问题,测量出来的数据都偏大或者都偏小,这种误差是绝对不存在的。(或者说这不能叫误差,这叫错误)2.误差是符合正态分布的,因此最后误差的均值为0(这一点很重要)
明确了上面两点以后,重点来了:为了计算β1和β2的值,我们采取如下规则:β1和β2应该使计算出来的函数曲线与观察值的差的平方和最小。用数学公式描述就是:
在这里插入图片描述

最小二乘法的求解

样本的回归模型很容易得出:
在这里插入图片描述
现在需要确定β1,β2,使cost function最小。学过高数的同志们都清楚,求导就OK。对于这种形式的函数求导
在这里插入图片描述
在这里插入图片描述
将这两个方程稍微整理一下,使用克莱姆法则,很容易求解得出:
在这里插入图片描述
因为求和符号比较多,省略了上标与下标。
根据这个公式,就可以求解出相应的参数。
对应上面的身高体重关系的例子,我们只需要将采样得到的数据,一一代入即可求解。

RANSAC

可以看到RANSAC可以很好的拟合。RANSAC可以理解为一种采样的方式,所以对于多项式拟合、混合高斯模型(GMM)等理论上都是适用的。
RANSAC简化版的思路就是:

第一步:假定模型(如直线方程),并随机抽取Nums个(以2个为例)样本点,对模型进行拟合:

在这里插入图片描述

第二步:由于不是严格线性,数据点都有一定波动,假设容差范围为:sigma,找出距离拟合曲线容差范围内的点,并统计点的个数:

在这里插入图片描述

第三步:重新随机选取Nums个点,重复第一步~第二步的操作,直到结束迭代:

在这里插入图片描述

第四步:每一次拟合后,容差范围内都有对应的数据点数,找出数据点个数最多的情况,就是最终的拟合结果:

在这里插入图片描述

至此:完成了RANSAC的简化版求解。

这个RANSAC的简化版,只是给定迭代次数,迭代结束找出最优。如果样本个数非常多的情况下,难不成一直迭代下去?其实RANSAC忽略了几个问题:

每一次随机样本数Nums的选取:如二次曲线最少需要3个点确定,一般来说,Nums少一些易得出较优结果;
抽样迭代次数Iter的选取:即重复多少次抽取,就认为是符合要求从而停止运算?太多计算量大,太少性能可能不够理想;
容差Sigma的选取:sigma取大取小,对最终结果影响较大;
这些参数细节信息参考:维基百科。

RANSAC的作用有点类似:将数据一切两段,一部分是自己人,一部分是敌人,自己人留下商量事,敌人赶出去。RANSAC开的是家庭会议,不像最小二乘总是开全体会议。

霍夫变换

Hough直线检测的基本原理在于利用点与线的对偶性,在我们的直线检测任务中,即图像空间中的直线与参数空间中的点是一一对应的,参数空间中的直线与图像空间中的点也是一一对应的。这意味着我们可以得出两个非常有用的结论:
1)图像空间中的每条直线在参数空间中都对应着单独一个点来表示;
2)图像空间中的直线上任何一部分线段在参数空间对应的是同一个点。
因此Hough直线检测算法就是把在图像空间中的直线检测问题转换到参数空间中对点的检测问题,通过在参数空间里寻找峰值来完成直线检测任务。

基本原理

一条直线可由两个点A=(X1,Y1)和B=(X2,Y2)确定(笛卡尔坐标)
在这里插入图片描述

另一方面,也可以写成关于(k,q)的函数表达式(霍夫空间):

在这里插入图片描述

对应的变换可以通过图形直观表示:

在这里插入图片描述

变换后的空间成为霍夫空间。即:笛卡尔坐标系中一条直线,对应霍夫空间的一个点。

反过来同样成立(霍夫空间的一条直线,对应笛卡尔坐标系的一个点):

在这里插入图片描述

再来看看A、B两个点,对应霍夫空间的情形:

在这里插入图片描述

一步步来,再看一下三个点共线的情况:

在这里插入图片描述

可以看出如果笛卡尔坐标系的点共线,这些点在霍夫空间对应的直线交于一点:这也是必然,共线只有一种取值可能。

如果不止一条直线呢?再看看多个点的情况(有两条直线):

在这里插入图片描述

其实(3,2)与(4,1)也可以组成直线,只不过它有两个点确定,而图中A、B两点是由三条直线汇成,这也是霍夫变换的后处理的基本方式:选择由尽可能多直线汇成的点。

看看,霍夫空间:选择由三条交汇直线确定的点(中间图),对应的笛卡尔坐标系的直线(右图)。

在这里插入图片描述

到这里问题似乎解决了,已经完成了霍夫变换的求解,但是如果像下图这种情况呢?

在这里插入图片描述

k=∞是不方便表示的,而且q怎么取值呢,这样不是办法。因此考虑将笛卡尔坐标系换为:极坐标表示。

在这里插入图片描述

在极坐标系下,其实是一样的:极坐标的点→霍夫空间的直线,只不过霍夫空间不再是[k,q]的参数,而是的参数,给出对比图:

在这里插入图片描述

在这里插入图片描述

是不是就一目了然了?点的检测问题,通过在参数空间里寻找峰值来完成直线检测任务。

之前面试也被问到了计算机是如何找到这个峰值的,我当时也没能打出来,猜测是遍历几条直线来选取候选点再来根据候选点进行匹配。结果后面下来发现有霍夫投票的方式,也是查漏补缺了。

霍夫投票

我要做的是:我创建一个表格,这里是m和b,它是由一组箱子组成的:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

每一个点都对经过的箱子进行投票,所以它会对经过的每个箱子投一票。
你收集了每个箱子的票数情况。每一个点都投过票,哪一个票数最多,那就是你的路线:

在这里插入图片描述

因此,基本上,我们将把选票投进箱子,然后找到最多选票的箱子。求这个点坐标就求出直线了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值