问题
现有近似分布在球面上的点云,试进行球面拟合,求出球心坐标和半径。
解
球面方程为:
其中 是我们要求的参数。
利用求偏导的方式求最小值
构造方程:
使方程 值最小的参数 就是我们的所求。
求偏导并使其等于0:
化简得:
整理得:
分别减去 (4) 式最终可以得到如下线性方程组:
解此线性方程组即可得到坐标 ,再代回 (4) 式求出 即可。
利用最小二乘法求解矩阵
也可以直接对球面的方程进行拟合,每一个点云坐标对应一个方程,方程数显然大于未知数,可以利用最小二乘法进行求解出一个最小值。
将方程稍微化简可得:
将每一个点坐标代入得到一个 的矩阵 A:
方程两边同时左乘以 可以得到和第一种方法一样的方程,或者直接用公式 进行求解,这两种方法在本质上是完全一样的。
python实现
针对第一种方法的具体代码import numpy as np
points = np.array(coor) # coor为点云坐标的列表
points = points.astype(np.uint64) # 防止溢出
num_points = points.shape[0]
print(num_points)
x = points[:, 0]
y = points[:, 1]
z = points[:, 2]
x_avr = sum(x) / num_points<