Colour Picker
Standard HSV/HSL use Hue in degrees and component percentages; OpenCV uses a scaled HSV form with H on 0-180 and S/V on 0-255. Hold Shift while copying RGB (1.0 range) to append f suffixes (e.g. 1.0f,0.7f,0.7f).
I found that many colour pickers online only supported one format e.g. RGB out of 255, when I need different ones depending on the context.
This aims to cover a few different formats.
Equations
For RGB normalised to [ 0 , 1 ] [0,1] [ 0 , 1 ] :
M = max ( R , G , B ) , m = min ( R , G , B ) , Δ = M − m M = \max(R,G,B),\quad m = \min(R,G,B),\quad \Delta = M - m M = max ( R , G , B ) , m = min ( R , G , B ) , Δ = M − m
HSV:
V = M , S H S V = { 0 M = 0 Δ / M M ≠ 0 V = M,\qquad
S_{\mathrm{HSV}} =
\begin{cases}
0 & M = 0 \\
\Delta / M & M \ne 0
\end{cases} V = M , S HSV = { 0 Δ/ M M = 0 M = 0
HSL:
L = M + m 2 , S H S L = { 0 Δ = 0 Δ 1 − ∣ 2 L − 1 ∣ Δ ≠ 0 L = \frac{M + m}{2},\qquad
S_{\mathrm{HSL}} =
\begin{cases}
0 & \Delta = 0 \\
\dfrac{\Delta}{1 - |2L - 1|} & \Delta \ne 0
\end{cases} L = 2 M + m , S HSL = ⎩ ⎨ ⎧ 0 1 − ∣2 L − 1∣ Δ Δ = 0 Δ = 0
Hue (used by both HSV and HSL):
H = { 6 0 ∘ ( G − B Δ m o d 6 ) M = R 6 0 ∘ ( B − R Δ + 2 ) M = G 6 0 ∘ ( R − G Δ + 4 ) M = B H =
\begin{cases}
60^\circ\!\left(\dfrac{G-B}{\Delta} \bmod 6\right) & M = R \\
60^\circ\!\left(\dfrac{B-R}{\Delta} + 2\right) & M = G \\
60^\circ\!\left(\dfrac{R-G}{\Delta} + 4\right) & M = B
\end{cases} H = ⎩ ⎨ ⎧ 6 0 ∘ ( Δ G − B mod 6 ) 6 0 ∘ ( Δ B − R + 2 ) 6 0 ∘ ( Δ R − G + 4 ) M = R M = G M = B
HSV to RGB (with H H H in degrees and S , V ∈ [ 0 , 1 ] S,V \in [0,1] S , V ∈ [ 0 , 1 ] ):
C = V S , X = C ( 1 − ∣ ( H 6 0 ∘ m o d 2 ) − 1 ∣ ) , m = V − C C = VS,\qquad
X = C\left(1 - \left|\left(\frac{H}{60^\circ} \bmod 2\right) - 1\right|\right),\qquad
m = V - C C = V S , X = C ( 1 − ( 6 0 ∘ H mod 2 ) − 1 ) , m = V − C
( R ′ , G ′ , B ′ ) = { ( C , X , 0 ) 0 ≤ H < 6 0 ∘ ( X , C , 0 ) 6 0 ∘ ≤ H < 12 0 ∘ ( 0 , C , X ) 12 0 ∘ ≤ H < 18 0 ∘ ( 0 , X , C ) 18 0 ∘ ≤ H < 24 0 ∘ ( X , 0 , C ) 24 0 ∘ ≤ H < 30 0 ∘ ( C , 0 , X ) 30 0 ∘ ≤ H < 36 0 ∘ (R',G',B') =
\begin{cases}
(C,X,0) & 0 \le H < 60^\circ \\
(X,C,0) & 60^\circ \le H < 120^\circ \\
(0,C,X) & 120^\circ \le H < 180^\circ \\
(0,X,C) & 180^\circ \le H < 240^\circ \\
(X,0,C) & 240^\circ \le H < 300^\circ \\
(C,0,X) & 300^\circ \le H < 360^\circ
\end{cases} ( R ′ , G ′ , B ′ ) = ⎩ ⎨ ⎧ ( C , X , 0 ) ( X , C , 0 ) ( 0 , C , X ) ( 0 , X , C ) ( X , 0 , C ) ( C , 0 , X ) 0 ≤ H < 6 0 ∘ 6 0 ∘ ≤ H < 12 0 ∘ 12 0 ∘ ≤ H < 18 0 ∘ 18 0 ∘ ≤ H < 24 0 ∘ 24 0 ∘ ≤ H < 30 0 ∘ 30 0 ∘ ≤ H < 36 0 ∘
R = R ′ + m , G = G ′ + m , B = B ′ + m R = R' + m,\qquad G = G' + m,\qquad B = B' + m R = R ′ + m , G = G ′ + m , B = B ′ + m
In this picker, the large square is HSV ( S , V ) (S,V) ( S , V ) , so along the top edge ( V = 1 ) (V=1) ( V = 1 ) ,
S H S V S_{\mathrm{HSV}} S HSV changes across the row while S H S L S_{\mathrm{HSL}} S HSL stays at 100 % 100\% 100% except at white.