pixelshift op• Data kinds: video × matrix → rgbimage
• Call: import fullseye as fs; fs.ledger.pixel_shift_merge(frames, shifts, pattern='RGGB', scale=1, motion_threshold=0.0, noise_sigma=0.0) (implementation को सीधे call करना हो तो import pixelshift; pixelshift.pixel_shift_merge(frames, shifts, pattern='RGGB', scale=1, motion_threshold=0.0, noise_sigma=0.0), registry से लेना हो तो opsoptics.get("pixel_shift_merge"))
pixel-shift frames को nominal shifts से grid पर बाँटकर जोड़ता है। interpolation नहीं (हर grid बिंदु के samples का केवल औसत)।
> नीचे का विस्तृत विवरण मूल text में है — सारांश और headings का अनुवाद हो चुका है।
*frames*: (N, H, W) の生の画像(pixel_shift_capture の返り値、Bayer か白黒)。*shifts*: (N, 2) の公称のシフト(pixel_shift_pattern を error_px=0 で)。1/scale 画素の格子に乗っていなければ拒否する(任意のずれは astrostack.drizzle_resample)。*pattern*: Bayer の並び(None = 白黒)。*scale*: 1 = 同じ格子(1 画素シフト 4 枚 → 各画素に R・G・B)、2 = 半画素の格子(half4 / 16shot)。*motion_threshold*: > 0 なら pixel_shift_motion_mask で動いた格子点を見つけ、そこ(と 8 近傍)だけをシフト (0, 0) の 1 枚から作った像(Bayer は gfx2d.raw_demosaic_bilinear)に差し戻す —— 動いた所は「ピクセルシフトしなかった」画質に戻るが、櫛状の破綻は消える。0 なら差し戻さない。*noise_sigma*: 動き検出の雑音 σ(0 = 推定)。
返り値: (H·scale, W·scale, 3)(Bayer)/ (H·scale, W·scale)(白黒)の float64。
端の扱い: シフトのぶん、格子の端(最大シフトの幅)にはどの枚の標本も来ない色がある。そこは (0, 0) の 1 枚から作った像で埋める(黙って 0 にしない)。内側に標本の来ない格子点・色があれば(例: 1 画素シフト 4 枚を scale=2 で合わせる、2 枚だけの Bayer)、このシフト列では格子を埋められないので ValueError。
Raises ValueError: frames・shifts の形・非有限 / 格子に乗らないシフト / scale が 1〜4 でない / 内側の格子点に標本の来ない色がある / motion_threshold > 0 なのにシフト (0, 0) の枚が無い・動きを検出できない。
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_pixel_shift — py -3.11 examples/poc_pixel_shift.py
rgbimage को input के रूप में लेते हैं)clearcoat_shade · wetness · defocus_blur · diffraction_blur · sensor_capture · pixel_shift_capture · false_color_metric
pixelshift)pixel_shift_pattern · pixel_shift_capture · pixel_shift_motion_mask · false_color_metric · pixel_shift_resolution_budget
*Provenance: pixelshift.py — OPTICS operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.