hdr op• Data kinds: images → image2d
• Call: import fullseye as fs; fs.ledger.hdr_merge(images, exposures, response=None, weight='hat', saturation_margin=1, dark_level=None) (implementation को सीधे call करना हो तो import hdrfusion; hdrfusion.hdr_merge(images, exposures, response=None, weight='hat', saturation_margin=1, dark_level=None), registry से लेना हो तो opsoptics.get("hdr_merge"))
• GPU: नहीं (केवल CPU reference implementation)
exposure series को relative radiance map में merge करता है (image2d)।
> नीचे का विस्तृत विवरण मूल text में है — सारांश और headings का अनुवाद हो चुका है।
各露出の段 Z を逆応答 X(Z) で露光量に戻し、X / t を重みつきで合成する:
• weight="hat" / "gaussian": Debevec の対数の重み平均 ln E = Σ w(Z)(ln X(Z) − ln t) / Σ w(Z)(X ≤ 0 の段は重み 0)。
• weight="hat_time": 三角の重みに露出時間 t を掛ける。散弾雑音が支配するとき Var(ln X_j) ≈ 1/(η L t_j) なので、t に比例する重みが対数の推定の逆分散の重み(短い露出の暗い段の雑音を持ち込まない。暗部の傷の CNR が 4 倍、PoC で実測)。
• weight="linear": 光子数の和 E = Σ X / Σ t(飽和と Z ≥ L−1−margin を除く全露出、暗部の負の値も含む)。線形のセンサでは散弾雑音の最尤で、暗部も偏らない。
どの露出でも有効でない画素(全部で飽和 / 全部で真っ暗)は、最短(飽和)/ 最長(真っ暗)の露出 1 枚の値で埋める(下限 / 上限の推定 —— NaN を返さない約束。hdr_dynamic_range はここで測れる上限を数える)。response=None は「段 = 露光量」の線形(オフセット 0)。そのときの段数 L は float と uint8 で 256、それ以外の整数 dtype(uint16 に入った 12 bit のセンサ値など、満の値が dtype から決まらないもの)は系列の最大値 + 1 ―― つまり系列で最も明るい段を飽和とみなす。満の値が分かっているなら camera_response_* の応答表(levels)を渡すこと。三角の重みは [dark_level, L−1] に張る(既定 = 逆応答が初めて正になる段。暗いときのオフセットを持つセンサで、オフセットのすぐ上の雑音だらけの段に重みを与えないため)。
Returns radiance in inverse-units per exposure-time unit (relative: Debevec/Robertson fix only the scale g(mid) = 0). ★Assumes a static scene and registered frames.
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_hdr_glossy_metal_inspection — py -3.11 examples/poc_hdr_glossy_metal_inspection.py
image2d को input के रूप में लेते हैं)fraunhofer_pattern · pupil_psf · pupil_blur · psf_to_mtf · encircled_energy · ensquared_energy · energy_radii · mtf_tangential_sagittal
hdr)camera_response_debevec · camera_response_robertson · camera_response_linear · 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.