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와 함께 쓰기 — 형상을 만들고 fullseye로 측정(축·단위·정답 데이터의 함정)

• measurement_uncertainty — 측정 불확도와 교정 지식 — ‘측정되고 있다’고 주장하려면

참고(샘플 데이터·문헌)

• 샘플 데이터 카탈로그(DL URL / 라이선스) —— 2-D 는 skimage.data(BSD/public)+ 합성, 3-D 는 실데이터 소스(Stanford/PDS 등)의 DL 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 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*

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