目录
[1.1 RGB转HSV](#1.1 RGB转HSV)
[1.2 HSV转RGB](#1.2 HSV转RGB)
[2.1 RGB转HSL](#2.1 RGB转HSL)
[2.2 HSL转RGB](#2.2 HSL转RGB)
Hue 与明度、饱和度并列,是色彩科学中定义颜色三大属性。Hue用于描述红、黄、绿、蓝、紫等颜色特性。 在HSL/HSV色彩空间中以角度(0°--360°)表示,H代表色相(Hue),以红色为0°(360°)沿色环顺时针划分角度,对应黄色60°、绿色120°、青色180°、蓝色240°、品红色300°等具体颜色。
|----------|--------------|--------|----------|
| 颜色名称 | 红绿蓝含量 | 角度 | 代表物体 |
| 红色 | R255,G0,B0 | 0° | 血液、草莓 |
| 橙色 | R255,G128,B0 | 30° | 火、橙子 |
| 黄色 | R255,G255,B0 | 60° | 香蕉、芒果 |
| 黄绿 | R128,G255,B0 | 90° | 柠檬 |
| 绿色 | R0,G255,B0 | 120° | 草、树叶 |
| 青绿 | R0,G255,B128 | 150° | 军装 |
| 青色 | R0,G255,B255 | 180° | 水面、天空 |
| 靛蓝 | R0,G128,B255 | 210° | 水面、天空 |
| 蓝色 | R0,G0,B255 | 240° | 海、墨水 |
| 紫色 | R128,G0,B255 | 270° | 葡萄、茄子 |
| 品红 | R255,G0,B255 | 300° | 火、桃子 |
| 紫红 | R255,G0,B128 | 330° | 墨水 |
1、HSV
HSV(Hue, Saturation, Value)模型对应于圆柱坐标系中的一个圆锥形子集 ,圆锥的顶面对应于V=1。它包含RGB模型中的R=1,G=1,B=1 三个面,所代表的颜色较亮。色彩H由绕V轴的旋转角给定。红色对应于角度0° ,绿色对应于角度120°,蓝色对应于角度240°。在HSV颜色模型中,每一种颜色和它的补色相差180°。饱和度S取值从0到1,所以圆锥顶面的半径为1。

HSV的每一种颜色都是由色相(Hue,简H),饱和度(Saturation,简S)和色明度(Value,简V)所表示的。这个模型中颜色的参数分别是:色调(H),饱和度(S),亮度(V)。
- 色调H:表示色彩信息,即所处的光谱颜色的位置。该参数用一角度量来表示,取值范围为0°~360°。若从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,紫色为300°;
- 饱和度S:取值范围为0.0~1.0;
- 亮度V:取值范围为0.0(黑色)~1.0(白色)。
1.1 RGB转HSV
RGB 转 HSV 是计算机图形学中的基础颜色空间转换,核心是通过数学公式将红绿蓝三通道映射为色相、饱和度、明度。
**step1:**归一化 ,将 R、G、B 从 0-255 范围除以 255,映射到 0-1 区间;
**step2:**计算最大值与最小值
max=max(R,G,B)
min=min(R,G,B)
Δ=max−min
step3: 计算明度V
V=max
**step4:**计算饱和度 S
若 max = 0 ,则 S=0, 否则 S=Δ/max
**step5:**计算色相 H
若 Δ = 0 ,则H=0;
若 R=V, H=60×((G−B)/Δ);
若 G=V, H=60×((B−R)/Δ)+120;
若 B=V, H=60×((R−G)/Δ)+240;
如果 H<0,H+360;若H>360,H=H mod 360;
保证结果 0<=V<=1,0<=S<=1,0<=H<=360。
1.2 HSV转RGB
给定在HSV中 (h,s,v)值定义的一个颜色,带有如上的变化于0到360之间的h,和分别表示饱和度和明度的变化于0到1之间的s和v,在RGB空间中对应的 (r,g,b)三原色可以计算为(R,G,B变化于0到1之间):
HSV转RGB的核心公式基于色调(H)所在的六分之一色相区间,通过插值计算RGB分量。
**step1:**特殊情况处理:S = 0
当饱和度为0时,颜色为灰色,RGB三通道相等:R=G=B=V
**step2:**一般情况(S > 0)
将色相 H 归一化到六边形区间:
,
,
计算辅助变量p,q,t:
**step3:**根据 i 的值确定RGB分量:

**step3:**最终得到的R,G,B 值范围为 0 ~ 1,如需映射到 0~255,可乘以255并取整。
def hsv_to_rgb(h, s, v):
"""
将HSV颜色空间转换为RGB颜色空间
参数:
h: 色调 (0-360)
s: 饱和度 (0-1)
v: 明度 (0-1)
返回:
(r, g, b) RGB值 (0-1)
"""
if s == 0:
# 灰色情况
return (v, v, v)
# 将色调归一化到 [0, 1)
h = h / 60.0
i = int(h) % 6
f = h - i
# 计算分量
p = v * (1 - s)
q = v * (1 - s * f)
t = v * (1 - s * (1 - f))
# 根据色调区间选择对应的RGB分量
if i == 0:
r, g, b = v, t, p
elif i == 1:
r, g, b = q, v, p
elif i == 2:
r, g, b = p, v, t
elif i == 3:
r, g, b = p, q, v
elif i == 4:
r, g, b = t, p, v
else: # i == 5
r, g, b = v, p, q
return (r, g, b)
2、HSL
HSL(Hue色相, Saturation饱和度, Lightness亮度)是一种基于RGB色彩模型的圆柱坐标系颜色表示系统。其核心参数包括色相(0-360度对应不同颜色)、饱和度(0%-100%)和明度(0%-100%)。通过色相环角度、中心轴距离和垂直位置分别对应三个维度。

HSL和HSV这两种表示在目的上类似,但在方法上有区别。二者在数学上都是圆柱,但HSV(色相、饱和度、明度)在概念上可以被认为是颜色的倒圆锥体(黑点在下顶点,白色在上底面圆心) ,HSL在概念上表示了一个双圆锥体和圆球体(白色在上顶点,黑色在下顶点,最大横切面的圆心是半程灰色)。HSL和HSV中"色相"指称相同的性质 ,但它们的"饱和度"的定义是不同的 。 因为HSL和HSV是设备依赖的RGB的简单变换,(h,s,l)或 (h,s,v)三元组定义的颜色依赖于所使用的特定RGB"加法原色"。每个独特的RGB设备都伴随着一个独特的HSL和HSV空间。但是 (h,s,l)或 (h,s,v)三元组在被约束于特定RGB空间比如sRGB的时候就更明确了。
RGB 值范围通常为 0--255,HSL 输出为:
- H(色相):0°--360°(角度)
- S(饱和度):0%--100%
- L(亮度/明度):0%--100%
2.1 RGB转HSL
**step1:**归一化 RGB:将 R、G、B 除以 255,映射到 [0, 1] 区间。
**step2:**计算最大值与最小值
max=max(R,G,B)
min=min(R,G,B)
Δ=max−min
**step3:**计算亮度 L
L = (max + min)/2
**step4:**计算饱和度 S
若 Δ == 0(灰度),则 S = 0
否则:
若 L < 0.5,S = Δ /(max + min)
若 L ≥ 0.5,S = Δ / (2 - max - min)
**step5:**计算色相 H
若 Δ = 0 ,则H=0
若 R=V:
若G>=B,则H=60×((G−B)/Δ)
若G<B,则H=60×((G−B)/Δ)+360
若 G=V, H=60×((B−R)/Δ)+120
若 B=V, H=60×((R−G)/Δ)+240
H 的值通常规范化到位于0到360°之间。而 H= 0用于max=min的(定义为灰色)时候而不是留下H未定义。HSL和HSV有同样的色相定义,但是其他分量不同。
2.2 HSL转RGB
**step1:**归一化输入
若 S、L 为百分比,先转换为 0~1 区间(如 60%->0.6)
**step2:**若 S = 0,则 R = G = B = L
step3: 若 S≠ 0,计算临时变量q和p,
若 L < 0.5:
q = L × (1 + S)
否则:
q = L + S − (L × S)
p = 2 × L − q
**step4:**计算每个通道的偏移 H 值
若
若
**step5:**使用偏移 H 值,计算每个通道的颜色值,Color= (ColorR,ColorG,ColorB)
