emva_general_sensitivity — OPTICS sensorgeneral op

• Data kinds: signal × signal × signal → table

• Call: import fullseye as fs; fs.ledger.emva_general_sensitivity(mu_p, mu_y, var_y, mu_y_dark, var_y_dark, mu_p_sat, n_intervals=8) (implementation को सीधे call करना हो तो import sensorgeneral; sensorgeneral.emva_general_sensitivity(mu_p, mu_y, var_y, mu_y_dark, var_y_dark, mu_p_sat, n_intervals=8), registry से लेना हो तो opsoptics.get("emva_general_sensitivity"))

उपयोग

characteristic curve, input SNR, absolute sensitivity threshold, DR और photons में dark noise (General खंड 2.1-2.4, 6.6-6.8)।

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

*mu_p*: 露光段ごとの画素あたりの平均光子数。*mu_y*, *var_y*: 同じ露光の 2 枚から出した平均と時間分散(式 16・18、sensorchar.emva_pair_statistics)。*mu_y_dark*, *var_y_dark*: 暗画像の同じ量。*mu_p_sat*: 飽和の露光(0.1〜0.2 % の画素が最大値になる露光、6.7 節)。0 ≤ μ_p ≤ μ_p.sat の点だけを使う。

手順:

1. 特性曲線 μ_y − μ_y.dark = R(μ_p) を [0, μ_p.sat] を P 等分した 3 次 B-スプラインで当て、各点の傾き ∂μ_y/∂μ_p と暗い所の傾き R_d = ∂μ_y/∂μ_p|μ_p=0(式 25)を出す(6.6 節)。

2. 出力 SNR_y = (μ_y − μ_y.dark)/σ_y(式 7)、入力 SNR_p = μ_p |∂μ_y/∂μ_p| / σ_y(式 10)、理想 √μ_p(式 15)。

3. 逆の関係 μ_p(SNR_p) を同じ区間数の B-スプラインで当て、SNR_p = 1 の露光を μ_p.min とする(6.8 節)。測った SNR_p が 1 以下の点を含まなければ拒む(外挿になる。付録 D.1 は SNR ≈ 1 の露光を含めよと書く)。

3'. 照合用(規格の手順ではない): SNR_p が 1 をまたぐ隣の 2 点の間を log-log の直線で補間した mu_p_min_local。

規格の逆回帰は [0, SNR_max] 全体を P 等分した区間の 3 次で当てるので、SNR ≈ 1 の近くの点の雑音を拾いやすい

(2 万画素の合成センサで乱数 6 通り: 逆回帰 ±5 %、局所の補間 ±1 %)。

4. SNR_max = 測った SNR_p の最大(6.8 節。線形でないと飽和の露光で最大とは限らない)、DR = μ_p.sat/μ_p.min(式 21)。

5. 暗雑音 [光子] σ_d = √(σ²_y.dark − σ²_q)/R_d(General の式 50)。σ²_y.dark < 0.24 DN² なら推定せず上限 0.40/R_d (式 51)。

返り値 {"slope", "Rd", "snr_y", "snr_p", "snr_p_ideal", "mu_p_min", "mu_p_min_local", "snr_max", "mu_p_at_snr_max", "DR", "DR_dB", "sigma_d_p", "sigma_d_p_upper", "sigma_d_valid", "used", "fit", "n_intervals"}。★η・K・電子の単位の量は返さない(General では測れない、6.7 節)。

Raises ValueError: 長さが違う / μ_p.sat が正でない / 区間に点が足りない(B-スプラインの拒否)/ 傾きが 0 の点 / 分散が正でない点 / SNR_p ≤ 1 の点が無い / var_y_dark が負。

पूरी 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 के (sensorgeneral)

emva_general_nonuniformity · emva_general_relative_qe


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

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