【问题标题】:How to estimate local tangent plane for 3d points?如何估计 3d 点的局部切平面?
【发布时间】:2013-12-23 00:19:23
【问题描述】:

假设我有一组点,

R = [[x1, y1, z1],[x2, y2, z2],...,[xn, yn, zn]]

对于 R 中的每个点 (p),我使用 scipy.cKDTree 确定了一个具有半径 (r) 和高度 (2r) 的局部邻域

import numpy as np
import scipy.spatial

R = np.array(R)
r = 1 # search radius

xy = R[:,0:2] # make array of ONLY xy
tree = scipy.spatial.cKDTree(xy)

for p in range(len(R)):
    2d_nbr_indices = tree.query_ball_point(xy[p], r) # indices w/in xy neighborhood
    2d_nbr_array = R[2d_nbr_indices] # 3d array of 2d neighbors
    z = R[p][1] # get z value
    zMin = z - r
    zMax = z + r
    # Create boolean array to filter 3d array
    hgt_filter = np.any([2d_nbr_array[:, 2] >= zMin,
                         2d_nbr_array[:, 2] <= zMax], axis=0)
    3d_nbr_array = 2d_nbr_array[hgt_filter] # points in xyz neighborhood

我想为每个邻域计算一个正交回归平面,确定每个点到平面的距离(正交),并计算平面的法向量。有人对如何在 python 中进行此操作有任何建议吗?

编辑:我找到了odr user guide。它似乎可以处理 3d 点。欢迎任何关于它的实施和使用的建议。我还找到了this similar question

编辑:我应该提到数据可能包含垂直或接近垂直的表面,因此需要一个隐式模型。我找到了this example in the scipy codebook,但只有 xy 数据。

【问题讨论】:

    标签: python numpy scipy regression point-clouds


    【解决方案1】:

    这是一个如何使用 scipy.odr 将 3d 表面拟合到点云的一般示例。希望对您有所帮助。

    from scipy.odr import ODR, Model, Data
    import numpy as np
    import matplotlib.pyplot as plt
    
    from mpl_toolkits.mplot3d import Axes3D
    
    def func(beta,data):
        x,y = data
        a,b,c = beta
        return a*x+b*y+c
    
    N = 20
    x = np.random.randn(N)
    y = np.random.randn(N)
    z = func([-3,-1,2],[x,y])+np.random.normal(size=N)
    
    
    data = Data([x,y],z)
    model = Model(func)
    odr = ODR(data, model, [0.0,0.0,0.0])
    odr.set_job(fit_type = 0)
    res = odr.run()
    
    Y,X = np.mgrid[y.min():y.max():20j,x.min():x.max():20j]
    Z = func(res.beta, [X,Y])
    f = plt.figure()
    pl = f.add_subplot(111,projection='3d')
    pl.scatter3D(x,y,z)
    pl.plot_surface(X,Y,Z,alpha=0.4)
    

    【讨论】:

      猜你喜欢
      • 2014-07-16
      • 1970-01-01
      • 1970-01-01
      • 2017-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      相关资源
      最近更新 更多