直线拟合方式 最小二乘least squares 霍夫变换Hough transform M估计M-Estimators RANSAC随机抽样一致算法(random sample consensus)

最小二乘

都知道一条直线可以表达成 y=ax+b形式,其中a为斜率,b为截距。最小二乘就是对n个点进行拟合,使其距离拟合直线的总体误差尽量小。求解方法也很简单,就是最小化每个点到直线的垂直误差。
1、建立方差误差
这里写图片描述
2、求导得参数
直线拟合方式 最小二乘least squares 霍夫变换Hough transform M估计M-Estimators RANSAC随机抽样一致算法(random sample consensus)_第1张图片
缺点:1、无法拟合垂直线,且由于误差采用的是垂直误差,导致越接近垂直线,拟合效果越差。2、对噪声的鲁棒性不好,受噪声影响较大。
一种方式是在拟合直线过后,选择距离直线较近的点进行重新拟合,如此多次后就能得到较好结果,实际就是逐步求精的过程。
一种改善方式是引入Total least squares,如下图:
直线拟合方式 最小二乘least squares 霍夫变换Hough transform M估计M-Estimators RANSAC随机抽样一致算法(random sample consensus)_第2张图片
直线拟合方式 最小二乘least squares 霍夫变换Hough transform M估计M-Estimators RANSAC随机抽样一致算法(random sample consensus)_第3张图片

霍夫变换

相比于最小二乘的由点找参数方法。霍夫变化的思想是由参数统计点数(这个思想才是最重要的,一般思维都是类似最小二乘,但在多条线段中使用最小二乘就困难了,因为没办法确定哪些点属于那条线,霍夫变换创造性换个思路,既然我知道需要哪些参数和参数范围,何不使用统计思想,这样就不需要知道每个点的所属,直接把所有点在所有可能线上统计一遍。),而且它不仅可以用于拟合直线,还可以拟合其他的曲线、圆等。如:
直线Hough变换的(k,b)空间方法:如果知道很多N个边缘点(x0 ,y0)……(xn-1,yn-1),检测其中是否有直线。假设有直线且该直线的方程为y=kx+b,则y0=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)即为最佳直线的参数。

for (k = k1; k < k2; k+=stepk)
{
for ( b = b1; b < b2; b+=stepb )
{
for ( i= 0; i < n; i ++)
{
if ( yi = =k*xi +b ) count[k][b]++; // 应该 fabs(yi - k*xi +b)
}
}
}

但在k,b空间中存在的同样问题:斜率k范围太大(无穷大),无法确定。除了标准的笛卡尔坐标系外,还有一种常用坐标系是极坐标。霍夫变换可以使用极坐标系来表示直线。显然穷举(ρ,θ)远比(k, b)直观,其范围[ρ1, ρ2]和[θ1,θ2]也容易确定。计算方法是首先生成ρ(代表直线到原点的垂直距离),θ(代表x轴到直线垂线的角度)的可能取值,然后将所有点代入公式,如果计算结果小于阈值,则认为该点为当前ρ、θ取值投了一票。最终选择票数高的作为拟合的直线。如下图:

for (ρ=ρ1;ρ<=ρ2;ρ+=stepρ)
{
for(θ=θ1;θ<=θ2;θ+=stepθ)
{
for(i=0;iif (ρ==xi*cos(θ)+yi*sin(θ)) count[ρ][θ]++;
}
}
}
优化算法:三重循环变两重,而且cos(θ)和sin(θ)还可以变成查找表cos[θ]和sin[θ]来实现。
for(θ=θ1;θ<=θ2;θ+=stepθ)
{
for(i=0;i*cos(θ)+yi*sin(θ);
if (ρ 有效) count[ρ][θ]++;
}
}

优化:除法变乘法
int cosV, sinV;
for(theta = theta1; thetaint) (cos(theta)*2048);
sinV = (int) (sin(theta)*2048);
for(i=0; ix[i]*cosV + y[i] *sinV) >>9; // 相当于除以512
…..
}
}

缺点:1、生成ρ、θ的间距不好确定。精确性取决于step θ和step ρ ,显然它们越小,精确度越高。 但越小,count[ρ][θ]越不容易形成峰值。2、受噪声影响。3、坐标原点的选择,ρ和θ的定义域的确定需要考究
其他策略:
1、可先用较粗的θ和ρ进行 Hough变换,筛选出候选点,再对候选点进
行直线拟和,得到更精细的直线描述。
2、可先对边缘图像进行膨胀后,相当于把边缘点的精度降低,再进行
Hough变换。
3、进行某种加权的Hough变换:count[ρ][θ]+=L长度加权,长度平方加权,加梯度加权,灰度加权

M估计

直线拟合中的最大问题就是噪声点导致的large error。如下图,由于这些离群点的存在,导致最小二乘直线拟合效果变差。
直线拟合方式 最小二乘least squares 霍夫变换Hough transform M估计M-Estimators RANSAC随机抽样一致算法(random sample consensus)_第4张图片
一个很直观的观察就是这些离群点距离真实直线的距离较远,在最小二乘的方差中占据很大的比重,因此在拟合过程中拟合直线只需要稍稍往离群点方向偏移就能很大减小整个误差,但这会导致拟合直线和真实直线距离变大,拟合效果变差。因此一种简单的思想就是对这些距离误差采用加权的方式。就是给每个样本点赋予不同权重,偏差较大的权重较小,偏差较小的权重较大。M估计就是使用这种思想,采用迭代加权最小二乘估计回归系数。
直线拟合方式 最小二乘least squares 霍夫变换Hough transform M估计M-Estimators RANSAC随机抽样一致算法(random sample consensus)_第5张图片
直线拟合方式 最小二乘least squares 霍夫变换Hough transform M估计M-Estimators RANSAC随机抽样一致算法(random sample consensus)_第6张图片
缺点:minimization is numerical, usually has multiple minima, can be hard

RANSAC

RANSAC算法的基本假设是样本中包含正确数据(inliers,可以被模型描述的数据),也包含异常数据(outliers,偏离正常范围很远、无法适应数学模型的数据),即数据集中含有噪声。其不仅可以拟合线、面、体,还可以应用到其他模型上。算法流程如下:
1、在数据中随机均匀的选择几个点作为内群点
2、拟合选择的内群点
3、把其他刚才没有选到的点代入拟合的模型,通过一个阈值判断是否为内群。如果是,则加入内群,并重新拟合
4、记下最终内群点数量
5、重复以上步骤多次
6、比较哪次计算中内群数量最多,内群最多的那次所拟合的模型就是我们所要求的解
直线拟合方式 最小二乘least squares 霍夫变换Hough transform M估计M-Estimators RANSAC随机抽样一致算法(random sample consensus)_第7张图片

你可能感兴趣的:(image)