Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
isp:hue_rotation [2022/04/04 23:32] – external edit 127.0.0.1 | isp:hue_rotation [2023/09/12 12:25] (current) – [In RGB color space] Igor Yefmov | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Hue rotation ====== | ====== Hue rotation ====== | ||
+ | "Hue rotation" | ||
+ | ===== In RGB color space ===== | ||
+ | |||
+ | To rotate the color vector by an angle \(\Theta\) is to rotate the RGB cube around the \((0, | ||
+ | |||
+ | \[ | ||
+ | cos_1 = cos(\Theta) \\ | ||
+ | cos_2 = \frac{1 - cos_1}{3} \\ | ||
+ | sin_1 = sin(\Theta)\sqrt{1/ | ||
+ | |||
+ | \begin{bmatrix} | ||
+ | cos_1 + cos_2 & cos_2 - sin_1 & cos_2 + sin_1 \\ | ||
+ | cos_2 + sin_1 & cos_1 + cos_2 & cos_2 - sin_1 \\ | ||
+ | cos_2 - sin_1 & cos_2 + sin_1 & cos_1 + cos_2 | ||
+ | \end{bmatrix} | ||
+ | \] | ||
+ | |||
+ | In our codebase the Hue adjustment is a 14-bit signed integer in range \([-8192..8191]\) that corresponds to \([-180°..+180°)\). | ||
+ | |||
+ | M.B. this does **not** take into account the fact that different chroma components contribute differently to the luma of the pixel. A more correct implementation must first separate luma and chroma, perform rotation on chroma, and then convert back to RGB triplet, but that is way too expensive to perform in-line during video transmission. | ||
+ | |||
+ | ===== In HSL color space ===== | ||
Really, no magic here, once you process the image in HSL color space. The operation is as trivial as adding or subtracting a specified value from the pixel' | Really, no magic here, once you process the image in HSL color space. The operation is as trivial as adding or subtracting a specified value from the pixel' | ||
<code c++>// pseudo-code | <code c++>// pseudo-code |