直线拟合——最小二乘法、hough变换
都知道一条直线可以表达成 y=ax+b形式,其中a为斜率,b为截距。最小二乘就是对n个点进行拟合,使其距离拟合直线的总体误差尽量小。求解方法也很简单,就是最小化每个点到直线的垂直误差。1、建立方差误差
2、求导得参数
缺点:
1、无法拟合垂直线,且由于误差采用的是垂直误差,导致越接近垂直线,拟合效果越差。
2、对噪声的鲁棒性不好,受噪声影响较大。
一种方式是在拟合直线过后,选择距离直线较近的点进行重新拟合,如此多次后就能得到较好结果,实际就是逐步求精的过程。
一种改善方式是引入Total least squares,如下图:
霍夫变换Hough变换与曲线检测_zwq940103的博客-CSDN博客blog.csdn.net相比于最小二乘的由点找参数方法。
霍夫变化的思想是由参数统计点数(这个思想才是最重要的,一般思维都是类似最小二乘,但在多条线段中使用最小二乘就困难了,因为没办法确定哪些点属于那条线,霍夫变换创造性换个思路,既然我知道需要哪些参数和参数范围,何不使用统计思想,这样就不需要知道每个点的所属,直接把所有点在所有可能线上统计一遍。),而且它不仅可以用于拟合直线,还可以拟合其他的曲线、圆等。
如:
直线Hough变换的(k,b)空间方法:
如果知道很多N个边缘点(x0 ,y0)……(xn-1,yn-1),检测其中是否有直线。假设有直线且该直线的方程为y=kx+b,则0=kx0+b,y1=kx1+b,……,yn-1=kxn-1+b同时满足。若构造一个计数器 count[k][b],则有count[k][b]=n。问题就变成求k、b和多少个点落到该直线y=kx+b上。寻找count中的最大值,则该最大值对应的(k,b)即为最佳直线的参数。
但在k,b空间中存在的同样问题:斜率k范围太大(无穷大),无法确定。
除了标准的笛卡尔坐标系外,还有一种常用坐标系是极坐标。
霍夫变换可以使用极坐标系来表示直线。
显然穷举(ρ,θ)远比(k, b)直观,其范围[ρ1, ρ2]和[θ1,θ2]也容易确定。
计算方法是首先生成ρ(代表直线到原点的垂直距离),θ(代表x轴到直线垂线的角度)的可能取值,
然后将所有点代入公式,
如果计算结果小于阈值,则认为该点为当前ρ、θ取值投了一票。
最终选择票数高的作为拟合的直线。
缺点:
1、生成ρ、θ的间距不好确定。精确性取决于step θ和step ρ ,显然它们越小,精确度越高。 但越小,count[ρ][θ]越不容易形成峰值。
2、受噪声影响。
3、坐标原点的选择,ρ和θ的定义域的确定需要考究
其他策略:
1、可先用较粗的θ和ρ进行 Hough变换,筛选出候选点,再对候选点进行直线拟和,得到更精细的直线描述。
2、可先对边缘图像进行膨胀后,相当于把边缘点的精度降低,再进行Hough变换。
3、进行某种加权的Hough变换:count[ρ][θ]+=L长度加权,长度平方加权,加梯度加权,灰度加权
总结一下Hough变换和最小二乘法的异同_奔跑的汉堡包的博客-CSDN博客blog.csdn.net从相似点考虑,Hough变换和最小二乘法都是常见的直线检测、直线拟合方式之一,他们都是从一些点里,找到能够拟合这些点最好的直线。
不同点呢:
1、最小二乘法是统计学方法,常用于数据统计和数值分析方面,
而Hough变换则是传统的图像处理方法,是从二维的图像入手的。
2、最小二乘法拟合的是一条直线,其他图形,特别是曲线效果不理想;
而Hough变换则可以从很多个点中,找到很多条直线(也可以很有效的找别的图形,这也是区别之一)。
3、最小二乘法会用到所有的点,也就是说对噪声很敏感,它拟合出来的直线并不会穿过所有的点,改变其中一个点的位置,会对结果造成影响(所以有了改进的RANSAC);
而Hough变换则更多是“检测”直线,是检测出图像中在一同条直线上最多的点,检测出来的直线,必定会穿过所有相关的点,并且噪点几乎不会对Hough变换造成任何影响。