light_section op• Data kinds: image2d → table
• Call: import fullseye as fs; fs.ledger.laser_line_center_steger(image, sigma=1.5, min_peak_rel=0.1, max_iter=3) (implementation को सीधे call करना हो तो import lightsection; lightsection.laser_line_center_steger(image, sigma=1.5, min_peak_rel=0.1, max_iter=3), registry से लेना हो तो opsoptics.get("laser_line_center_steger"))
• GPU: नहीं (केवल CPU reference implementation)
Steger की Hessian विधि से line का sub-pixel केंद्र (table)।
> नीचे का विस्तृत विवरण मूल text में है — सारांश और headings का अनुवाद हो चुका है।
ガウスの微分(scipy.ndimage.gaussian_filter、σ = sigma)で 1 次・2 次の微分を取り、Hessian の絶対値最大の固有値(明るい線では負)の固有ベクトル n を線の法線とし、2 次の Taylor 展開の極値 t = −(r_x n_x + r_y n_y) / (r_xx n_x² + 2 r_xy n_x n_y + r_yy n_y²) を線の中心とする(Steger 1998)。列ごとに平滑化した画像の最大の行から始め、t n が画素の外(|·| > 0.5)なら隣の画素へ移って max_iter 回まで繰り返し、|t n|∞ が最小の画素の値を採る(中心がちょうど画素の境にあると Newton の 1 歩の行き過ぎで 2 画素の間を往復するので、0.5 の厳密な判定だけでは拾えない —— 実測)。最小でも |t n|∞ > 1(隣の画素より遠い)・固有値が負でない列は valid=False。中心は 2-D の点(col も実数)。
Steger (1998): with Gaussian-derivative filters of scale sigma the line normal n is the eigenvector of the Hessian's largest-magnitude eigenvalue (negative for a bright line), and the centre is the extremum of the second-order Taylor polynomial along n. The point is 2-D (col is sub-pixel too). Also returns strength (−eigenvalue) and the normal nx, ny.
Ground truth (closed form of one Newton step on a Gaussian): for a Gaussian profile of total variance σ² = σ_line² + sigma² and a start pixel at offset δ from the centre, the error is −δ³ / (σ² − δ²) (≤ 0.125/σ² px for |δ| ≤ 0.5). Steger's condition sigma ≥ w/√3 (w = the line's half-width) keeps the profile's second derivative single-signed.
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।
• शून्य से भाग और उससे जुड़े मामलों को नाम लेकर अस्वीकार किया जाता है: 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 हुआ" और "उत्तर अनंत है" अलग-अलग दावे हैं, इसलिए पहले को दूसरे का चेहरा पहनाकर नहीं लौटाया जाता।
• 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_gauss · 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.