图像基础与色彩空间:RGB、HSV、YUV、Lab 详解
做图像增强这些年,我最大的体会是:选对色彩空间,项目就成功了一半。很多新手一上来就在 RGB 里猛调对比度,结果颜色全偏了。说白了,RGB 是给显示器看的,不是给算法用的。
这一章,我们把这四种色彩空间掰开揉碎。我会结合项目里踩过的坑,告诉你什么时候该用哪个。
1. RGB 色彩空间——最直观,也最不直观
RGB 用红、绿、蓝三原色叠加。每个通道 0-255,一共 1600 多万种颜色。摄像头拍出来就是 RGB,显示器显示也是 RGB。但问题来了——三个通道高度相关。
举个例子:你想调亮一张图,把 R、G、B 都加 50。结果呢?亮度是上去了,但原本的蓝色天空变成了青灰色。为什么?因为 RGB 里没有独立的亮度分量。
2. HSV 色彩空间——调色师的瑞士军刀
HSV 把颜色拆成三个维度:色相(Hue)、饱和度(Saturation)、明度(Value)。这太符合人的直觉了——你想想看,我们说「把红色调得更鲜艳一点」,在 HSV 里就是调 S 通道;说「让画面亮一点」,就是调 V 通道。
| 通道 | 范围 | 物理含义 | 增强用途 |
|---|---|---|---|
| H | 0-179 | 颜色种类(红、绿、蓝等) | 色调迁移、颜色替换 |
| S | 0-255 | 颜色纯度 | 去雾、色彩增强 |
| V | 0-255 | 亮度/明暗 | 对比度拉伸、亮度调整 |
我个人的习惯是:做色彩增强时,只动 S 和 V 通道,H 通道尽量不动。动 H 通道容易产生色偏,除非你明确要做色调迁移。
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 空间。效果比 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. 知识体系总览
下面这张图,是我自己总结的色彩空间选择逻辑。每次做项目前,我都会看一眼:
这张图的核心逻辑很简单:先明确你要增强什么,再选空间,最后动手。别一上来就调参数,方向错了,调得再好也没用。
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,别搞混了。