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.