HSL色空間とHSV色空間
HSLやHSVは、無彩色の軸とその周りの角度に対応する色相をもつ円錐または球形の色モデルとしては、最初のものではない。同様のモデルは18世紀から現在に至るまで開発が続いている(図5のオストワルト表色系など)。
HSLまたはHSVからRGBへ変換するためには、基本的には上述の手順を反転する。その際も、 R, G, B ∈ [0, 1] である。
まず、与えられた色のLightnessまたはValueにおけるChromaの最大値をSaturationの値に乗じることにより、Chromaを計算する。次に、RGB立方体の底面3面のうち、与えられた色と同じHueとChromaをもつ、すなわち色度平面上の同じ点に投影される点を探す。最後に、与えられた色のLightnessまたはValueに一致するよう、 R, G, B に等量を加算する。
Hueを H ∈ [0°, 360°) 、Saturationを SL ∈ [0, 1] 、Lightnessを L ∈ [0, 1] とする。
まず、次のようにしてChroma C を求める。
C = \big( 1 - \vert 2 L \!- \!1 \vert \big) \times S_L
ただし、円錐モデルではSaturationの値として実際にはChromaを用いているため、変換は必要ない。
C = S_L
次に、RGB立方体の底面3面において、与えられた色と同じHue、Chromaをもつ点 (R1, G1, B1) を求める。この操作のために、 H, X を次のように定義する。
H^\prime = \frac{H}{60^\circ\!}
X = C \times \big( 1 - \big\vert ( H^\prime\!\bmod 2 ) - 1 \big\vert \big)
ここで、 (H mod 2) は H を2で割った余りである。 H は整数でなくてもよい。
(R_1, G_1, B_1) = \begin{cases}
(0, 0, 0) &\text{if}~ H ~\text{is undefined} \\
(C, X, 0) &\text{if}~~ 0 \leqq H^\prime\! < 1 \\
(X, C, 0) &\text{if}~~ 1 \leqq H^\prime\! < 2 \\
(0, C, X) &\text{if}~~ 2 \leqq H^\prime\! < 3 \\
(0, X, C) &\text{if}~~ 3 \leqq H^\prime\! < 4 \\
(X, 0, C) &\text{if}~~ 4 \leqq H^\prime\! < 5 \\
(C, 0, X) &\text{if}~~ 5 \leqq H^\prime\! < 6
\end{cases}
最後に、Lightnessを合わせるために R1, G1, B1 それぞれに m を加えると、 R, G, B が求められる。
m = L-\frac{C}{2}
(R,G,B) = (R_{1}\!+m,~G_{1}\!+m,~B_{1}\!+m)
上記の区分的に定義された関数は、最小値、最大値、剰余の演算を活用して簡略化できる。
Hueを H ∈ [0°, 360°) 、Saturationを SL ∈ [0, 1] 、Lightnessを L ∈ [0, 1] とし、まず次の関数 f(n) を定義する。
f(n) = L - a\!\cdot\!\max\!\big({-1,~\min(k\!-\!3,~9\!-\!k,~1)}\big)
ただし、 k, n はともに0以上の実数であり、 k, a は次のように定義される。
k = \Big( n + \frac{H}{30^\circ\!}\Big) \bmod 12
a = S_{L}\!\times\min(L,~1\!-\!L)
ここで、 k ∈ [0, 12) となる。
これらのもとで、R, G, B の値(それぞれ0以上1以下)が次のように得られる。
(R, G, B) = \big(f(0),~f(8),~f(4)\big)
ここで、 f(n) のうち \max\!\big({-1},~\min(k\!-\!3,~9\!-\!k,~1)\big) の部分は、 H, S, V と R, G, B の関係性を表すグラフ(図18)の基本形状を表している。これは k の関数であり、k は n, H の関数であるから、 t(n, H) = T(k) = \max\!\big({-1},~\min(k\!-\!3,~9\!-\!k,~1)\big) と表せる。これは、次のように構成される。
t_1 = \min(k\!-\!3,~9\!-\!k) は、 k = 6 で直線を折り返す上に凸のグラフを描く。ここで t_2 = \min(t_1,~1) 、さらに t = \max(t_2,-1) = \max\!\big({\min(t_1,~1),-1}\big) とし、 t の範囲を−1以上1以下に制限する。このとき、このグラフは図18の R のグラフを上下反転したような形をしている。
関数 f(n) では、 n によって x 方向の平行移動、 −a 倍によって y 方向の拡大縮小、 L によって y 方向の平行移動を行い、 R, G, B それぞれのグラフを得ている。
Hueを H ∈ [0°, 360°) 、Saturationを SV ∈ [0, 1] 、Valueを V ∈ [0, 1] とする。
まず、次のようにしてChroma C を求める。
C = V \times S_V
ただし、双円錐モデルではSaturationの値として実際にはChromaを用いているため、変換は必要ない。
C = S_V
次に、RGB立方体の底面3面において、与えられた色と同じHue、Chromaをもつ点 (R1, G1, B1) を求める。この操作のために、 H, X を次のように定義する。この操作は、HSLの場合と全く同じである。
H^\prime = \frac{H}{60^\circ\!}
X = C \times \big( 1 - \big\vert ( H^\prime\!\bmod 2 ) - 1 \big\vert \big)
(R_1, G_1, B_1) = \begin{cases}
(0, 0, 0) &\text{if}~ H ~\text{is undefined} \\
(C, X, 0) &\text{if}~~ 0 \leqq H^\prime\! < 1 \\
(X, C, 0) &\text{if}~~ 1 \leqq H^\prime\! < 2 \\
(0, C, X) &\text{if}~~ 2 \leqq H^\prime\! < 3 \\
(0, X, C) &\text{if}~~ 3 \leqq H^\prime\! < 4 \\
(X, 0, C) &\text{if}~~ 4 \leqq H^\prime\! < 5 \\
(C, 0, X) &\text{if}~~ 5 \leqq H^\prime\! < 6
\end{cases}
最後に、Valueを合わせるために R1, G1, B1 それぞれに m を加えると、 R, G, B が求められる。
m = V-C
(R,G,B) = (R_{1}\!+m,~G_{1}\!+m,~B_{1}\!+m)
Hueを H ∈ [0°, 360°) 、Saturationを SV ∈ [0, 1] 、Valueを V ∈ [0, 1] とし、まず次の関数 f(n) を定義する。
f(n) = V- VS\!\cdot\!\max\!\big(0,~\min(k,~4\!-\!k,~1)\big)
ただし、 k, n はともに0以上の実数であり、 k は次のように定義される。
k = \Big( n + \frac{H}{60^\circ\!}\Big) \bmod 6
ここで、 k ∈ [0, 6) となる。
これらのもとで、R, G, B の値(それぞれ0以上1以下)が次のように得られる。
(R, G, B) = \big(f(5),~f(3),~f(1)\big)
f(n) の特性は、 t(n, H) = T(k) = \max\!\big(0,~\min(k,~4\!-\!k,~1)\big) として、HSLの場合と同様にして考察できる。
Hueを H ∈ [0°, 360°) 、Saturationを SI ∈ [0, 1] 、Intensityを I ∈ [0, 1] とする。
H^\prime = \frac{H}{60^\circ\!}
Z = 1 - \big\vert ( H^\prime\!\bmod 2 ) - 1 \big\vert
C = \frac{3\!\cdot\!I\!\cdot\!S_I}{1\!+\!Z}
X = C\!\cdot\!Z
ただし、 C はChromaである。
次に、RGB立方体の底面3面において、与えられた色と同じHue、Chromaをもつ点 (R1, G1, B1) を求める。
(R_1, G_1, B_1) = \begin{cases}
(0, 0, 0) &\text{if}~ H ~\text{is undefined} \\
(C, X, 0) &\text{if}~~ 0 \leqq H^\prime\! \leqq 1 \\
(X, C, 0) &\text{if}~~ 1 \leqq H^\prime\! \leqq 2 \\
(0, C, X) &\text{if}~~ 2 \leqq H^\prime\! \leqq 3 \\
(0, X, C) &\text{if}~~ 3 \leqq H^\prime\! \leqq 4 \\
(X, 0, C) &\text{if}~~ 4 \leqq H^\prime\! \leqq 5 \\
(C, 0, X) &\text{if}~~ 5 \leqq H^\prime\! \leqq 6
\end{cases}
最後に、Intensityを合わせるために R1, G1, B1 それぞれに m を加えると、 R, G, B が求められる。
m = I\!\cdot\!(1-S_I)
(R,G,B) = (R_{1}\!+m,~G_{1}\!+m,~B_{1}\!+m)
Hueを H ∈ [0°, 360°) 、Chromaを C ∈ [0, 1] 、Lumaを Y601 ∈ [0, 1] とする。
H^\prime = \frac{H}{60^\circ\!}
X = C \times \big( 1 - \big\vert ( H^\prime\!\bmod 2 ) - 1 \big\vert \big)
(R_1, G_1, B_1) = \begin{cases}
(0, 0, 0) &\text{if}~ H ~\text{is undefined} \\
(C, X, 0) &\text{if}~~ 0 \leqq H^\prime\! \leqq 1 \\
(X, C, 0) &\text{if}~~ 1 \leqq H^\prime\! \leqq 2 \\
(0, C, X) &\text{if}~~ 2 \leqq H^\prime\! \leqq 3 \\
(0, X, C) &\text{if}~~ 3 \leqq H^\prime\! \leqq 4 \\
(X, 0, C) &\text{if}~~ 4 \leqq H^\prime\! \leqq 5 \\
(C, 0, X) &\text{if}~~ 5 \leqq H^\prime\! \leqq 6
\end{cases}
Lumaを合わせるために R1, G1, B1 それぞれに m を加えると、 R, G, B が求められる。
m = Y^\prime_{601}\!- (0.30R_1 + 0.59G_1 + 0.11B_1)
(R,G,B) = (R_{1}\!+m,~G_{1}\!+m,~B_{1}\!+m)
Hueを H ∈ [0°, 360°) 、Saturationを SV ∈ [0, 1] 、Valueを V ∈ [0, 1] とする。
H_L = H_V
L = V\bigg(1-\frac{S_V}{2}\bigg)
S_L = \begin{cases}
0, &\text{if}~~ L\!=\!1 ~~\text{or}~~ L\!=\!0 \\
\frac{V-L}{\min(L,~1-L)}, &\text{otherwise}
\end{cases}
Hueを H ∈ [0°, 360°) 、Saturationを SL ∈ [0, 1] 、Lightnessを L ∈ [0, 1] とする。
H_V = H_L
V = L + S_L\min(L,~1\!-\!L)
S_V = \begin{cases}
0, &\text{if}~~ V\!=0 \\
2\Big(1-\frac{L}{V}\Big), &\text{otherwise}
\end{cases}
ここに示される変換は、上述の導出方法と同じものである。 R, G, B ∈ [0, 1] とする。
最大値 Xmax (すなわちValue V )、最小値 Xmin 、範囲(すなわちChroma) C 、中央値(すなわちLightness) L を、それぞれ次のように求める。
X_\textrm{max} = V = \max(R, G, B)
X_\textrm{min} = \min(R, G, B) = V\!- C
C = X_\textrm{max} - X_\textrm{min} = 2(V\!-L)
L = \operatorname{mid}(R,G,B) = \frac{X_\textrm{max} + X_\textrm{min}{2} = V - \frac{C}{2}
Hue H はHSL、HSVで共通であり、次のように求められる。
H := \begin{cases}
\mathrm{undefined},    &\text{if}~~ C = 0 \\
60^\circ\!\times\!\Big(\frac{G - B}{C}\bmod 6\Big), &\text{if}~~ V = R \\
60^\circ\!\times\!\Big(\frac{B - R}{C} + 2\Big),    &\text{if}~~ V = G \\
60^\circ\!\times\!\Big(\frac{R - G}{C} + 4\Big),    &\text{if}~~ V = B
\end{cases}
HSL、HSVそれぞれのSaturationは、次のように求められる。
S_V = \begin{cases}
0, &\text{if}~~ V\!=0 \\
\frac{C}{V}, &\text{otherwise}
\end{cases}
S_L = \begin{cases}
0, &\text{if}~~ L\!=\!1 ~~\text{or}~~ L\!=\!0 \\
\frac{C}{1-\vert2V-C-1\vert} = \frac{2(V-L)}{1-\vert2L-1\vert} = \frac{V-L}{\min(L,~1-L)}, &\text{otherwise}
\end{cases}