camera_response_robertson — OPTICS hdr op

• Data kinds: images → table

• Call: import fullseye as fs; fs.ledger.camera_response_robertson(images, exposures, levels=256, max_iter=30, tol=1e-06, max_pixels=200000) (implementation को सीधे call करना हो तो import hdrfusion; hdrfusion.camera_response_robertson(images, exposures, levels=256, max_iter=30, tol=1e-06, max_pixels=200000), registry से लेना हो तो opsoptics.get("camera_response_robertson"))

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

उपयोग

Robertson, Borman और Stevenson के alternating estimate से camera का inverse response (table)।

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

E_i = Σ_j w(Z_ij) t_j I(Z_ij) / Σ_j w(Z_ij) t_j²(放射輝度)と I(m) = mean{ t_j E_i : Z_ij = m }(逆応答)を交互に、I((L−1)/2) = 1 で正規化して相対変化が tol を切るまで。重みはガウス exp(−4 (z − c)²/c²) で、両端の段(0 と L−1 = 真っ黒と飽和)は 0(放射輝度の式が w t² で重むので、端に残る小さな重みでも飽和した長い露出が支配する —— 実測)。画素は max_pixels 個まで等間隔に間引く(決定的)。観測の無い段は隣の段から線形補間。

Returns the same table as camera_response_debevec (method="robertson", with iterations and converged). ★max_iter=30 follows OpenCV's CalibrateRobertson default. With noisy data the fixed point is biased near both ends (censored pixels just below saturation / just above the dark offset): measured on a 5-exposure EMVA series, the ln error at level 240 grows from −0.03 (20 iterations) to −0.25 (500) while mid levels stay within 0.02 — more iterations is not better. Debevec's smoothness prior does not drift this way. The scale is fixed by I(mid) = 1 (g(mid) = 0).

पूरी 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।

• शून्य से भाग और उससे जुड़े मामलों को नाम लेकर अस्वीकार किया जाता है: 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।

उपयोग की विस्तृत 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_hdr_glossy_metal_inspection — py -3.11 examples/poc_hdr_glossy_metal_inspection.py

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

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

इसी category के (hdr)

camera_response_debevec · camera_response_linear · hdr_merge · exposure_fusion_mertens · hdr_exposure_series_simulate · hdr_radiance_error · hdr_dynamic_range


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

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