shape_index — 3D curvature op

• 数据种类:points → descriptor

• 调用: import fullseye as fs; fs.ledger.shape_index(points, k=25, normals=None)(要直接调用实现,import curvature3d; curvature3d.shape_index(points, k=25, normals=None);从台账取用则 ops3d.get("shape_index"))

用法

Koenderink 的 shape index s∈-1,1。→ (N,)。

脐点/平面判定相对于曲率尺度(无绝对阈值)。平缓的凸/凹(即使曲率极小) 也保留符号=凹凸,平面仅对相对于整个数据的曲率尺度为 0 的点设 s=0。

normals(带朝向的参考法线, (N,3))未指定时开放曲面的凹/凸符号不确定(以凸的幅值报告)。传入带朝向的法线后会与全局朝向一致,给出正确的符号(凹球=cup → -1)。

计算(每个点,与 principal_curvatures 相同的拟合):

• 平面判定: curvedness sqrt((k1² + k2²) / 2) 小于全部点 curvedness 的中位数 × 1e-3 时 s = 0。中位数为 0(无曲率信号)时全部点为 0。

• 脐点判定: |k1 - k2| < 1e-2 × (|k1| + |k2|) 时 s = sign(k1 + k2)(严格为 ±1)。

• 其他情况: s = (2/π) · arctan((k1 + k2) / (k1 - k2))。

• 阈值不是绝对值而是相对于整个数据的曲率尺度,因此即使形状相同,被视为平面的点也会随与其他点的混合情况而变化。以对单个点云进行分类为前提使用。

• 邻域少于 5 个点的点 k1 = k2 = 0 → 平面(0)。k 截断为 N-1。

• normals 须为 (N,3) 且各行有限、非零(ValueError)。未指定时开放曲面的符号不确定(凸侧)。

• 不包含弯曲的强度。若也需要强度,把 principal_curvatures 的 2 个值排成 (N,2) 后传给 curvature_to_shape_index。

背景知识指南(该算子背后的物理与约定)

• blas_threads_and_memory — 矩阵分解为何慢 —— BLAS 线程、缓存、内存布局

参考(示例数据、文献)

• 示例数据目录(下载 URL / 许可证) —— 2-D 用 skimage.data(BSD/公有领域)加合成图,3-D 给出真实数据源(Stanford/PDS 等)的下载 URL。

• 算子来历与参考文献 —— 该算子族所依据的研究/方法出处。

可运行的示例(实际调用该算子并已验证的样例)

• curvature_grasp — py -3.11 examples_3d/curvature_grasp.py

• itokawa_curvature — py -3.11 examples_3d/itokawa_curvature.py

类型可衔接的下一个算子(可接受 descriptor 作为输入)

fuse_to_voxel · shape_distance

同类别(curvature)

principal_curvatures · mean_curvature · gaussian_curvature · estimate_normals


*Provenance: curvature3d.py — 3D 算子登记表。本条目由 tools/opdocs.py md 自动生成(请勿手工编辑)。*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.