emva_filter_distortion — OPTICS sensorchar op

• Data kinds: matrix → table

• Call: import fullseye as fs; fs.ledger.emva_filter_distortion(kernel, temporal_alpha=1.0) (implementation को सीधे call करना हो तो import sensorchar; sensorchar.emva_filter_distortion(kernel, temporal_alpha=1.0), registry से लेना हो तो opsoptics.get("emva_filter_distortion"))

उपयोग

camera के भीतर का linear preprocessing EMVA 1288 Linear की संख्याओं को कितना बदलता है: closed form (इस family की व्युत्पत्ति, मानक के समीकरण नहीं)।

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

*kernel*: 画像ごとにかかる 2-D の線形フィルタ w(1 × 1 なら数字のゲイン g)。*temporal_alpha*: 続けた画像にかかる 1 次の再帰 y_t = α x_t + (1 − α) y_{t−1}(1 = 時間フィルタ無し)。平均は G = Σw 倍、白い時間雑音の分散は Σw² 倍になる。2 枚の差の分散(式 18)は再帰で α²/(2 − α) 倍になる。S = (Σw²/G²) · α²/(2 − α) とおくと、photon transfer(式 50)の傾き K' = G S K、応答 R' = G R(式 49)、η' = R'/K' = η/S(式 52)、σ_d' = σ_d/√S(式 53、量子化を無視)、SNR(μ_p)' = SNR/√S(式 21)。固定パターンは空間の w だけを通る: 白い画素の模様の分散は Σw² 倍、列の模様は Σ_n(Σ_m w[m][n])² 倍、行も同様。だから DSNU1288' [e⁻] = DSNU · √(gain_x)/S、PRNU1288' = PRNU · √(gain_x)(gain_x = 正規化した各成分の利得)。隣の画素の時間雑音の相関の予測 ρ_h・ρ_v・ρ_d と分散比(emva_noise_whiteness と同じ定義)も返す。

前提(破ると閉形式は近似): 量子化と飽和を無視、空間の境界は周期(端の画素を考えない)、雑音と模様は白い。

返り値 {"G", "sum_w2", "S_spatial", "S_temporal", "S", "K_factor", "R_factor", "eta_factor", "sigma_d_factor", "snr_factor", "dsnu_e_factor": {"pixel", "col", "row"}, "prnu_factor": {...}, "pattern_gain": {...}, "rho_h", "rho_v", "rho_d", "variance_ratio_2x2", "rho_t"}。

Raises ValueError: 2-D の実数でない / NaN・inf / Σw が正でない(平均の符号が反転・消える)/ temporal_alpha が (0, 1] の外。

पूरी 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_emva1288_in_camera_processing — py -3.11 examples/poc_emva1288_in_camera_processing.py

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

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

इसी category के (sensorchar)

emva_pair_statistics · emva_photon_transfer · emva_quantum_efficiency · emva_linearity_error · emva_snr_curve · emva_sensitivity_threshold · emva_dynamic_range · emva_dark_current


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

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