第二章:图像基础与色彩空间
色彩空间,说白了就是描述颜色的数学模型。我刚开始做图像评测那会儿,总觉得这东西太理论,直到有一次在项目中死活调不对颜色,才发现——嗯,不懂色彩空间,连问题出在哪都说不清楚。
今天咱们就把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 知识体系总览
下面这张图是我自己整理的色彩空间知识结构,帮你理清思路:
2.8 实战建议
说了这么多,到底什么时候用哪个?我总结了几条经验:
- 做显示、存储:用RGB,这是硬件标准
- 做颜色分割、跟踪:用HSV,光照变化影响小
- 做视频编码、质量评测:用YUV,分离亮度和色度
- 做色差分析、颜色一致性:用Lab,感知均匀才是王道
曾经踩过的坑:有一次做图像去雾算法评测,直接用RGB算PSNR,结果去雾后的图PSNR反而更低。后来换成Lab空间的L通道做评测,才和主观感受对上。所以——评测指标的选择,和色彩空间的选择一样重要。
好了,色彩空间这部分就聊到这儿。记住一句话:没有最好的色彩空间,只有最合适的。下次做图像评测时,先问问自己——我到底要分析什么?然后再选对应的色彩空间。
公众号:蓝海资料掘金营,微信deep3321