图像基础与色彩空间:RGB、HSV、YUV、Lab 详解

做图像增强这些年,我最大的体会是:选对色彩空间,项目就成功了一半。很多新手一上来就在 RGB 里猛调对比度,结果颜色全偏了。说白了,RGB 是给显示器看的,不是给算法用的。

这一章,我们把这四种色彩空间掰开揉碎。我会结合项目里踩过的坑,告诉你什么时候该用哪个。

1. RGB 色彩空间——最直观,也最不直观

RGB 用红、绿、蓝三原色叠加。每个通道 0-255,一共 1600 多万种颜色。摄像头拍出来就是 RGB,显示器显示也是 RGB。但问题来了——三个通道高度相关。

举个例子:你想调亮一张图,把 R、G、B 都加 50。结果呢?亮度是上去了,但原本的蓝色天空变成了青灰色。为什么?因为 RGB 里没有独立的亮度分量。

我曾经踩过的坑:在 RGB 空间做直方图均衡化,三个通道分别做。结果图像出现大量伪色,边缘还泛紫。后来才明白,RGB 通道的直方图分布差异很大,分开处理会破坏色彩平衡。

2. HSV 色彩空间——调色师的瑞士军刀

HSV 把颜色拆成三个维度:色相(Hue)、饱和度(Saturation)、明度(Value)。这太符合人的直觉了——你想想看,我们说「把红色调得更鲜艳一点」,在 HSV 里就是调 S 通道;说「让画面亮一点」,就是调 V 通道。

通道 范围 物理含义 增强用途
H 0-179 颜色种类(红、绿、蓝等) 色调迁移、颜色替换
S 0-255 颜色纯度 去雾、色彩增强
V 0-255 亮度/明暗 对比度拉伸、亮度调整

我个人的习惯是:做色彩增强时,只动 S 和 V 通道,H 通道尽量不动。动 H 通道容易产生色偏,除非你明确要做色调迁移。

实战技巧:低光照图像增强,先把 RGB 转 HSV,对 V 通道做 CLAHE(限制对比度自适应直方图均衡化),再转回 RGB。效果比直接对 RGB 做要好得多,而且不会出现伪色。

3. YUV 色彩空间——视频编码的基石

YUV 最早是为黑白电视兼容彩色信号设计的。Y 是亮度,U 和 V 是色差信号。人眼对亮度敏感,对颜色不敏感——所以视频压缩时可以降低 UV 分量的采样率,人眼看不出区别。

在图像增强里,YUV 最大的价值是:亮度增强和色彩增强可以完全解耦。

# RGB 转 YUV(BT.601 标准)
def rgb_to_yuv(r, g, b):
    y =  0.299 * r + 0.587 * g + 0.114 * b
    u = -0.147 * r - 0.289 * g + 0.436 * b + 128
    v =  0.615 * r - 0.515 * g - 0.100 * b + 128
    return y, u, v

# 只增强 Y 通道,U、V 保持不变
y_enhanced = clahe(y)
# 转回 RGB 时,色彩信息完整保留

我在做视频增强项目时,就靠这个思路。1080p 的视频,只对 Y 通道做处理,速度提升了 3 倍,画质几乎没有损失。

4. Lab 色彩空间——感知均匀的王者

Lab 是 CIE 定义的色彩空间,目标是让颜色差异与人眼感知一致。L 是亮度(0-100),a 是红绿色轴,b 是黄蓝色轴。

为什么 Lab 在图像增强里这么重要?因为欧几里得距离在 Lab 空间里直接对应颜色差异的大小。你在 RGB 里算两个颜色的距离,结果可能和人眼感受完全对不上。

核心优势:Lab 空间的 L 通道和 a、b 通道几乎不相关。这意味着你可以放心地对 L 通道做各种增强,而不用担心色彩失真。这是 RGB 做不到的。

我建议在做图像去雾、低光照增强、色彩校正这类任务时,优先考虑 Lab 空间。效果比 HSV 更稳定,尤其是处理自然图像时。

5. 色彩空间转换在增强中的意义

说了这么多,核心就一句话:把增强操作放在最合适的色彩空间里做。

我整理了一个选择指南:

增强任务 推荐色彩空间 操作通道 原因
对比度增强 Lab 或 YUV L 或 Y 亮度独立,不偏色
色彩饱和度增强 HSV S 直接控制纯度
色调迁移 Lab a、b 感知均匀,迁移自然
去雾 HSV 或 Lab V 或 L 避免颜色失真
低光照增强 YUV Y 速度快,效果好

你可能会问:每次都要转来转去,不麻烦吗?其实 OpenCV 里一行代码就搞定了:

import cv2

# RGB -> HSV
hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)

# RGB -> Lab
lab = cv2.cvtColor(img, cv2.COLOR_RGB2Lab)

# RGB -> YUV
yuv = cv2.cvtColor(img, cv2.COLOR_RGB2YUV)

嗯,这里要注意:OpenCV 默认是 BGR 顺序,不是 RGB。我刚开始用的时候就被坑过,图像颜色全反了。记得用 cv2.COLOR_BGR2HSV 而不是 RGB2HSV。

6. 知识体系总览

下面这张图,是我自己总结的色彩空间选择逻辑。每次做项目前,我都会看一眼:

色彩空间选择决策流程 输入图像 (RGB) 增强目标是什么? 对比度/亮度 色彩饱和度 色调迁移/校正 Lab 或 YUV 操作 L/Y 通道 HSV 操作 S 通道 Lab 操作 a/b 通道 CLAHE / 直方图均衡 饱和度拉伸 色调匹配 / 白平衡 转回 RGB 输出 H 通道尽量不动,避免色偏

这张图的核心逻辑很简单:先明确你要增强什么,再选空间,最后动手。别一上来就调参数,方向错了,调得再好也没用。

7. 避坑指南

  • 别在 RGB 里做直方图均衡化——三个通道分开做,伪色满天飞。我吃过这个亏,后来再也不敢了。
  • HSV 的 H 通道范围是 0-179,不是 0-359。OpenCV 里默认是 0-179,转回 RGB 时要注意。
  • Lab 空间的 L 通道范围是 0-100,不是 0-255。做增强时记得归一化,否则数值溢出。
  • YUV 有多种标准(BT.601、BT.709、BT.2020)。高清视频用 BT.709,4K 用 BT.2020,别搞混了。