scene op• 데이터 종류: table × table × table → rgbimage
• 호출: import fullseye as fs; fs.ledger.render_optscene(scene, camera, lights, ambient: 'float' = 0.0, depth: 'int' = 2, shadows: 'bool' = True, supersample: 'int' = 1, adaptive: 'bool' = False, light_samples: 'int' = None, edge_threshold: 'float' = 0.06, saturate_at: 'float' = None, wavelength_nm: 'float' = 550.0, environment=None, environment_gain: 'float' = 1.0, environment_samples: 'int' = 12) -> 'np.ndarray'(구현을 직접 호출하려면 import optscene; optscene.render_optscene(scene, camera, lights, ambient: 'float' = 0.0, depth: 'int' = 2, shadows: 'bool' = True, supersample: 'int' = 1, adaptive: 'bool' = False, light_samples: 'int' = None, edge_threshold: 'float' = 0.06, saturate_at: 'float' = None, wavelength_nm: 'float' = 550.0, environment=None, environment_gain: 'float' = 1.0, environment_samples: 'int' = 12) -> 'np.ndarray', 원장에서 가져오려면 opsoptics.get("render_optscene"))
검사용으로 촬영: 실재하는 조명기구를 물리 단위로 놓고 직접광을 셉니다(정답 포함).
외관을 만들기 위한 다중 반사·환경광은 넣지 않는다. 깔끔한 그림이 필요하면 render_studio ―― 만드는 방식이 다른 별개의 op이며, 혼동하면 측광의근거가 흐려진다. 반환값은 선형 RGB의 방사 휘도 (H, W, 3), 톤 매핑 전.
lights는 illumdesign.light_source의 결과(1개든 여러 개를 나란히 두든 좋다). ambient는 균일한 환경광, depth는 유전체를 통과하는 재귀의 깊이, shadows=False로 드리운 그림자를 끈다(빠르지만, 그림자가 있다는 전제의 검사에는 쓸 수 없다). supersample은 1화소당 표본을 n×n으로 늘린다 ―― 실제 화소는 면적을적분하므로, 가장자리나 가공 자국의 계단 모양 들쭉날쭉함이 이것으로 사라진다(비용은 n²배).
대량 생성을 위한 3개의 손잡이(속도는 생성기의 기능):
• adaptive=True ―― 먼저 1표본으로 찍고, 기하의 가장자리와 휘도 기울기가 큰 화소만 을 n×n으로 나눈다. 평탄한 면에는 표본을 버리지 않으므로, 가장자리의 질을 유지한 채 빨라진다.
• light_samples ―― 면광원의 발광점을 이 수로 솎아낸다(가중치로 밝기를 보정). 잃는 것은 그림자 가장자리의 부드러움이며, 밝기의 절댓값이 아니다.
• saturate_at ―― 이 휘도를 넘는 화소는 정밀화하지 않는다(어차피 하얗게 날아간다).
wavelength_nm은 광원의 파장. 면 거칠기 σ의 면이 경면으로 돌려보내는 비율 exp(-(4πσcosθ/λ)²)에 들어가므로, 같은 면이라도 파장에 따라 보이는 모습이 바뀐다. 광대역(할로겐)이라면 몇 개의 파장으로 찍어 더하고, 레이저라면 단일 파장으로 찍는다.
environment를 넘기면, 보여 주는 그림의 제작 방식을 여기에 섞을 수 있다: 금속의 이방성로브로 환경을 끌어온 만큼을 environment_gain배 해서 더한다. 브러시 결의 금속이금속으로 보이는 것은 환경이 결을 따라 늘어나 비치기 때문이며, 점광원만으로는 딱딱한줄무늬밖에 되지 않는다(2026-09-05 사용자의 착안). 기본값은 off ―― 측광의 근거가 필요한검사 이미지에, 외관을 위한 항을 조용히 섞지 않기 위함. optscene.env_studio를넘기는 것이 간편하며, 직접 만든 함수((...,3) 방향 -> (...,) 밝기)여도 좋다.
표시용으로 반올림하고 싶은 경우는 직접 **(1/2.2)한다. 실제 렌즈의 왜곡·PSF· 주변 광량·센서 잡음을 더하려면 lensimage.render_through_lens를 후단에, 양자화와 읽기 잡음만이라면 sensor_capture를 후단에 건다.
optics 의 모든 연산자는 입력을 검증한 뒤에 계산합니다(조용히 통과시키지 않습니다):
• 단위는 인자 이름에 넣습니다 — _mm / _um / _deg / _mrad. mm 와 µm 를 혼동하면 crash 가 아니라 「그럴듯하게 틀린 답」이 나오므로 이름으로 막습니다. 크기로 단위를 추측하는 처리는 일절 하지 않습니다.
• 문자열은 ValueError —— float('50') 은 성공하므로 파싱되지 않은 설정값이 길이로 통과해 버립니다(실측: thin_lens('50', '200') 이 그럴듯한 66.667 mm 를 돌려주고 있었습니다). bool 도 True == 1 의 암묵 승격으로 보고 거부합니다.
• complex / masked array 는 ValueError(실수 슬롯만. 허수부의 무언 절삭·마스크 벗기기를 거부).NaN/Inf 는 모든 입력에서 ValueError.
• 0 나눗셈과 그 친척들을 이름을 들어 거부: 초점거리 0, 곡률반경 0, 굴절률 <= 0, 불투명한 조리개(전부 0 이라 정규화가 0/0), 총합 <= 0 인 PSF, S0 = 0 인 스토크스 벡터, 물체가 앞쪽 초점에 있는 경우(상이 무한대).
• 비유한 값을 돌려주는 것은 2 개 연산자뿐이며, 둘 다 계약으로 명시: depth_of_field 의 과초점거리 너머 far_mm = inf(그것이 과초점거리의 정의)와 gaussian_beam 의 허리에서의 wavefront_radius_mm = inf(평면 파면의 곡률반경). 둘 다 유한한 짝(far_is_infinite / curvature_per_mm)을 함께 돌려줍니다. 그 밖의 무언 NaN/Inf 는 내부에서 검출해 ValueError —— 「float64 가 넘쳤다」와 「답이 무한대다」는 다른 주장이므로, 후자의 얼굴로 전자를 돌려주지 않습니다.
• 크기 상한: 생성 격자는 optics.MAX_GRID(4096), 넘겨받은 필드/PSF/조리개는 optics.MAX_FIELD_ELEMENTS(2^24), ABCD 소자열은 optics.MAX_SYSTEM_ELEMENTS(1024), Zernike 는 MAX_ZERNIKE_TERMS(512)/ MAX_ZERNIKE_ORDER(40)/ MAX_ZERNIKE_BASIS(2^25). 작은 인자에서 거대한 내부 할당이 일어나는 경로(실측: n_max=40 × 4096² 로 108 GB)를 fail-closed 로 막습니다.
• 물리적으로 불가능한 상태도 거부: 편광도 > 1 인 스토크스 벡터, 음의 투과율, 음의 강도, n-|m| 이 홀수인 잘못된 Zernike 첨자 등.
• dataset_conventions — 학습 데이터셋 규약 지식 — COCO / YOLO / VOC와 외관 검사의 함정
• mv_cameras — 산업용 카메라 제조사(센서와의 대응·라인 스캔 / TDI)
• mv_illumination_practice — 조명 실무 지식 — 파장·편광·점등 방식·외광·안전
• mv_image_sensors — 산업용 이미지 센서(현행 제품 중심)
• virtual_machine_vision — 가상 머신 비전 — 파라미터 도출과 객체 모형
• 샘플 데이터 카탈로그(DL URL / 라이선스) —— 2-D 는 skimage.data(BSD/public)+ 합성, 3-D 는 실데이터 소스(Stanford/PDS 등)의 DL URL.
• 연산자의 내력·참고문헌 —— 이 연산자 족의 바탕이 된 연구/기법의 출처.
• 알고리즘의 정전(저자·연도)과 용도는 위의 패밀리 사용 가이드에 적혀 있습니다.
• virtual_machine_vision — py -3.11 examples/virtual_machine_vision.py
rgbimage 를 입력으로 받는 것)clearcoat_shade · wetness · defocus_blur · diffraction_blur · sensor_capture
scene)scene_material · scene_plane · scene_sphere · scene_box · scene_cylinder · surface_defect · surface_finish · random_defects
*Provenance: optscene.py — OPTICS 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.