lf_synthetic_aperture — LIGHTFIELD refocus op

• Data kinds: lightfield → image2d

• Call: import fullseye as fs; fs.ledger.lf_synthetic_aperture(lf, slope=0.0, mask=None, *, reduce='mean', interp='linear', edge='nearest') (implementation को सीधे call करना हो तो import lightfield; lightfield.lf_synthetic_aperture(lf, slope=0.0, mask=None, *, reduce='mean', interp='linear', edge='nearest'), registry से लेना हो तो opslightfield.get("lf_synthetic_aperture"))

उपयोग

आकार दिए गए aperture से refocus करता है — और reduce="median" के साथ, occluders के आर-पार भी।

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

Same shift-and-add geometry as lf_refocus, with two additions:

• *mask* — a (V, U) weight array from lf_aperture_mask (or your own). A small mask is a stopped-down aperture: less defocus blur, less light. None weights every view equally.

• *reduce* — how the aligned views are combined. mean is the classical (and linear) synthetic aperture. median is the interesting one: when a foreground occluder covers a *minority* of the views at a pixel, the median rejects it and the background behind it is reconstructed — looking through a fence, or through a rack of parts. max / min are the order-statistic extremes, useful for specular / shadow work. median, max and min use the mask only to *select* views (weight > 0), because an order statistic has no meaningful weighting; that is stated here rather than silently ignoring the weights.

The see-through result is not a metaphor. When fewer than half the views are blocked at a hidden pixel, more than half of them carry the identical background sample and the median is that sample exactly. Measured 2026-09-01 on a 9x9x64x64 field with an occluder covering 25% of the centre view at slope 3.0 (blocking at most 46% of the views at any hidden pixel):

RMS against the true, hidden background was 0.0 for median and 0.159 for mean, with the centre view itself at 0.280. Push the coverage to 35% (up to 60% of views blocked) and the guarantee is gone — the median lands at 0.133, worse than nothing.

Returns a (H, W) 2-D image.

Raises ValueError: *lf* not a valid light field, a *mask* whose shape is not (V, U) or which is non-finite / negative / selects no view, a non-finite or over-large *slope*, unknown *reduce* / *interp* / *edge*.

उपयोग की विस्तृत guide

• lightfield_depth 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 करते हैं)

• lightfield_depth — py -3.11 examples/lightfield_depth.py

• poc_compound_eye — py -3.11 examples/poc_compound_eye.py

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

lf_from_mla · lf_disparity_to_depth · lf_all_in_focus

इसी category के (refocus)

lf_refocus · lf_focal_stack · lf_aperture_mask


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

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