defocus_blur — OPTICS scene op

• 데이터 종류: rgbimage × image2d × table → rgbimage

• 호출: import fullseye as fs; fs.ledger.defocus_blur(image, depth_mm, camera, f_number: 'float' = 5.6, focus_mm: 'float' = None, layers: 'int' = 7) -> 'np.ndarray'(구현을 직접 호출하려면 import optscene; optscene.defocus_blur(image, depth_mm, camera, f_number: 'float' = 5.6, focus_mm: 'float' = None, layers: 'int' = 7) -> 'np.ndarray', 원장에서 가져오려면 opsoptics.get("defocus_blur"))

• GPU: 없음(CPU 참조 구현만)

사용법

깊이 정답으로부터 피사계 심도 흐림을 입힙니다(이상적 핀홀 상 → 실제 렌즈의 상).

이름이 optics.depth_of_field와 헷갈리기 쉬워 나누어 두었다: 그쪽은 피사계 심도의 수치를 반환하고, 이쪽은 이미지에 흐림을 건다(2026-09-05에 대장에서 동명 충돌을일으켜 발각. 동명 op는 나중에 등록된 쪽이 조용히 덮어쓰므로, 이름으로 구별한다).

착란원의 지름은 기하 광학의 닫힌 식 c = (f² / (N (z_f − f))) · |z − z_f| / z(f = 초점 거리, N = F값, z_f = 합초 거리). 화소 수로 고쳐, 깊이로 묶은 층마다 가우스 흐림을 걸고, 앞쪽 층부터 합성한다.

합성은 앞에서부터의 over 합성(사전 곱셈된 색과 흐린 피복률 α를 써서, 앞쪽 층이덮은 만큼 뒤쪽 층을 가린다). 초점이 맞은 불투명한 앞쪽 면은 뒤쪽 흐림에 오염되지 않는다(★2026-11-05까지 모든 층을 더해 흐린 가중치로 나누고 있어, 초점면의 가장자리가 1.0 -> 0.67 로 떨어졌다). 마지막에 누적 α로 나누는 것은, 핀홀 상에 찍히지 않은 "앞쪽의 그늘" 부분을 주위의 색으로 메우기 위해서다.

깊이 +inf(무한원)는 z -> ∞의 극한 c = f² / (N (z_f − f))로 흐리게 한다(★2026-11-05까지 합초 거리로 바꿔 넣고 있어, 무한원이 또렷하게 찍혔다). NaN과 -inf는 깊이가 없는 화소로서 종래대로 합초로 취급한다. 층은 깊이의 반개구간 [e_i, e_{i+1})로 나누므로(마지막 층만 양끝을 포함), 경계 위의 깊이가 2개 층에 중복되지 않는다.

이것이 없으면 "시야에는 들어오는데 실기에서는 초점이 맞지 않는" 구성을 놓친다 ―― 가상화의 목적은 그림을 만드는 것이 아니라 그 광학 구성으로 검사가 성립하는가를먼저 아는 것이므로, 피사계 심도는 생략할 수 없다.

focus_mm을 생략하면 camera의 작동 거리에 맞춘다. 반환값은 입력과 같은 형태.

패밀리 공통 입력 계약(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.단, 선언된 결측은 예외: bottle_fit_from_pattern 의 u_map 은 측정하지 못한 픽셀을 NaN 으로 받습니다(∞ 는 여전히 거부).

• 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 가 넘쳤다」와 「답이 무한대다」는 다른 주장이므로, 후자의 얼굴로 전자를 돌려주지 않습니다.단, 선언된 결측은 예외: bottle_background_map 은 광선을 쓸 수 없는 픽셀(전반사 등)의 u_mm 을 NaN 으로 돌려주며, valid 마스크와 개수를 함께 돌려줍니다.

• 크기 상한: 생성 격자는 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.

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

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

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

• poc_focus_stacking — py -3.11 examples/poc_focus_stacking.py

• virtual_machine_vision — py -3.11 examples/virtual_machine_vision.py

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

clearcoat_shade · wetness · diffraction_blur · sensor_capture · underwater_image · cubemap_from_equirect · viewport_from_equirect · equirect_rotate

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