optical_budget — OPTICS scene op

• 데이터 종류: 없음 → table(인자만으로 정해지는 연산자 —— 이미지나 데이터 입력을 받지 않습니다)

• 호출: import fullseye as fs; fs.ledger.optical_budget(focal_mm: 'float' = 25.0, working_distance_mm: 'float' = 200.0, f_number: 'float' = None, na: 'float' = None, pixel_um: 'float' = 3.45, wavelength_nm: 'float' = 550.0, coc_um: 'float' = None) -> 'dict'(구현을 직접 호출하려면 import optscene; optscene.optical_budget(focal_mm: 'float' = 25.0, working_distance_mm: 'float' = 200.0, f_number: 'float' = None, na: 'float' = None, pixel_um: 'float' = 3.45, wavelength_nm: 'float' = 550.0, coc_um: 'float' = None) -> 'dict', 원장에서 가져오려면 opsoptics.get("optical_budget"))

사용법

관찰 광학계의 분해능 버짓을 닫힌 식으로 냅니다(찍기 전에 성립하는지 봅니다).

NA와 F값은 어느 쪽으로 주어도 된다(N = 1/(2·NA)). 배율은 얇은 렌즈 근사 m = f / (WD − f), 실효(작동) F값은 N_w = (1 + |m|)·N. 반환하는 양:

magnification 배율 m / f_number_working N_w /

airy_um = airy_radius_um 에어리 반경 1.22·λ·N_w(상면, Rayleigh의 2점 분리) /

airy_diameter_um 에어리 직경 2.44·λ·N_w / airy_object_um 반경을 물체 측으로 환산 /

pixel_object_um 화소의 물체 측 실제 치수 / limit_um 실제 분해 한계

(회절 = 에어리 직경의 물체 측 값과, 표본화 = 2 화소의 물체 측 값 중 큰 쪽) / limited_by 어느 쪽이 병목인지 /

dof_um = dof_combined_um 피사계 심도(물체 측, 기하와 회절의 합) / dof_geometric_um 착란원의 기하 심도

(얇은 렌즈의 근점·원점) / dof_diffraction_um Rayleigh λ/4의 초점 심도 ±2·λ·N_w²(전폭 4·λ·N_w²)를 m²로

물체 측으로 환산 / coc_um 허용 착란원(기본값은 화소 피치).

식은 visiondesign과 하나(visiondesign._diffraction_limits / _depth_of_field)이며, 같은 구성이라면 visiondesign.system_feasibility의 depth_of_field_geometric_mm / _diffraction_mm / _combined_mm 와 이름별로 일치한다. 2026-10-15까지는 두 입구가 다른 식이어서, f 25·WD 200·F4·3.45 µm에서 피사계 심도가 1.55 mm(기하만)와 2.67 mm(기하 + 회절의 절반), 병목 판정이 에어리 직경과 반경으로 2배 어긋나 있었다.

"보이는가"가 아니라 "필요한 콘트라스트로 찍히는가"를 정하는 전단의 숫자이며, 여기가 부족한 구성으로는 아무리 화상을 만들어도 실기에서 검사가 성립하지 않는다.

패밀리 공통 입력 계약(fail-closed)

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 첨자 등.

자세한 사용 가이드

• optics_imaging 패밀리 가이드

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

• 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.

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

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

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

• vision_layout_from_catalog — py -3.11 examples/vision_layout_from_catalog.py

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

abcd_matrix · wavefront_stats · sfr_from_edge · paraxial_trace · seidel_coefficients · spot_stats · tolerance_analysis · wavefront_from_opd

같은 카테고리(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.