synthesis op• 데이터 종류: 없음 → video(인자만으로 정해지는 연산자 —— 이미지나 데이터 입력을 받지 않습니다)
• 호출: import motionmag; motionmag.synthesize_translation(shape=(64, 64), frames: 'int' = 32, amplitude_px=0.5, frequency_hz=4.0, fps=32.0, direction_deg=0.0, wavelength_px=(8.0, 16.0), contrast=0.4, offset=0.5, noise_sigma=0.0, seed: 'int' = 0) -> 'np.ndarray'(또는 opsmotionmag.get("synthesize_translation"))
변위가 닫힌 식으로 알려진 클립 -> `(T, H, W)` 비디오.
> 아래 상세 설명은 원문입니다 —— 요약과 제목은 번역되어 있습니다.
The scene is a stationary two-axis sinusoidal grating that is translated,
frame by frame, by
`d(t) = amplitude_px * sin(2*pi * frequency_hz * t / fps)`
along *direction_deg* (0 deg = towards +x / increasing column). The
translation is applied as a Fourier phase ramp, which for a pattern that is
periodic on the grid is the *exact* band-limited shift — no interpolation
kernel, no resampling error, so `d(t)` is ground truth to machine
precision and sub-pixel amplitudes are meaningful.
`wavelength_px is either one number (both axes) or `(lambda_x,
lambda_y)``. **The default deliberately makes the two axes different
octaves**, and that is not cosmetic: if the horizontal and vertical gratings
share a radial frequency they land in the *same* sub-band, whose local phase
is then the phase of a sum of two moving components rather than of one. The
phase of a sum is not linear in the displacement, so scaling it does not
scale the motion — measured, a 64x64 clip built with a single wavelength on
both axes magnified at `alpha = 2 came out at 0.939 * (2 d)` instead of
`2 d, a 6.1 % error that does *not* shrink as d` shrinks. Separating
the octaves puts one component in each band and the relation becomes exact.
This is the standard narrow-band condition of phase-based processing, made
visible in the synthetic instead of hidden.
Each wavelength is snapped so that a whole number of cycles fits the frame
(`cycles = max(1, round(W / wavelength_px))`, effective wavelength
`W / cycles`); without that the pattern is not periodic on the grid and the
Fourier shift would wrap a discontinuity across the border. With the default
64x64 frame and `(8, 16)` the snap is exact (8 and 4 cycles).
Values are not clipped into `[0, 1]`: clipping is a nonlinearity that
would break the exact translation this function exists to provide. With the
defaults the samples lie in `[offset - contrast, offset + contrast]`.
*noise_sigma* adds zero-mean Gaussian sensor noise (after translation, drawn
from `numpy.random.default_rng(seed)`) — the term that makes an SNR
measurable at all.
This is the counterpart of `photoncount.tcspc_simulate`: a forward model
good enough to close the loop on the analysis operators in this module.
• motion_magnification 패밀리 가이드
• 샘플 데이터 카탈로그(DL URL / 라이선스) —— 2-D 는 skimage.data(BSD/public)+ 합성, 3-D 는 실데이터 소스(Stanford/PDS 등)의 DL URL.
• 연산자의 내력·참고문헌 —— 이 연산자 족의 바탕이 된 연구/기법의 출처.
• 알고리즘의 정전(저자·연도)과 용도는 위의 패밀리 사용 가이드에 적혀 있습니다.
• motion_magnification — py -3.11 examples/motion_magnification.py
• poc_motion_magnification — py -3.11 examples/poc_motion_magnification.py
• quaternion_monogenic — py -3.11 examples/quaternion_monogenic.py
video 를 입력으로 받는 것)temporal_bandpass · temporal_band_power · band_snr · motion_magnify · phase_displacement · displacement_series
synthesis)—
*Provenance: motionmag.py — MOTIONMAG 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.