varmodel_fit — SPC variation op

• Data kinds: video → table

• Call: import fullseye as fs; fs.ledger.varmodel_fit(stack, spread='moderated', far=0.001, align='check', max_misalign_px=0.5, spread_floor=0.0, mask=None) (to call the implementation directly, import varmodel; varmodel.varmodel_fit(stack, spread='moderated', far=0.001, align='check', max_misalign_px=0.5, spread_floor=0.0, mask=None); from the registry, opsspc.get("varmodel_fit"))

Usage

Learn a per-pixel variation model (centre, spread, band half-width k) from a stack of good samples (table).

stack is (n, H, W) or a list of equal 2-D images, all good. spread chooses the estimator (SPREADS): std (mean / per-pixel sample std, needs n >= 3), pooled (mean / one std for all valid pixels — few samples, homoscedastic noise), moderated (mean / empirical-Bayes shrinkage of every pixel's variance toward a prior estimated from all pixels, Smyth 2004 — few samples, heteroscedastic noise; the default) or mad (median / 1.4826 MAD — robust to a few defective images hidden in the "good" set, needs n >= 5). far is the declared two-sided per-pixel false-alarm rate; k follows from it (see varmodel_band_k) and is never tuned on defects.

Alignment: align="check" measures every sample's translation (varmodel_alignment) and REFUSES the stack if any exceeds max_misalign_px; align="translate" registers the samples to the median by a Fourier shift (all-pass, so white noise keeps its variance), re-checks the residual against max_misalign_px and marks the wrapped border invalid. A stack without structure (alignment["observable"] False) is neither refused nor shifted; its band is then only an intensity threshold on the overall variation. Stochastic textures, whose every sample shows a different pattern, are therefore not a variation-model problem (on DAGM 2007 Class1 it scores at chance — see the PoC).

spread_floor (>= 0, image units) lower-bounds the spread (8-bit data has pixels whose good samples are all equal); any remaining zero spread is refused. mask (H, W) bool limits the inspected area. Returns center, spread, k, far, n, df, spread_kind, lower / upper (the band), valid (bool), n_floored, d0 / s0 (the prior's degrees of freedom and scale: 0 for std / mad; for pooled and a fully pooled moderated prior d0 = valid pixels x (n - 1)), k_source, mc_far_rel_se and alignment (the offset report, after registration if any).

Raises ValueError on an empty / malformed / non-finite stack, too few samples, an unknown spread / align, far outside its range, a misaligned stack, a mask of the wrong shape, or zero spread left after the floor.

References (sample data, literature)

• Sample-data catalog (download URLs / licences) — 2-D uses skimage.data (BSD/public domain) plus synthetic images; 3-D lists download URLs for real data sources (Stanford, PDS, …).

• Operator provenance and references — the sources of the research/methods this op family came from.

• The canonical algorithm (author, year) and its uses are named in the family usage guide above.

Runnable examples (verified samples that actually call this op)

• poc_good_sample_variation_model — py -3.11 examples/poc_good_sample_variation_model.py

• poc_patch_anomaly — py -3.11 examples/poc_patch_anomaly.py

Ops the type connects to (they accept table as input)

msa_anova_table · msa_gauge_rr · msa_bias_linearity · msa_attribute_agreement · gum_standard_uncertainty · gum_propagate · gum_expanded · gum_monte_carlo

Same category (variation)

varmodel_alignment · varmodel_band_k · varmodel_calibrate · varmodel_score


*Provenance: varmodel.py — SPC operator registry. This per-op note is generated by tools/opdocs.py md (do not hand-edit).*

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