quat_color_filter — QUAT color op

• Data kinds: qimage → qimage

• Call: import fullseye as fs; fs.ledger.quat_color_filter(qimage, direction_rgb, mode) -> 'np.ndarray' (implementation को सीधे call करना हो तो import quatimage; quatimage.quat_color_filter(qimage, direction_rgb, mode) -> 'np.ndarray', registry से लेना हो तो opsquat.get("quat_color_filter"))

उपयोग

एक रंग-दिशा को सटीक रूप से रखता है या हटाता है। → (H, W, 4)।

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

mode="remove" returns v - (v.g) g for the unit RGB direction g:

the component along g is exactly zero everywhere afterwards, to machine precision (measured max residual 5.8e-16 and 6.5e-16 on two random colour images — seed-dependent only at the 1e-16 level), and remove + keep reproduces the input to 0.0 exactly. mode="keep" returns the complementary (v.g) g. The scalar part is passed through untouched in both.

There is no default mode. The two are opposites, both return a valid picture, and neither raises — so choosing for the caller would be a coin flip that never announces itself.

Not a new algorithm, and this docstring will not pretend otherwise

The remove branch is the specular-invariant projection of Mallick et al. (2005), which this repository already implements as specularity.specular_free_transform for the rgbimage sort. Rather than write the same three lines twice, this operator *delegates* to it — so agreement between the two sorts is by construction rather than by luck, and a future fix in one is a fix in both. What is added here is the keep branch (which has no counterpart there) and the qimage sort, so the projection composes with quat_color_rotate and qft2.

What this can do that a channelwise pipeline cannot

A per-channel filter applies a diagonal matrix, and I - g g^T is diagonal only when g is a coordinate axis. For g = (1,1,1)/sqrt(3) — remove the grey axis, i.e. keep only chromatic content — the *best possible* diagonal approximation is off by ||P - diag(P)||_2 = 0.666667 in operator norm. Concretely, a pure red pixel (1, 0, 0) must become (0.666667, -0.333333, -0.333333); the best diagonal filter can only reach (0.666667, 0, 0), an error of 0.471405 — it cannot put anything into the green and blue channels, because it multiplies each channel by a number and both start at zero. The impossibility is structural, not a tuning gap. (A full 3x3 colour matrix, of course, does it exactly; see quat_color_rotate for that half of the accounting.)

Raises ValueError: *qimage* is not a valid (H, W, 4) field; *direction_rgb* is not a finite non-zero 3-vector; *mode* is not 'remove' / 'keep'.

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

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

• quaternion_monogenic — py -3.11 examples/quaternion_monogenic.py

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

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

इसी category के (color)

quat_color_rotate


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

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