Python 最小化到平面的距离
我在三维空间中有一组点,我知道所有这些点都属于一个平面。但是,这些点中存在一些噪声,所以我不能直接从中提取平面。我想找到最适合这些点的平面公式(ax+by+c*z+d=0)。换句话说,从点到平面的(平方)距离之和应该最小化Python 最小化到平面的距离,python,numpy,geometry,Python,Numpy,Geometry,我在三维空间中有一组点,我知道所有这些点都属于一个平面。但是,这些点中存在一些噪声,所以我不能直接从中提取平面。我想找到最适合这些点的平面公式(ax+by+c*z+d=0)。换句话说,从点到平面的(平方)距离之和应该最小化 我正在使用python和numpy完成所有这些工作,但我似乎不知道如何准确地实现这一点。我对python、scipy和numpy为解决这个问题提供了什么做了更多的研究,我发现这段代码恰好满足了我的需要: def calcBestNormal(points, origin):
我正在使用python和numpy完成所有这些工作,但我似乎不知道如何准确地实现这一点。我对python、scipy和numpy为解决这个问题提供了什么做了更多的研究,我发现这段代码恰好满足了我的需要:
def calcBestNormal(points, origin):
p = np.subtract(points, origin)
# Inital guess of the plane
p0 = np.array([0.506645455682, -0.185724560275, -1.43998120646, 1.37626378129])
def f_min(X, p):
plane_xyz = p[0:3]
distance = (plane_xyz * X.T).sum(axis=1) + p[3]
return distance / np.linalg.norm(plane_xyz)
def residuals(params, signal, X):
return f_min(X, params)
sol = leastsq(residuals, p0, args=(None, p.T))[0]
normal = np.divide(sol[0:3], np.linalg.norm(sol[0:3]))
return normal
如果计算点分布的奇异值分解,则与最小特征值对应的向量将垂直于调整到分布的平面 假设
点
是一个点矩阵,每行包含一个点:
centroid = np.mean(points, axis=0) # point on the plane
normal = np.linalg.svd(points - centroid)[2][2] # plane normal (a,b,c)
d = -centroid.dot(normal) # distance to the origin (d)
plane = np.append(normal, d) # plane coefficients (a,b,c,d)
这回答了你的问题吗?在我的案例中,我并没有立即想出如何让它起作用(它对某些飞机起作用,但对其他飞机不起作用),然而,我搜索了更多关于这些事情的知识,并发现了一些类似的东西,这对我起到了作用。这里有一个有趣的答案: