怎样用 rgb 三元组理解色相、亮度和饱和度?

Python的 matplotlib.colors 采用三元组 (r, g, b) 来表示颜色,r,g,b 都在 [0, 1] 范围内,例如 (0.1…
关注者
337
被浏览
165,679

11 个回答

HSL 空间是把 RGB 空间经过一个非线性变换得到的。在一个空间中改变一个参数,往往导致另一个空间中三个参数都改变,体现出「牵一发而动全身」的效果。

左为 RGB 空间,右为 HSL 空间

由 RGB 参数计算 HSL 参数的公式如下:

感性认识是这样的:

Hue 叫色相,表示了颜色在色环上的角度。纯红色位于 0 度,纯绿色位于 120 度,纯蓝色位于 240 度。具体计算时,角度主要由 RGB 中最大的那个决定,由次大的那个进行修正。

Lightness 叫亮度,具体计算公式是 RGB 中最大值与最小值的平均值。

Saturation 叫饱和度,表示的是 RGB 三个值的对比有多强烈。其算式中分子 C 是 RGB 中最大值与最小值的差值,但当 L 特别大或特别小的时候,C 的范围有限,为了把它归一化到 [0,1],又除了个与亮度有关的分母。


具体到题主的例子:现在有一个颜色 (0.1, 0.2, 0.5),这是一个比较暗的、略偏绿的蓝色。所以它的色相会略小于 240 度(具体值是 225 度),亮度 L = (0.1 + 0.5) / 2 = 0.3,饱和度分子 C = 0.5 - 0.1 = 0.4,分母为 0.6,所以饱和度为 0.4 / 0.6 ≈ 0.67。

调整色相: 由于亮度、饱和度都只与 RGB 中的最大、最小值相关,所以若要仅调整色相,就要调整绿色 G 的值。增大 G 的值会让色相更偏向绿色,即减小,G = B 时色相最小,为 180 度;反之,减小 G 则会让色相增大,G = R 时色相最大,为 240 度。

调整亮度: 要调整亮度,主要靠调整值最大和最小的 B 和 R,但要注意保持色相和饱和度不变。当 L < 0.5 时,饱和度 S 的公式可以简化为 (M - m) / (M + m)。为了保持饱和度不变,B 和 R 要同比例增减,增时亮度增加,减时亮度降低。为了保持色相不变,G 也要同比例增减。

调整饱和度: 同样,调整饱和度靠的也是 B 和 R。为了保持亮度不变,其中一个增加多少,另一个就要减小多少。增大 B、减小 R 可以让饱和度增加;减小 B、增大 R 可以让饱和度降低。为了保持色相不变,也要调整 G 使它与 B、R 的差值之比与原来相同。

上面的各种调整都要注意不能超过 0 <= R <= G <= B <= 1 的范围。一旦超过,调整方法也会改变。


本答案内容主要参考维基百科页面 HSL and HSV ,也推荐题主阅读一下。

需要注意的是,含有 H、S 两个参数的颜色空间有很多,但由于第三个参数的不同,S 的定义也会有不同。