Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| isp:hue_rotation [2019/05/08 17:00] – created Igor Yefmov | 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" | ||
| - | 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' | + | ===== 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' | ||
| <code c++>// pseudo-code | <code c++>// pseudo-code | ||
| void hue_rotation(/ | void hue_rotation(/ | ||