1. 程式人生 > >RGB轉到HSV和HSL公式

RGB轉到HSV和HSL公式



HSL 和 HSV 在數學上定義為在 RGB 空間中的顏色的 RG 和 B 的座標的變換。

[編輯]從 RGB 到 HSL 或 HSV 的轉換

設 (rgb) 分別是一個顏色的紅、綠和藍座標,它們的值是在 0 到 1 之間的實數。設 max 等價於 rg 和 b 中的最大者。設 min 等於這些值中的最小者。要找到在 HSL 空間中的 (hsl) 值,這裡的 h ∈ [0, 360)是角度的色相角,而 sl ∈ [0,1] 是飽和度和亮度,計算為:

h =\begin{cases}0^\circ & \mbox{if } max = min \\60^\circ \times \frac{g - b}{max - min} + 0^\circ,   & \mbox{if } max = r \mbox{ and } g \ge b \\60^\circ \times \frac{g - b}{max - min} + 360^\circ,   & \mbox{if } max = r \mbox{ and } g < b \\60^\circ \times \frac{b - r}{max - min} + 120^\circ, & \mbox{if } max = g \\60^\circ \times \frac{r - g}{max - min} + 240^\circ, & \mbox{if } max = b\end{cases}
l = \begin{matrix} \frac{1}{2} \end{matrix} (max + min)
s = \begin{cases}0 & \mbox{if } l = 0 \mbox{ or } max = min \\\frac{max-min}{max+min} = \frac{max-min}{2l}, & \mbox{if } 0  \frac{1}{2}\end{cases}


h 的值通常規範化到位於 0 到 360°之間。而 h = 0 用於 max = min 的(就是灰色)時候而不是留下 h

 未定義。

HSL 和 HSV 有同樣的色相定義,但是其他分量不同。HSV 顏色的 s 和 v 的值定義如下:

s = \begin{cases}0, & \mbox{if } max = 0 \\\frac{max - min}{max} = 1 - \frac{min}{max}, & \mbox{otherwise}\end{cases}
v = max \,

[編輯]從 HSL 到 RGB 的轉換

給定 HSL 空間中的 (hsl) 值定義的一個顏色,帶有 h 在指示色相角度的值域 [0, 360)中,分別表示飽和度和亮度的s 和 l 在值域 [0, 1] 中,相應在 RGB 空間中的 (rgb) 三原色,帶有分別對應於紅色、綠色和藍色的 rg 和 b 也在值域 [0, 1] 中,它們可計算為:

首先,如果 s = 0,則結果的顏色是非彩色的、或灰色的。在這個特殊情況,rg 和 b 都等於 l。注意 h 的值在這種情況下是未定義的。

當 s ≠ 0 的時候,可以使用下列過程:[1]

q=\begin{cases}l \times (1+s), & \mbox{if } l < \frac{1}{2} \\l+s-(l \times s), & \mbox{if } l \ge \frac{1}{2}\end{cases}
p = 2 \times l - q \,
h_k = {h \over 360} \,h 規範化到值域 [0,1)內)
t_R = h_k+\frac{1}{3} \,
t_G = h_k \,
t_B = h_k-\frac{1}{3} \,
\mbox{if } t_C < 0 \rightarrow t_C = t_C + 1.0 \quad \mbox{for each}\,C \in \{R,G,B\}
\mbox{if } t_C > 1 \rightarrow t_C = t_C - 1.0 \quad \mbox{for each}\,C \in \{R,G,B\}


對於每個顏色向量 Color = (ColorRColorGColorB) = (rgb),

{Color}_C =\begin{cases}p+ \left((q-p) \times 6 \times t_C\right), & \mbox{if } t_C < \frac{1}{6}  \\q, & \mbox{if } \frac{1}{6} \le t_C < \frac{1}{2}  \\p+\left((q-p) \times 6 \times (\frac{2}{3} - t_C) \right), & \mbox{if } \frac{1}{2} \le t_C < \frac{2}{3} \\p, & \mbox{otherwise }\end{cases}
\mbox{for each}\,C \in \{R,G,B\}

[編輯]從 HSV 到 RGB 的轉換

類似的,給定在 HSV 中 (hsv) 值定義的一個顏色,帶有如上的 h,和分別表示飽和度和明度的 s 和 v 變化於 0 到 1 之間,在 RGB 空間中對應的 (rgb) 三原色可以計算為:

h_i \equiv \left\lfloor \frac{h}{60} \right\rfloor \pmod{6}
f = \frac{h}{60} - h_i
p = v \times (1 - s) \,
q = v \times (1 - f \times s) \,
t = v \times (1 - (1 - f) \times s) \,


對於每個顏色向量 (rgb),

(r, g, b) = \begin{cases}(v, t, p), & \mbox{if } h_i = 0  \\(q, v, p), & \mbox{if } h_i = 1  \\(p, v, t), & \mbox{if } h_i = 2  \\(p, q, v), & \mbox{if } h_i = 3  \\(t, p, v), & \mbox{if } h_i = 4  \\(v, p, q), & \mbox{if } h_i = 5  \\\end{cases}