第二章:图像基础与色彩空间

色彩空间,说白了就是描述颜色的数学模型。我刚开始做图像评测那会儿,总觉得这东西太理论,直到有一次在项目中死活调不对颜色,才发现——嗯,不懂色彩空间,连问题出在哪都说不清楚。

今天咱们就把RGB、HSV、YUV、Lab这几个常用的色彩空间掰开揉碎。我会结合自己踩过的坑,给你讲明白它们各自适合干什么,以及怎么用Python做转换。

2.1 RGB色彩空间

RGB是最基础、最直观的色彩模型。红绿蓝三原色,每个通道0-255,组合出1600多万种颜色。显示器、摄像头、手机屏幕,底层全是RGB。

但RGB有个大问题——它和人眼感知颜色的方式不太一样。你想想看,RGB里(200, 100, 50)和(210, 105, 55)的数值变化,人眼几乎看不出区别。但在某些区域,数值变一点点,颜色就跳得很明显。

核心要点:RGB适合设备显示,不适合人眼感知分析。

我在项目中遇到过一件事:用RGB直方图做图像质量评估,结果两张看起来完全不同的图,直方图分布却差不多。后来才意识到,RGB通道之间相关性太强,不适合做独立分析。

2.2 HSV色彩空间

HSV把颜色拆成三个维度:色相(Hue)、饱和度(Saturation)、明度(Value)。

  • H(色相):0-360°,决定是什么颜色,比如红色0°,绿色120°
  • S(饱和度):0-1,颜色纯度,0是灰色,1是最鲜艳
  • V(明度):0-1,亮度,0是黑色

为什么HSV好用?因为它更接近人眼描述颜色的方式。你说「那个暗红色的东西」,在HSV里就是H在0附近、S中等、V偏低。但在RGB里,你得同时调三个值。

我的经验:做图像分割时,用HSV做颜色阈值比RGB稳定得多。光照变化主要影响V通道,H和S相对稳定。

2.3 YUV色彩空间

YUV最早是为电视广播设计的。Y是亮度,UV是色度。人眼对亮度敏感、对颜色不敏感,所以UV可以压缩得更狠——这就是视频编码能压那么小的原因之一。

我记得第一次接触YUV是在做视频质量评测时。当时要分析压缩伪影,发现直接在RGB上算PSNR,结果和主观感受对不上。换成YUV后,只看Y通道的PSNR,相关性就好多了。

分量 含义 典型范围
Y 亮度(Luma) 16-235
U 蓝色色差 16-240
V 红色色差 16-240

注意:YUV有多种变体(BT.601、BT.709、BT.2020),转换矩阵不一样。做视频评测时一定要确认标准,否则算出来的指标全是错的。

2.4 Lab色彩空间

Lab是终极答案——它设计成「感知均匀」的色彩空间。什么意思?就是数值变化1,人眼感觉到的颜色变化差不多也是1。这在做图像质量评测时太重要了。

  • L:亮度,0-100
  • a:绿到红,-128到127
  • b:蓝到黄,-128到127

我曾经用Lab空间算色差ΔE,来评估不同显示器之间的颜色一致性。结果和主观评测的相关系数达到0.95以上,比RGB和HSV都好得多。

2.5 色彩空间转换原理

转换说白了就是矩阵乘法。RGB到YUV是线性变换,RGB到HSV是非线性变换,RGB到Lab更复杂——得先转XYZ,再非线性映射。

举个最简单的例子,RGB到灰度(其实就是Y通道):

Gray = 0.299 * R + 0.587 * G + 0.114 * B

为什么权重不一样?因为人眼对绿色最敏感,对蓝色最不敏感。这个系数是ITU-R BT.601标准定义的。

2.6 Python实现

我建议你用OpenCV做色彩空间转换,它封装好了所有主流转换,而且性能很好。下面是我常用的几个转换:

import cv2
import numpy as np

# 读取图像(默认BGR格式)
img = cv2.imread('test.jpg')

# BGR转RGB
rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# BGR转HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# BGR转YUV
yuv = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)

# BGR转Lab
lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)

# 手动实现RGB转灰度
def rgb_to_gray(rgb_img):
    # 确保是RGB顺序
    r, g, b = rgb_img[:,:,0], rgb_img[:,:,1], rgb_img[:,:,2]
    gray = 0.299 * r + 0.587 * g + 0.114 * b
    return gray.astype(np.uint8)

避坑指南:OpenCV默认用BGR顺序,不是RGB。我曾经因为这个bug排查了整整一下午——显示出来的图像颜色全不对。

2.7 知识体系总览

下面这张图是我自己整理的色彩空间知识结构,帮你理清思路:

色彩空间知识体系 色彩空间 RGB HSV YUV Lab 设备显示 通道相关性强 颜色阈值分割 光照鲁棒性好 视频编码 亮度色度分离 感知均匀 色差评测 应用场景:图像增强 | 颜色校正 | 质量评测 | 目标检测 | 视频压缩 Python实现:OpenCV → cv2.cvtColor() 选择色彩空间 = 选择解决问题的视角

2.8 实战建议

说了这么多,到底什么时候用哪个?我总结了几条经验:

  1. 做显示、存储:用RGB,这是硬件标准
  2. 做颜色分割、跟踪:用HSV,光照变化影响小
  3. 做视频编码、质量评测:用YUV,分离亮度和色度
  4. 做色差分析、颜色一致性:用Lab,感知均匀才是王道

曾经踩过的坑:有一次做图像去雾算法评测,直接用RGB算PSNR,结果去雾后的图PSNR反而更低。后来换成Lab空间的L通道做评测,才和主观感受对上。所以——评测指标的选择,和色彩空间的选择一样重要。

好了,色彩空间这部分就聊到这儿。记住一句话:没有最好的色彩空间,只有最合适的。下次做图像评测时,先问问自己——我到底要分析什么?然后再选对应的色彩空间。


公众号:蓝海资料掘金营,微信deep3321