normal_consistency — 3D metrics op

• 資料種類:points × normals → measurement

• 呼叫: import fullseye as fs; fs.ledger.normal_consistency(points_a, normals_a, points_b, normals_b)(要直接呼叫實作,import metrics3d; metrics3d.normal_consistency(points_a, normals_a, points_b, normals_b);從台帳取用則 ops3d.get("normal_consistency"))

用法

最近鄰對應下的法線一致度 = mean|cos(na, nb)|(忽略朝向)。→ [0,1]。1=完全一致。

Raises ValueError:點雲為空或不是 (N,3)/法線與點不是 1 對 1 時。

計算:對 points_a 的每個點求 points_b 中的最近鄰(cKDTree,k=1),把該點的法線 nb 與自身的法線 na 單位化(除以範數 + 1e-12) 後對 |na · nb| 取平均。由於取絕對值,法線方向(正反面)的不一致會被忽略。非對稱(僅 a → b 一個方向。需要反方向時交換參數再呼叫一次)。

參數:points_a (N, 3)、normals_a (N, 3)、points_b (M, 3)、normals_b (M, 3)。檢查 4 個皆為非空的 (*, 3),且法線的列數與對應點雲的列數一致(違反時為 ValueError)。零法線被 1e-12 除,貢獻幾乎為 0(不報錯)。

回傳值:Python float,[0, 1]。1 = 所有對應的法線皆平行。隨機的法線對在 3-D 中期望值約為 0.5(cos 絕對值的平均)。

注意:不看位置的遠近(即使是很遠的最近鄰也只比較法線)。要結合位置評估時與 chamfer_distance / fscore 併用。沒有法線的點雲先以 estimate_point_normals(局部 PCA)產生後再傳入。

背景知識指南(該運算子背後的物理與規範)

• blender_interop — 與 Blender 搭配使用 —— 在 Blender 中建形、用 fullseye 量測(座標軸、單位、真值資料的陷阱)

• measurement_uncertainty — 量測不確定度與校正知識 —— 為了能主張「量得準」

參考(範例資料、文獻)

• 範例資料目錄(下載 URL / 授權) —— 2-D 用 skimage.data(BSD/公有領域)加合成圖,3-D 給出真實資料源(Stanford/PDS 等)的下載 URL。

• 運算子來歷與參考文獻 —— 該運算子族所依據的研究/方法出處。

可執行的範例(實際呼叫該運算子並已驗證的樣例)

• metrics_eval — py -3.11 examples_3d/metrics_eval.py

型別可銜接的下一個運算子(可接受 measurement 作為輸入)

vol_gaussian_psf · fuse_to_voxel · fresnel_reflectance · snell_angle

同類別(metrics)

chamfer_distance · hausdorff_distance · m3c2_distance · fscore · rmse_correspondence · voxel_iou · pose_error


*Provenance: metrics3d.py — 3D 運算子登記表。本條目由 tools/opdocs.py md 自動產生(請勿手動編輯)。*

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