light_section op• Data kinds: image2d → table
• Call: import fullseye as fs; fs.ledger.laser_line_center_gauss(image, min_peak_rel=0.1, half_window=2) (implementation को सीधे call करना हो तो import lightsection; lightsection.laser_line_center_gauss(image, min_peak_rel=0.1, half_window=2), registry से लेना हो तो opsoptics.get("laser_line_center_gauss"))
• GPU: नहीं (केवल CPU reference implementation)
हर column में line का केंद्र Gaussian fit (ln I पर weighted parabola) से sub-pixel में (table)।
> नीचे का विस्तृत विवरण मूल text में है — सारांश और headings का अनुवाद हो चुका है।
列ごとに最大の行 p のまわり 2·half_window + 1 点で ln I = a + b y + c y² を重み I² の最小二乗で当て(Guo 2011)、中心 p − b / (2c) を返す。half_window=1 は古典の 3 点の対数放物線。正でない画素は外し、3 点未満・c ≥ 0(上に凸でない)・中心が窓の外に出た列は valid=False。
Fits ln I = a + b y + c y² with weights I² (Guo 2011) on 2·half_window + 1 rows around the column's peak; the centre is p − b / (2c). half_window=1 is the classic three-point log-parabola. Non-positive samples are dropped; columns with fewer than three samples, c ≥ 0 or a centre outside the window are valid=False.
★Saturation: as in laser_line_center_centroid the peak is the plateau of rows within 1e-9 of the column maximum; the window runs half_window rows beyond each end of it and the plateau's samples are left out of the fit (clipped values are not the Gaussian — censored). The flanks of a clipped Gaussian still give its centre exactly; a window that holds fewer than three unclipped samples is valid=False (it used to fit the flat top at its first row: −6.2 px, valid=True). saturated (and the plateau handling) uses the rule of laser_line_center_centroid: ≥ 3 rows, or ≥ 2 rows at the image's maximum; other columns are unchanged bit for bit. A two-row plateau at the ceiling cannot be told from an unclipped line centred exactly between two rows, so with fewer than three flank samples (half_window=1) its two samples stay in the fit. A plateau broken by a 1 LSB dip is not detected (see laser_line_center_centroid).
Ground truth (theorem): the log of a Gaussian is a quadratic, so a point-sampled Gaussian line comes back at its sub-pixel centre to 1e-9 px. ★Pixel-integrated (box-filtered) profiles are not exactly Gaussian; the bias is then measured, not zero. Also returns sigma_px (the fitted Gaussian's σ = sqrt(−1/(2c))).
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।
• 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 में दिए गए हैं।
• poc_light_section_step_weld_floor — py -3.11 examples/poc_light_section_step_weld_floor.py
table को input के रूप में लेते हैं)abcd_matrix · wavefront_stats · sfr_from_edge · paraxial_trace · seidel_coefficients · spot_stats · tolerance_analysis · wavefront_from_opd
light_section)laser_line_center_centroid · laser_line_center_steger · light_section_rig · light_section_targets · light_section_render · 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.