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}
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
惯例将上式写成矩阵形式: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=0即A^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 教授主页上也给出了编程实现。感兴趣的同学可以直接下载试用。
博主你好,原始公式有3个待求解变量,转化为g函数求最小值时,有两个前提。让A=1,并加了一个约束。可以看做g 函数求解时有两个变量。那么最后求解的值其实是原始解的子集,是吧?
其实不要A=1那个约束才与原始解一致的解集,直接让(B^2+C^2-4AD)/A^2=1,这样才更具有一般性吧?