light_section_render — OPTICS light_section op

• Data kinds: table × pairs → image2d

• Call: import fullseye as fs; fs.ledger.light_section_render(rig, profile, line_sigma_px=1.5, peak=1.0, background=0.0, noise=0.0, seed=0, sampling='point') (implementation को सीधे call करना हो तो import lightsection; lightsection.light_section_render(rig, profile, line_sigma_px=1.5, peak=1.0, background=0.0, noise=0.0, seed=0, sampling='point'), registry से लेना हो तो opsoptics.get("light_section_render"))

• GPU: नहीं (केवल CPU reference implementation)

उपयोग

rig के camera से दिखती, surface profile पर पड़ी laser line की image (image2d)।

> नीचे का विस्तृत विवरण मूल text में है — सारांश और headings का अनुवाद हो चुका है।

profile は光面(世界 Y = 0)上の断面 (x_mm, h_mm) の (K, 2) の並び(x は単調増加)。

各点を camera.project_points で写し、画像の列ごとに断面の像の行 v(u) を線形補間し、行の向きに σ = line_sigma_px のガウスの光条を描く(sampling="point" = 画素中心の点標本、"pixel" = 画素の面積で積分した誤差関数の差)。断面の外の列は背景だけ。noise は加法ガウス雑音の標準偏差(seed)。

profile is the (K, 2) cross-section (x_mm, h_mm) on the laser plane (x increasing). The points are projected with camera.project_points, the image row of the profile v(u) is linearly interpolated per column, and a Gaussian line of σ = line_sigma_px is drawn along the rows ("point" = point samples at pixel centres, "pixel" = the pixel-area integral). ★Limits: constant line width, no foreshortening, no defocus, no self-occlusion (a step's shadow) and no inter-reflection; a profile whose image folds over (u not monotonic) is refused. The rig must carry R, t (made by light_section_rig).

पूरी family का input contract (fail-closed)

optics के सभी ops गणना से पहले input की जाँच करते हैं (कुछ भी चुपचाप पास नहीं होता):

• Unit argument के नाम में ही लिखी होती है — _mm / _um / _deg / _mrad। mm और µm की गड़बड़ी crash नहीं करती, बल्कि "सही दिखने वाला पर गलत उत्तर" देती है, इसलिए नाम से इसे रोका जाता है। मान के आकार से unit का अनुमान बिल्कुल नहीं लगाया जाता।

• String से ValueError — float('50') सफल हो जाता है, इसलिए बिना parse किया config value length के रूप में निकल जाता (मापा गया: thin_lens('50', '200') सही दिखने वाला 66.667 mm लौटा रहा था)। bool को भी True == 1 वाले implicit promotion के रूप में अस्वीकार किया जाता है।

• complex / masked array से ValueError (केवल real-valued slots; imaginary part को चुपचाप छोड़ना या mask हटाना अस्वीकार)। हर input पर NaN/Inf से ValueError। घोषित अपवाद: bottle_fit_from_pattern का u_map न मापे जा सके पिक्सेल को NaN के रूप में लेता है (अनंत अब भी अस्वीकार)।

• शून्य से भाग और उससे जुड़े मामलों को नाम लेकर अस्वीकार किया जाता है: focal length 0, radius of curvature 0, refractive index <= 0, पूरी तरह opaque aperture (सब 0, इसलिए normalisation 0/0), ऐसा PSF जिसका योग <= 0 हो, S0 = 0 वाला Stokes vector, और front focal point पर रखा object (image अनंत पर)।

• केवल 2 ops non-finite value लौटाते हैं, और वह भी contract के रूप में लिखा हुआ: depth_of_field hyperfocal distance से आगे far_mm = inf (hyperfocal distance की परिभाषा यही है) और gaussian_beam waist पर wavefront_radius_mm = inf (plane wavefront की radius of curvature)। दोनों साथ में एक finite साथी (far_is_infinite / curvature_per_mm) भी लौटाते हैं। इसके अलावा कोई भी चुपचाप आया NaN/Inf अंदर ही पकड़ा जाता है और ValueError देता है — "float64 overflow हुआ" और "उत्तर अनंत है" अलग-अलग दावे हैं, इसलिए पहले को दूसरे का चेहरा पहनाकर नहीं लौटाया जाता। घोषित अपवाद: bottle_background_map जिन पिक्सेल की किरण अनुपयोगी है (पूर्ण आंतरिक परावर्तन आदि) उनके लिए u_mm में NaN लौटाता है, साथ में valid मास्क और गिनती भी।

• Size की सीमा: generate होने वाले grid के लिए optics.MAX_GRID (4096), दिए गए field/PSF/aperture के लिए optics.MAX_FIELD_ELEMENTS (2^24), ABCD element chain के लिए optics.MAX_SYSTEM_ELEMENTS (1024), Zernike के लिए MAX_ZERNIKE_TERMS (512) / MAX_ZERNIKE_ORDER (40) / MAX_ZERNIKE_BASIS (2^25)। छोटे argument से बहुत बड़ा internal allocation होने वाले रास्तों (मापा गया: n_max=40 × 4096² पर 108 GB) को fail-closed ढंग से बंद किया गया है।

• भौतिक रूप से असंभव states भी अस्वीकार: degree of polarisation > 1 वाला Stokes vector, ऋणात्मक transmittance, ऋणात्मक intensity, और n-|m| odd जैसे अमान्य Zernike indices।

उपयोग की विस्तृत guide

• optics_imaging family guide

संदर्भ (sample data, साहित्य)

• Sample data catalog (DL URL / license) — 2-D के लिए skimage.data (BSD/public) + synthetic, 3-D के लिए real data sources (Stanford/PDS आदि) के DL URL।

• Operators का स्रोत और संदर्भ — इस op family के मूल research/methods के स्रोत।

• Algorithm का मानक स्रोत (लेखक, वर्ष) और उपयोग ऊपर की family usage guide में दिए गए हैं।

चलाए जा सकने वाले उदाहरण (verified samples जो सच में यह op call करते हैं)

• poc_light_section_step_weld_floor — py -3.11 examples/poc_light_section_step_weld_floor.py

वे अगले ops जिनसे type जुड़ता है (image2d को input के रूप में लेते हैं)

fraunhofer_pattern · pupil_psf · pupil_blur · psf_to_mtf · encircled_energy · ensquared_energy · energy_radii · mtf_tangential_sagittal

इसी category के (light_section)

laser_line_center_centroid · laser_line_center_gauss · laser_line_center_steger · light_section_rig · light_section_targets · light_plane_calibrate · light_section_profile · light_section_scan


*Provenance: lightsection.py — OPTICS operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*

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