qft2 — QUAT fourier op

• 데이터 종류: qimage → qimage

• 호출: import fullseye as fs; fs.ledger.qft2(qimage, side, mu=None) -> 'np.ndarray'(구현을 직접 호출하려면 import quatimage; quatimage.qft2(qimage, side, mu=None) -> 'np.ndarray', 원장에서 가져오려면 opsquat.get("qft2"))

사용법

사원수(초복소) 2-D 푸리에 변환. → 중심화한 (H, W, 4) 스펙트럼.

> 아래 상세 설명은 원문입니다 —— 요약과 제목은 번역되어 있습니다.

The colour analogue of complexops.cx_fft: a colour image is transformed as one hypercomplex signal rather than three unrelated real ones. The kernel is exp(-mu * 2*pi*(u*x/W + v*y/H)) for a unit pure quaternion *mu* (default: the grey axis of RGB, Sangwine's choice), and because quaternions do not commute the kernel can be applied on either side:

• side="left" — F[u,v] = sum_{x,y} E(x,y,u,v) * f[x,y]

• side="right" — F[u,v] = sum_{x,y} f[x,y] * E(x,y,u,v)

The argument is required. Left and right are not a sign convention. On the fuzzer's (32, 32) dichromatic render they differ by max|F_L - F_R| = 19.11 against a peak modulus of 1045 (1.8 % of full scale) and on a random colour field by 33.35 against 892.9 (3.7 %; another seed gives 34.05 against 892) — with no exception and no NaN to mark the difference. Mixing them across a round trip is much worse, because there the disagreement is not attenuated by the spectrum's dynamic range: iqft2(qft2(q, "left"), "right") returns an image whose error reaches 1.113 on data whose own range is 0.9994 — a completely different picture that still looks like a picture. (On the grey-axis-dominated dichromatic render the same mistake costs only 0.054 against a range of 1.076, which is the dangerous case: a 5 % error is exactly the size that survives a visual check.)

The spectrum is returned centred (DC at the array centre, via fftshift), matching the convention complexops.cx_fft established for the cimage sort. iqft2 un-centres before inverting, and the round trip is exact: measured max|iqft2(qft2(q, s), s) - q| = 2.22e-15 for both sides on a standard-normal (32, 32, 4) field.

How it is computed, and why that is not a shortcut

Every quaternion splits as q = A + B*nu with A, B in the commutative subfield generated by mu (the *symplectic decomposition*, Ell & Sangwine 2007). The kernel commutes with A and *anti*-commutes past nu, so the whole transform reduces to two ordinary complex FFTs — for the left transform both with the standard kernel, for the right one of them with the conjugate kernel. That reduction is what makes left and right differ, and it is verified against a brute-force O(N^2) quaternion DFT written straight from the definition, on a 4x4 image, for three different mu and both sides: the largest disagreement over all six combinations is 8.2e-15. The fast path is checked against the definition, not against itself. The choice of the internal nu is likewise verified not to matter (two different nu, max difference 1.4e-14 — see _mu_basis).

Honest accounting against the channelwise baseline

Because the decomposition above is *linear* in the channels, the QFT is a fixed recombination of the three per-channel complex FFTs: rebuilding qft2(q, "left") from three numpy.fft.fft2 calls on the R, G and B planes agrees to max|err| = 1.14e-13. So this transform buys no information a channelwise FFT does not already contain, and this module does not claim it does. It also does not buy speed — it moves four real transforms' worth of data where the channelwise route moves three, and pays for the symplectic pack/unpack on top: measured on (256, 256), best of 20, 8.246 ms against 3.409 ms, i.e. 2.42x slower (run to run, 2.3x-2.4x). What it buys is that the four numbers stay one algebraic object, so a rotor can be applied to the spectrum and the colour meaning of mu survives the transform.

Raises ValueError: *qimage* is not a valid (H, W, 4) field; *side* is not 'left' / 'right'; *mu* is not a finite non-zero 3-vector.

자세한 사용 가이드

• quaternion_monogenic 패밀리 가이드

참고(샘플 데이터·문헌)

• 샘플 데이터 카탈로그(DL URL / 라이선스) —— 2-D 는 skimage.data(BSD/public)+ 합성, 3-D 는 실데이터 소스(Stanford/PDS 등)의 DL URL.

• 연산자의 내력·참고문헌 —— 이 연산자 족의 바탕이 된 연구/기법의 출처.

• 알고리즘의 정전(저자·연도)과 용도는 위의 패밀리 사용 가이드에 적혀 있습니다.

실행 가능한 예제(이 연산자를 실제로 호출하는 검증된 샘플)

• quaternion_monogenic — py -3.11 examples/quaternion_monogenic.py

타입이 이어지는 다음 연산자(qimage 를 입력으로 받는 것)

quaternion_to_rgb · quat_norm · quat_conjugate_image · quat_normalize_image · quat_image_multiply · monogenic_amplitude · monogenic_phase · monogenic_orientation

같은 카테고리(fourier)

iqft2


*Provenance: quatimage.py — QUAT 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*

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