csi_height_map — INTERFEROMETRY surface op

• Data kinds: zscan → depth

• Call: import fullseye as fs; fs.ledger.csi_height_map(stack, z_step_um=0.05, z_start_um=0.0, wavelength_um=0.6, mode='gaussian', remove_bias=True, min_visibility=0.3, max_edge_envelope=0.05, carrier_tolerance=2.0, on_invalid='raise', fill_value=nan) (implementation को सीधे call करना हो तो import interferometry; interferometry.csi_height_map(stack, z_step_um=0.05, z_start_um=0.0, wavelength_um=0.6, mode='gaussian', remove_bias=True, min_visibility=0.3, max_edge_envelope=0.05, carrier_tolerance=2.0, on_invalid='raise', fill_value=nan), registry से लेना हो तो opsinterferometry.get("csi_height_map"))

उपयोग

(Z, H, W) coherence-scanning stack से height map — CSI inversion।

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

The per-pixel csi_peak_position, vectorised. The scan axis is first; see csi_stack_simulate for why that is checked rather than inferred.

A pixel is *invalid* when any of three things is true, and all three are the same trap in different shapes — each would otherwise yield a finite, plausible, wrong height:

1. its envelope prominence is below *min_visibility* — no fringes ever formed there (a hole, a dark or specular-dropout pixel, a facet tilted out of the aperture);

2. its envelope peaks on the first or last plane — the surface is at or past the end of the scan;

3. its envelope is still above *max_edge_envelope* of its peak at the ends of the scan — most of the coherence peak is outside the scan even though the argmax is on an interior plane. This is the one that has no natural

alarm: measured, a surface at 0.500 um with an edge level of 0.639 reads

0.119 um and nothing else about the result looks wrong. See

_edge_level.

What happens then is a decision, not a default:

• on_invalid="raise" (the default) — raise, naming how many pixels failed which of the three checks. Fail-closed: a height map with silently wrong pixels in it is worse than no height map.

• on_invalid="fill" — write *fill_value* (default NaN) at those pixels and return. Opt in to this when you intend to mask afterwards; a NaN height poisons every downstream reduction, which is precisely why it is not the default.

There is deliberately no third option that quietly reports the boundary plane.

Returns a float64 (H, W) height map, in the units of *z_start_um* / *z_step_um*.

Ground truth (measured, 32x32 pixels, 241 planes x 0.05 um, 0.60 um wavelength, 2.83 um envelope FWHM). On a tilted plane spanning 5.0-7.0 um, i.e. comfortably inside a 0-12 um scan, the RMS height error is 1.42e-02 um for "peak", 3.81e-05 um for "centroid", 4.02e-06 um for "parabolic" and 2.08e-06 um for "gaussian". Widen the same plane to 2.0-10.0 um — pixels now within 2 um of the ends of the scan — and the errors become 1.91e-02 / 5.98e-02 / 7.06e-03 / 7.06e-03 um: the local fits lose three decades and the centroid loses four, entirely to envelope truncation at the scan ends. Accuracy here is a property of the *scan layout*, not of the estimator, and this is the number to look at when a real measurement disappoints.

On that same surface, phase-shifting interferometry via fringe is exact below a lambda/4 = 0.15 um step and wrong by exact multiples of lambda/2 = 0.30 um above it.

Raises ValueError: a non-3-D stack, fewer than 3 planes, an empty spatial extent, a stack over MAX_STACK_ELEMENTS (checked before the float64 promotion), a non-finite / complex / masked stack, an unknown *mode* or *on_invalid*, a *min_visibility* / *max_edge_envelope* outside [0, 1], a *z_step_um* at or past the wavelength_um/4 Nyquist ceiling, a non-numeric *fill_value*, and — under the default on_invalid="raise" — any invalid pixel.

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

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

• coherence_scanning — py -3.11 examples/coherence_scanning.py

• poc_focus_stacking — py -3.11 examples/poc_focus_stacking.py

• poc_interferometry_step — py -3.11 examples/poc_interferometry_step.py

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

csi_stack_simulate

इसी category के (surface)

csi_contrast_map


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

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