normals_from_depth — 3D range_image op

• 데이터 종류: depth → normalmap

• 호출: import fullseye as fs; fs.ledger.normals_from_depth(depth, fx=None, fy=None, cx=None, cy=None, orient_to_camera=True, spacing=None)(구현을 직접 호출하려면 import range_image; range_image.normals_from_depth(depth, fx=None, fy=None, cx=None, cy=None, orient_to_camera=True, spacing=None), 원장에서 가져오려면 ops3d.get("normals_from_depth"))

사용법

organized 깊이 → 방향이 붙은 단위 법선 (H,W,3). 이웃 화소의 3D 점의 외적(격자 구조 이용, O(HW)).

fx,fy 지정 시 원근, 미지정 시 정사영. orient_to_camera=True이면 법선을 카메라(원점) 방향으로 부호 통일.

★같은 이름의 다른 함수가 1 줄 파사드에 있다. fullseye.normals_from_depth는 (depth, K, smooth=0)의 원근판으로 K가 필수 이고, 이쪽(fullseye.ledger 경유 = range_image)은 K를 받지 않는 정사영판. 한쪽 호출법을 익히면, 다른쪽에서 TypeError가 된다(2026-09-08 실측).

★spacing=(dy, dx)는 정사영 모드에서의 화소 실제 치수. 기본값 None은 "1 화소 = 1 단위"이며, 비등방 격자(예: 열 0.05 mm × 행 0.5 mm)를 그대로넘기면 기울기가 조용히 어긋난다 —— 실측으로 x 성분이 20 배(= 1/dx 배) 벗어났고, 예외도경고도 나오지 않았다. 실제 치수를 알고 있다면 반드시 넘길 것. 원근 모드(fx/fy 지정)에서는 초점 거리가 실제 치수를 정하므로 무시된다. ★spacing을 넘길 때는 orient_to_camera=False 로 할 것. 정사영에서의 "카메라"는 원점(왼쪽 위·깊이 0)이라는 편의적인 것으로, 실제 치수를 넣으면 면에 대한그 위치가 바뀌어 부호가 반전될 수 있다(실측: 기울기 0.1의 평면에서 orient_to_camera=False이면 참값 x=-0.0995와 일치, True에서는 +0.0995). 방향이 필요하면 시선을 정의할 수 있는 좌표계에서 후단에서 맞춘다.

법선은 인접 화소의 외적으로 내므로 두 축 모두에 근방이 필요하다. H<2 or W<2는 제2 접선 방향이 없어법선을 정의할 수 없다(그 축의 기울기를 0으로 간주하면 cross(dPx,0)=[0,0,0]의 퇴화 법선을조용히 반환해 버린다). fail-closed로 명시적으로 ValueError 거부한다.

계산은 depth_to_organized_points로 3-D 점 P를 만들고, np.gradient의 열 방향차분 dPx와 행 방향 차분 dPy의 외적 dPx × dPy를 단위 길이로 한다(끝은 단측 차분). orient_to_camera=True에서는 n·(-P) < 0인 화소를 반전하여, 법선이 원점(카메라)을 향하도록맞춘다. 정사영 모드(fx나 fy가 None)에서는 P=(u,v,d)이므로 원점은 영상왼쪽 위의 깊이 0 위치가 되며, "카메라 방향"의 의미가 원근 모드와 다른 점에 주의. cx· cy 생략 시는 영상 중심. 깊이의 계단(차폐 에지)을 넘는 화소에서는 외적이 계단의 방향을잡아 법선이 망가지므로, occlusion_edges로 경계 화소를 제외한 뒤 사용한다. 깊이 0 / NaN인화소는 검증하지 않으며, 법선도 부정이 된다. 반환값은 float32의 (H,W,3).

배경 지식 가이드(이 연산자 앞에 있는 물리·규약)

• blender_interop — Blender와 함께 쓰기 — 형상을 만들고 fullseye로 측정(축·단위·정답 데이터의 함정)

• depth_sensors — 깊이 센서 지식 — 측거 원리·실기 수치·결측이 나타나는 방식

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

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

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

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

• range_image — py -3.11 examples_3d/range_image.py

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

fuse_to_voxel · render_shaded · phong_shade · matcap_shade · brdf_lommel_seeliger · brdf_hapke · bump_normals_fbm · integrate_normals

같은 카테고리(range_image)

depth_to_organized_points · occlusion_edges · bearing_angle_image


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

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