temporal op• Data kinds: video → table
• Call: import motionmag; motionmag.band_snr(video, f_lo, f_hi, fps) -> 'dict' (or opsmotionmag.get("band_snr"))
Measure what a clip's temporal band contains, and what it costs -> `dict`.
Every quantity is a measured mean-square power obtained from the per-pixel
temporal DFT (Parseval-normalised so that the bins of one pixel sum to that
pixel's mean square), averaged over pixels:
• `static_power` — the DC bin. The scene that is simply *there*.
• `band_power — the bins inside [f_lo, f_hi]`. Coherent motion plus
whatever noise happens to fall in the band.
• `out_of_band_power / out_of_band_bins` — everything else except DC.
With broadband sensor noise this is the noise floor, and
`noise_power_per_bin` is its per-bin density.
• `noise_in_band = noise_power_per_bin * band_bins` — how much of
`band_power` is expected to be noise.
• `motion_power = max(band_power - noise_in_band, 0)` and
`motion_snr_db = 10*log10(motion_power / noise_in_band)`.
• `image_snr_db = `10*log10(static_power / (band_power +
out_of_band_power))`` — the static scene against everything that flickers.
**The two SNRs answer different questions and magnification moves only one
of them.** Scaling the in-band phase by `alpha` scales the in-band motion
*and* the in-band noise by the same factor, so the true motion SNR cannot
improve: magnification never makes a measurement more certain than the
recording was. What does change is `image_snr_db`, because the temporal
fluctuation of the output frames grows like `alpha^2` while the static
scene does not.
A caveat that matters when this is run on an already-magnified clip.
`motion_snr_db` here divides the in-band signal by a noise floor estimated
from the *out-of-band* bins, and magnification does not touch those. Applied
to a magnified video it therefore credits `alpha^2` more in-band power
against an unchanged noise estimate and reports an improvement that did not
occur — measured, `+6.86 dB at alpha = 2` on a clip whose true motion
SNR cannot have moved. :func:motion_magnify knows the gain and returns the
corrected figure as `motion_snr_out_db`; use that one, not
`result["snr_out"]["motion_snr_db"]`.
`snr_clamped is True when a reported dB hit the [-100, +100]` window
(a noiseless synthetic has zero out-of-band power, which is a division by
zero rather than an infinite SNR).
• motion_magnification family guide
• 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.
• motion_magnification — py -3.11 examples/motion_magnification.py
table as input)temporal)temporal_bandpass · temporal_band_power
*Provenance: motionmag.py — MOTIONMAG 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.