User Tools

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
isp:hue_rotation [2019/05/08 17:00] – created Igor Yefmovisp:hue_rotation [2023/09/12 12:25] (current) – [In RGB color space] Igor Yefmov
Line 1: Line 1:
 ====== Hue rotation ====== ====== Hue rotation ======
 +"Hue rotation" is a global (every pixel) shift of the image's color spectrum by a given radial offset (considering the [[https://simple.wikipedia.org/wiki/Color_wheel|color wheel]]).
  
-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'''H'' component:+===== In RGB color space ===== 
 + 
 +To rotate the color vector by an angle \(\Theta\) is to rotate the RGB cube around the \((0,0,0)-(1,1,)\) diagonal axis, for which the [[https://en.wikipedia.org/wiki/Rotation_matrix#Rotation_matrix_from_axis_and_angle|rotation matrix]] looks like the following: 
 + 
 +\[ 
 +cos_1 = cos(\Theta) \\ 
 +cos_2 = \frac{1 - cos_1}{3} \\ 
 +sin_1 = sin(\Theta)\sqrt{1/3} \\ 
 + 
 +\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'\(H\) component:
 <code c++>// pseudo-code <code c++>// pseudo-code
 void hue_rotation(/*array of pixels*/image, double _hue){ void hue_rotation(/*array of pixels*/image, double _hue){

This website uses cookies. By using the website, you agree with storing cookies on your computer. Also, you acknowledge that you have read and understand our Privacy Policy. If you do not agree, please leave the website.

More information