最小二乘圆拟合: Pratt 方法

kasa方法圆拟合作为最常见的圆拟合方法,虽然计算方法简单,效率快,但是拟合结果存在较大偏差(Heavy bias)。通过将D=\sqrt{(x-a)^2+(y-b)^2}与半径R的差值D-R转换为D^2-R^2,将非线性问题转换为线性问题。但是因为D^2-R^2 = d(d+2R) (令d=D-R),当偏离值d较大时,kasa方法导致R明显变小。Pratt通过将kasa方法的目标除以(2R)^2的方式,取得更准确的结果。

f=  \frac{ \sum_{i=1}^{n}((x_i-a)^2+(y_i-b)^2-R^2)^2}{(2R)^2}

类似kasa method,pratt方法将圆方程描述为 A(x^2+y^2) + Bx + Cy+D=0。这样圆心(a,b) = (-\frac{B}{2A},-\frac{C}{2A})半径R = \frac{\sqrt{B^2+C^2-4AD}}{2A}。注意,A有可能为0,此时圆拟合方法得到的是一条直线,或者说一个曲率为0的圆。但是在这里,因为A,B,C,D的值乘以一个标量也不会改变圆的方程,可以让A=1,所以目标方程可以改写为:

f= (\frac{\sum A(x_i^2+y_i^2) + Bx_i + Cy_i+D}{B^2+C^2-4AD})^2

Pratt将这个方程转化为求g=(\sum A(x_i^2+y_i^2) + Bx_i + Cy_i+D)^2

的最小值,并且在约束条件B^2+C^2-4AD=1
的条件下。

惯例将上式写成矩阵形式:g= A^TMA  (\vec A=[A,B,C,D]^T ; M=\begin{bmatrix}\sum z^2 & \sum xz & \sum yz & \sum z \\ \sum xz & \sum x^2 & \sum xy & \sum x \\ \sum yz & \sum xy &\sum y^2 & \sum y \\ \sum z & \sum x & \sum y & n \end{bmatrix}; z_i = x_i^2 + y_i^2)

A^TBA = \begin{bmatrix}A&B&C&D\end{bmatrix}\begin{bmatrix}0&0&0&-2\\0&1&0&0\\0&0&1&0\\-2&0&0&0 \end{bmatrix}\begin{bmatrix}A\\B\\C\\D\end{bmatrix}=1

通过引入拉格朗日乘子解决最小值问题:

g(A,\eta) = A^TMA – \eta(A^TBA-1)

\vec A求偏导: MA – \eta BA=0。因为B可逆,可以变换为 B^{-1})MA = \eta A。可知 \eta为矩阵B^{-1}M的特征值,A为其特征向量。

MA – \eta BA=0可得A^TMA – \eta A^TBA=ATMA-\eta=0A^TMA的极值为\eta,那么矩阵B^{-1}M有四个特征值,最小的特征值就是A^TMA的最小值?不然。如果\eta<0 ,那么拟合出的圆将没有意义,因为A^TMA \ge 0。(Nikolai Chernov 教授经过复杂的证明,B^{-1}M 存在一个负特征值。)因此,A的值应该是对应矩阵B^{-1}M最小非负特征值的特征向量。

最后,通过采用Eigen库的EigenSolver可以计算特征值和特征向量。


算法分析:

pratt 方法有两个明显优势,一个是消除了半径的影响,使得曲率半径非常大、噪音大的情况下算法也能正确运行。

一个是在方程式上融合了直线方程,当系数A=0时,求得的曲线是直线,在实际应用中,不清楚待拟合曲线为直线还是曲线的情况下非常有效。

还有一点就是pratt方法的效率也比较高,因此是一种非常实用的方法。


本文参考材料 Nikolai Chernov 教授的 < Circular and Linear Regression > Chernov 教授主页上也给出了编程实现。感兴趣的同学可以直接下载试用。

One thought on “最小二乘圆拟合: Pratt 方法

  1. 博主你好,原始公式有3个待求解变量,转化为g函数求最小值时,有两个前提。让A=1,并加了一个约束。可以看做g 函数求解时有两个变量。那么最后求解的值其实是原始解的子集,是吧?
    其实不要A=1那个约束才与原始解一致的解集,直接让(B^2+C^2-4AD)/A^2=1,这样才更具有一般性吧?

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注