normals_to_egi — REPRCONV direction op

• 데이터 종류: normals → image2d

• 호출: import fullseye as fs; fs.ledger.normals_to_egi(normals, n_az=36, n_el=18)(구현을 직접 호출하려면 import reprconv; reprconv.normals_to_egi(normals, n_az=36, n_el=18), 원장에서 가져오려면 opsreprconv.get("normals_to_egi"))

사용법

법선 (N,3) → 확장 가우스 상 (n_el, n_az) 의 image2d.

방향의 2-D 히스토그램(Horn, *Extended Gaussian Images*, Proc. IEEE 72(12) 1984). "어느 방향의 면이 얼마나 있는가"의 지도로, 평면이 지배적인 물체에서는 1 개의 bin 에 산이 선다. 비가역 —— bin 폭만큼의 방향 해상도를 버린다. 버린 양은 잴 수 있다: 최빈 bin 의 중심 방향과 입력 평균 방향의 각도 차가 양자화 오차이며, 기본값 (36, 18) 에서는 bin 폭 10 도에 대해 실측 3.7 도(selftest 가 낸다).

앙각의 bin 은 sin(el) 로 등분한다(등입체각). 도로 등분하면 극이 지나치게촘촘해져서 "북극에 면이 집중되어 있다"는 거짓 산이 선다.

★위치의 점군을 넘겨도 예외는 나지 않는다. backends_typed.TYPE_TO_SORT 가 normals 를 points 로 접어 넣고 있으므로, 진화기도 대장도 둘을 구별하지 않는다. 이 op 는 방향만 보므로(길이는 버린다), (N,3) 의 좌표를 넘기면 "원점에서 각 점을 본 방향"의 히스토그램이 그럴듯하게 반환된다. 실측(2026-09-08, 200 점의 곡선 vs 전부 바로 위를 향한 법선): 0 아닌 bin 이 1 → 12, 최대 bin 이 200 → 44 로 바뀔 뿐이며, 총합은 둘 다 200. "총합이 점 수와 맞으니 옳다"로는 구별이 되지 않는다. fullseye.set_system("extra_checks", "on") 으로 하면, 단위 길이에서 벗어난벡터를 거부한다(아래 Raises).

Args:

normals: (N, 3).

n_az: 방위의 bin 수(기본값 36 = 10 도 간격).

n_el: 앙각의 bin 수(기본값 18).

Returns:

(n_el, n_az) float64 의 계수 맵(행 = 앙각, 열 = 방위).

Raises:

ValueError: bin 수가 1 미만 / 상한 초과 / 입력 부정.

ValueError: extra_checks='on' 에서, 길이가 1 에서 1e-6 을 넘게 벗어나는

벡터를 포함할 때(위치의 점군을 법선으로 넘긴 사고를 잡는다).

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

• 샘플 데이터 카탈로그(DL URL / 라이선스) —— 2-D 는 skimage.data(BSD/public)+ 합성, 3-D 는 실데이터 소스(Stanford/PDS 등)의 DL URL.

• 연산자의 내력·참고문헌 —— 이 연산자 족의 바탕이 된 연구/기법의 출처.

• 알고리즘의 정전(저자·연도)과 용도는 위의 패밀리 사용 가이드에 적혀 있습니다.

실행 가능한 예제(이 연산자를 실제로 호출하는 검증된 샘플)

• representation_conversion — py -3.11 examples/representation_conversion.py

타입이 이어지는 다음 연산자(image2d 를 입력으로 받는 것)

keypoints_from_image2d

같은 카테고리(direction)

normals_to_angles · angles_to_normals


*Provenance: reprconv.py — REPRCONV 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*

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