高斯曲率和平均曲率适用于粗糙表面吗?

Is Gaussian & Mean Curvatures Applicable for Rough Surfaces?

对于我正在进行的项目,我已经成功地对道路图像数据执行了 SFM 程序,并且能够生成包含点云坐标(X、Y、Z)、RGB 值的 .ply 文件,和法线(nx、ny、nz)。

现在,我有兴趣根据我拥有的数据计算每个点的曲率值。我遇到过 Surface Curvature MATLAB Equivalent in Python,但据说该实现仅在 X、Y 和 Z 是二维数组时才有效。

如果路面非常粗糙,高斯曲率和平均曲率是否适用?给定大小为 NX3 的 (X,Y,Z) 坐标数据和大小为 NX3 的 (nx,ny,nz) 法线数据,我应该如何找到曲率? Python 中是否有当前的实现?

我实际上是在写 Python library for working with point clouds

使用原始点云,我知道的唯一 "curvature" 概念是使用从每个点的邻域获得的特征值计算的概念。

如果这是你的意思,这里有一个示例代码:

from pyntcloud import PyntCloud
cloud = PyntCloud.from_file("Box.ply")

这是里面的示例点云Box.ply:

计算曲率的步骤是:


获取每个点的 k 个邻居:

k_neighbors = cloud.get_neighbors(k=10)

使用它的 k(在本例中为 10)邻居计算每个点的特征值:

ev = cloud.add_scalar_field("eigen_values", k_neighbors=k_neighbors)

根据这些特征值计算曲率:

cloud.add_scalar_field("curvature", ev=ev)

使用新的标量场保存云:

cloud.to_file("out.ply")

这是 out.ply 内的点云,根据分配给每个点的曲率值着色(白色是较高的曲率值):


这是一个关于如何过滤点云以仅保留曲率值高于平均值的点的示例:

curvature = cloud.points["curvature(K(16))"]
cloud.points = cloud.points[curvature > curvature.mean()]
cloud.to_file("out.ply")

以及out.ply的新内容: