前言

        opencv默认使用BGR格式读取图像,随着图像技术的发展,不同的专业领域使用了不同的颜色空间,为了适配及简化转换过程,opencv提供了很多颜色空间转换的方法。

        本文内容主要来自AI,整理了与颜色空间相关的知识点,同时篇尾提供一个QT开发的调色板工具,资源中可下载源码。

历史

颜色空间 擅长领域 趣闻
XYZ 颜色科学基础 1931年制定,当时的实验者看了几百万个颜色!
RGB/BGR 显示、存储 OpenCV用BGR是因为20年前某相机厂家用这个顺序,就一直沿用
HSV/HSL 颜色选择、分割 Photoshop的颜色选择器就用HSV,因为人类更易理解
Lab 颜色测量、匹配 CIE L*a*b*中的星号其实有数学意义,但大家都不写,简写为Lab
YUV/YCrCb 视频压缩、传输 为什么叫YUV?Y=亮度,U和V没有实际意义,只是字母

颜色空间

XYZ颜色空间

        是一种基于人眼颜色匹配实验定义的色彩空间,是许多其他颜色空间的基础,它是人为定义的虚拟颜色,现实中不存在,但能精确描述所有可见颜色。XYZ通过虚拟基色解决了RGB混合时可能出现的负值问题,颜色匹配更稳定。

特点

  • 设备无关性:不依赖于任何具体显示设备或输入设备。
  • 包含所有人眼可见颜色:其色域覆盖了人类视觉所能感知的所有颜色(即“可见光谱轨迹”内的所有颜色)。
  • 三刺激值(Tristimulus Values):X、Y、Z 分别代表红、绿、蓝三种原色的加权响应,其中 Y 通道直接对应亮度(Luminance),a、b通道表示色度。
  • 可转换性:可作为中间桥梁,与其他颜色空间(如 RGB、Lab、Luv 等)相互转换。

应用场景

1. 颜色科学与标准制定
  • 用于定义和量化颜色的标准(如 CIE 标准光源、标准观察者)。
  • 是制定其他颜色空间(如 CIELAB、CIELUV)的基础。
2. 色彩管理与校准
  • 在 ICC 色彩配置文件中,常以 XYZ 作为 Profile Connection Space(PCS),实现不同设备间的颜色一致性转换。
  • 例如:从相机 RAW 数据 → XYZ → 显示器 sRGB。
  • 例如:CD色域测试、相机白平衡算法设计。
3. 图像处理与计算机视觉
  • 在需要精确颜色计算的场合(如白平衡、色温校正、颜色恒常性算法)中,先将 RGB 转换为 XYZ 再进行处理。
  • 用于光谱数据重建或颜色匹配计算。
4. 照明与显示工业
  • 用于 LED、显示器、投影仪等设备的色度参数标定(如色坐标 x, y = X/(X+Y+Z), Y/(X+Y+Z))。
  • 计算相关色温(CCT)、显色指数(CRI)等指标时,通常以 XYZ 为基础。
5. 印刷与纺织行业
  • 在配色系统中,通过 XYZ 值预测油墨/染料混合后的颜色效果。
  • 实现跨媒介(屏幕 vs 纸张)的颜色一致性。
6. 科研与教育
  • 作为色度学教学的核心模型,帮助理解人眼视觉响应与颜色感知机制。
  • 用于心理物理学实验中的颜色刺激量化。

RGB/BGR颜色空间

        在 OpenCV 诞生的年代(1990s–2000s 初),许多视频采集设备(如摄像头、电视卡)和图像格式(尤其是 Windows 平台上的)默认使用 BGR 或 BGRA 排列。

        RGB 空间的“红、绿、蓝”,即是常见的(真实)三基色,即每种颜色都可以通过三基色形成,但是有些可见颜色无法仅用这三种正系数混合出来,必须引入“负值”,目前使用[0,256]区域的三基色是有缺陷的。

        早期彩色显示器(如 CRT)就是通过红、绿、蓝三种荧光粉发光混合出各种颜色的。RGB 直接对应硬件的发光机制,是最自然的驱动方式,即RGB是当时社会生产环境图像设备的对接技术,而且当时没有复杂的色彩科学模型,所以RGB是当前使用最广泛的技术。

        在数字图像和OpenCV中,主要处理的是加色模型的RGB系统。opencv的cv::imread()默认使用BGR格式读取图像,而cv::imwirte()在保存图像时会根据所保存的图像格式自动处理颜色通道的顺序。对于最常用的图像格式(如 JPEG、PNG),尽管 OpenCV 内部使用 BGR 格式来表示图像数据,cv::imwrite() 在保存这些图像时会将 BGR 格式的图像转换为通常的标准格式,即 RGB,再进行保存。

特点

1、模型
  • 加色混合: 适用于发光体(如显示器、灯光)。将不同强度的红、绿、蓝三种色光相加混合,可以产生出自然界中绝大多数人眼可见的颜色。

    • R + G =

    • R + B = 品红

    • G + B =

    • R + G + B =

    • 三者均为0 =

  • 减色混合: 适用于反光体(如印刷、颜料)。这是通过吸收(减去)白光中的某些颜色成分来呈现色彩。通常使用青、品红、黄作为三原色,再加上黑色构成印刷四色。

2、设备相关性        
  • RGB 值本身不具有绝对颜色意义,同一组 (R,G,B) 在不同显示器上可能呈现不同颜色。
  • 因为它依赖于设备的色域(如 sRGB、Adobe RGB 等标准)
3、颜色与亮度耦合
  • RGB是Red, Green, Blue的缩写,即3个通道都是包含色彩的,亮度信息和颜色信息耦合在一起,(物体颜色不变的情况下)光照的变化会同时影响3个通道值的变化。
4、数据结构简单直观
  • 每个像素用 3 个数值表示(通常 8-bit,范围 0–255)。
  • 在内存中连续存储,便于快速访问和计算。

应用场景

1. 图像采集与显示
  • 摄像头、扫描仪、手机相机等设备直接输出 RGB(或 Bayer 格式转 RGB)。
  • 显示器、LED 屏、投影仪等硬件直接接收 RGB 信号驱动像素。
  • ➤ 原因:RGB 与光电传感器和发光器件的物理特性天然匹配。
2. 通用图像存储与传输
  • 常见图像格式(JPEG、PNG、BMP)默认以 RGB(或 BGR)方式存储像素数据。
  • Web 图像(HTML/CSS 中的 rgb(255,0,0))也基于 RGB。
3. 基础图像处理操作
  • 在 OpenCV 中,很多函数默认处理 BGR/RGB 图像:
    • 图像裁剪、缩放、旋转
    • 像素级运算(加法、混合、滤波)
    • 绘图(画线、矩形、文字)
4.深度学习与 CNN 输入
  • 大多数卷积神经网络(如 ResNet、YOLO)将输入图像标准化为 RGB 三通道张量(H×W×3)。
  • 数据集(ImageNet、COCO)均以 RGB 格式提供。
5. 不适合但常被误用的场景
场景 问题 更优选择
颜色分割(如找红色物体) 光照变化导致 R 值波动大 HSV / LAB
图像压缩(如 JPEG) RGB 冗余高,人眼对亮度更敏感 YCbCr
色彩增强或调色 调整 R/G/B 会同时改变色相和亮度 HSV / HSL

不要盲目在 RGB 空间做颜色阈值:先考虑转到 HSV 或 LAB。

RGB 是“起点”,不是“终点”:大多数高级任务需要转换颜色空间。

HSV / HSL颜色空间

        这是亮度信息和颜色信息解耦的颜色空间,为了解决RGB的缺点而设计,更符合人类对颜色的感知。

缩写 全称 中文含义
HSV Hue, Saturation, Value 色调、饱和度、明度(或“亮度”)
HSL Hue, Saturation, Lightness 色调、饱和度、亮度(或“明暗度”)
  • H: 色相。颜色的基本属性(红、橙、黄、绿…)。范围通常是 [0, 180)(在OpenCV中为了适应8位存储,通常用0-180表示0-360度)。

  • S: 饱和度。颜色的纯度/鲜艳程度。0%为灰色,100%为完全饱和。

  • V: 明度。颜色的明亮程度。0%为黑,100%为最亮。

  • L: 亮度。与V类似,但计算方式不同。HSL中的L=50%时颜色最纯。

分量 理论范围 OpenCV (8-bit) 范围 说明
H (Hue) 0 – 360° 0 – 179 除以 2,避免溢出 uint8(255)
S (Saturation) 0 – 1 0 – 255 0=无色,255=最饱和
V (Value) 0 – 1 0 – 255 0=黑,255=最亮
L (Lightness) 0 – 1 0 – 255 (HSL 在 OpenCV 中支持有限,见下文)

OpenCV 主要支持 HSV,对 HSL 支持较弱cv2.cvtColor() 有 COLOR_BGR2HSV,但没有直接的 BGR2HSL(需通过其他库如 PIL 或手动转换)。

特点及应用场景

  • 亮度与颜色分离:非常适合基于颜色的图像分割、滤镜、颜色识别、目标检测(如交通灯、水果识别)、图像增强等。

YCrCb(YUV)颜色空间

        另一种将亮度与颜色信息分离的模型,广泛应用于电视系统和视频压缩。

  • Y: 亮度分量。也就是灰度图。

  • Cr: 红色差分量,Red-difference chroma(红差色度),表示红色与亮度的偏差。

  • Cb: 蓝色差分量,Blue-difference chroma(蓝差色度),表示蓝色与亮度的偏差。

历史

  • YUV:最初用于模拟电视广播(如 PAL/NTSC),U/V 是连续信号。
  • YCbCr:数字版本,用于 JPEG、MPEG、H.264 等数字图像/视频标准。
  • 在 OpenCV 和大多数现代文献中,“YUV” 常被用作 YCbCr 的代称,但严格来说它们略有不同。

特点

1. 人眼对亮度比色度更敏感
  • 人眼能清晰分辨亮度细节(如边缘、纹理),但对颜色细节不敏感。
  • 例如:你可以看清黑白照片的细节,但若颜色模糊一点,几乎察觉不到。
2. 节省带宽 / 压缩效率高
  • 既然人眼“不在乎”色度细节,就可以降低 Cb/Cr 的分辨率(称为 色度子采样,Chroma Subsampling)。
  • 常见格式:
    • 4:4:4:无子采样(Y, Cb, Cr 同分辨率)
    • 4:2:2:水平方向色度减半(专业视频)
    • 4:2:0:水平和垂直都减半(JPEG、H.264、YouTube 视频)

💡 举例:一张 1920×1080 图像:

  • RGB 需要 3 × 1920 × 1080 ≈ 6.2 MB
  • YCbCr 4:2:0 只需 1.5 × 1920 × 1080 ≈ 3.1 MB(节省 50%!)
3. 兼容黑白电视
  • 老式黑白电视只需接收 Y 分量 即可显示图像,彩色电视再额外接收 Cb/Cr。
  • 这使得彩色信号能向后兼容。

应用场景

1. JPEG 图像压缩
  • JPEG 将 RGB 转为 YCbCr,对 Cb/Cr 进行 4:2:0 子采样,再做 DCT 变换。
  • 这是 JPEG 能高压缩比而不明显失真的关键!
2. 视频编码(H.264 / HEVC)
  • 所有主流视频编码标准都基于 YCbCr。
  • 通过降低色度分辨率大幅减少数据量。
3. 肤色/人脸检测
  • 皮肤在 Cb-Cr 平面上聚集在一个椭圆区域内。
  • 可快速排除非皮肤区域,提升检测效率。
4. 图像增强
  • 只增强 Y 通道(锐化、对比度),不影响颜色。
  • 或只调整 Cb/Cr 实现“白平衡”校正。

注意事项

  1. 不要混淆 YUV 和 YCbCr:在数字图像中,基本都是 YCbCr。
  2. OpenCV 的 YUV 就是 YCbCr:放心使用 cv2.COLOR_BGR2YUV
  3. Y ≠ 灰度图:虽然相似,但灰度图常用 0.299R + 0.587G + 0.114B,而 Y 通道可能经过偏移(如 +16)。
  4. 色度子采样在 OpenCV 中不自动进行:你需要手动下采样 Cb/Cr(如用 cv2.resize)。

Lab颜色空间

        CIELAB(通常简称为 Lab)颜色空间 是目前最接近人类视觉感知均匀性的颜色模型之一,广泛应用于高端图像处理、色彩管理、工业检测和科学研究中。

分量 含义 取值范围(理论) OpenCV 中的实际范围
L*** 亮度(Lightness) 0(黑) → 100(白) 0–100(float32)或 0–255(uint8,需注意转换)
a*** 红-绿轴 -128(绿) → +127(红) -128 到 +127(常偏移为 0–255 存储)
b*** 黄-蓝轴 -128(蓝) → +127(黄) -128 到 +127(同上)
  • L 与 YCbCr 的 Y 类似,但经过非线性变换,更符合人眼对亮度的对数响应。
  • a 和 b 是“对立色”通道(opponent colors),源于人类视网膜的神经机制。

特点

优势 说明
感知均匀 ΔE(色差)可量化“看起来多不同”
设备无关 不依赖显示器色域
亮度/色度完全解耦 L 与 a/b 正交,互不影响
色域广 覆盖几乎所有可见色

局限

局限 说明
计算复杂 需要非线性变换,比 HSV/YCbCr 慢
OpenCV 存储不标准 uint8 导致精度损失
不适合显示/存储 显示器仍需转回 RGB
初学者难调参 a/b 范围不直观

应用场景

1. 颜色差异计算(ΔE)

工业中常用 CIE76 色差公式

ΔE=(L1−L2)2+(a1−a2)2+(b1−b2)2ΔE=(L1​−L2​)2+(a1​−a2​)2+(b1​−b2​)2​

  • ΔE < 1:人眼几乎无法分辨
  • ΔE > 2.3:普通观察者可察觉
  • ΔE > 5:明显不同

应用:印刷品质检、纺织品配色、食品新鲜度检测(如苹果变褐)

2. 白平衡(Gray World Assumption)

假设图像平均色应为灰色(a=0, b=0):

avg_a = np.mean(lab[:, :, 1])
avg_b = np.mean(lab[:, :, 2])
lab[:, :, 1] = lab[:, :, 1] - avg_a + 128  # 调整到中性
lab[:, :, 2] = lab[:, :, 2] - avg_b + 128
3. 高级图像增强
  • 只调整 L 通道:提升细节而不改变颜色
  • 在 a/b 通道做滤波:去除色噪
4. 医学/遥感图像分析

因 Lab 对光照变化鲁棒,适合分析组织颜色、植被健康等。

注意事项

  1. 优先在 Lab 空间做亮度增强(如 CLAHE),避免颜色失真。
  2. 不要直接用 Lab 做颜色阈值分割(不如 HSV 直观),但可用于精细色差判断。
  3. 若需高精度 Lab,考虑使用 skimage.color.rgb2lab(基于 float64,符合标准)。
  4. 记住:Lab 是“分析用”,不是“显示用” —— 最终还是要转回 RGB 显示。

以上结果颜色空间对比

特性 RGB HSV / HSL YCbCr (YUV) Lab  XYZ
设备相关

✅ 是

(依赖色域)

✅ 是

(基于RGB)

✅ 是(基于 RGB) ❌ 否(设备无关) ❌ 否(绝对标准)
亮度独立 ❌ 耦合

(V/L 独立)

✅✅

(Y 完全独立)

✅✅(L 正交) ⚠️ 部分(Y≈亮度)
感知均匀 ❌ 差 ❌ 中等 ❌ 差 ✅✅✅ 优秀 ❌ 差(非均匀)
包含所有可见色 ❌(受限于色域) ✅(几乎全部)

✅✅

(完整可见光谱)

OpenCV 直接支持 ✅✅ ✅(HSV) ✅(YUV) ✅(LAB) ❌(需手动或用其他库)
应用场景 显示、存储、CNN 输入 颜色分割、UI 调色 JPEG、视频编码、肤色检测 色差计算、白平衡、高端增强 颜色科学、设备校准、ICC 配置文件
数学性质

线性

(但含伽马)

非线性

(圆柱/锥)

线性变换

高度非线性

(立方根)

线性

(三刺激值)

通道含义 R/G/B 原色光 色调/饱和度/明度 亮度 + 蓝差/红差 亮度 + 对立色轴

X/Y/Z 三刺激值

(无直接物理意义)

调色板

效果图

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐