直线拟合2

 Opencv中的fitLine函数,实现了《直线拟合》一文中的总体最小二乘法拟合直线。

 C++: void fitLine(InputArray points, OutputArray line, int distType, double param, double reps, double aeps)

  参数说明

                  points:需要拟合的点;

                  Line:输出直线的参数;在2D拟合的情况下,它应该是4个元素的向量(如VEC4F)-(Vx,Vy,X0,Y0),其中(Vx,Vy)是归一化向量,(x0,y0)是线上的点。在3D拟合的情况下,它应该是6个元素的向量(如VEC6F)-(Vx,Vy,Vz,X0,Y0,Z0),其中(Vx,Vy,Vz)是归一化向量,并且(X0,Y0,Z0)是线上的点。

                 distType:拟合直线采用的方法;参数为CV_DIST_L2,算法为总体最小二乘法。

                  Param:数字常数,选0即可;

                  Reps:径向精度;

                  Aeps:角精度;

   当使用fileLine拟合直线时,如果直线中没有干扰,拟合效果是不错的,如下图,拟合出黑白交界的地方。

直线拟合2_第1张图片 直线拟合2_第2张图片

 

但是,当拟合的直线有干扰时,如下图所示,拟合的直线由于凹进去的影响,已经偏离了我们想要拟合的直线。

直线拟合2_第3张图片 直线拟合2_第4张图片

因为算法对所有的点进行拟合,拟合的鲁棒性不好,干扰点对拟合的直线影响很大,为了减少干扰点的影响,在拟合的过程中,引入权重wi,对远离直线的点,权重小于1,减少对拟合直线的影响。在《机器视觉算法与应用》介绍了Huber权重函数和Tukey权重函数。经测试,Tukey权重函数,由于引入了距离平方,收敛效果更好。下图使用Tukey权重函数,红线为15次迭代后的拟合效果。(带权重的直线拟合算法需手动实现,fitLine没有此功能)。

直线拟合2_第5张图片

 

你可能感兴趣的:(图像处理)