RGB色彩空间详解(线性/伽马、原色与白点、转换与实践)

目录

    1. 核心概念与成像机理
    1. 原色、白点与色域(sRGB/Adobe RGB/Display P3)
    1. 伽马与传递函数(TRC):线性 vs 非线性
    1. RGB↔XYZ↔Lab 转换(矩阵与公式)
    1. 工作色彩空间与显示色彩空间(ICC/色彩管理)
    1. 组合与滤镜:线性空间操作的必要性
    1. HDR 与RGB(scRGB、PQ、HLG)简述
    1. 像素格式与通道顺序(RGB/BGR、stride)
    1. 常见代码示例(OpenCV/PIL)
    1. 常见坑与排查

1. 核心概念与成像机理

  • RGB是三刺激颜色模型:用红、绿、蓝三基色在加色模型下于线性光域线性组合表示其色域内的颜色;显示设备通过三子像素发光实现加色混合,数值域通常为非线性(例如 sRGB TRC),需经伽马解码后再进行线性运算。
  • 相机管线:传感器采集RAW(CFA),经去马赛克(Demosaic)、白平衡(AWB)、颜色校正(CCM)、色调映射(Tone/Gamma)得到显示RGB。
  • 线性RGB与非线性RGB:线性RGB与物理光强成比例,非线性RGB(如sRGB)经过伽马压缩以优化编码效率与感知均匀性。

2. 原色、白点与色域(sRGB/Adobe RGB/Display P3)

  • 原色(Primaries)与白点(White Point)定义一个RGB色彩空间的几何:色域边界由三原色的色度坐标决定,白点(如D65)定义中性点。
  • 常见色彩空间:
    • sRGB:原色位于CIE 1931 xy平面上标准位置,白点D65,覆盖度为消费级显示标准。
    • Adobe RGB (1998):更大绿色方向色域,适合印刷与专业摄影。
    • Display P3:更大红/绿方向(类似DCI-P3),广色域移动与现代显示设备常用,白点D65。
  • 色域边界与映射:不同空间间转换需要考虑色域外颜色(gamut mapping),采用压缩/裁剪策略确保观感。

3. 伽马与传递函数(TRC):线性 vs 非线性

  • sRGB传递函数(正向,线性→非线性):
    • 设线性通道值 C_lin∈[0,1],输出 C_srgb:
      • 若 C_lin ≤ 0.0031308:C_srgb = 12.92·C_lin
      • 否则:C_srgb = 1.055·(C_lin)^{1/2.4} − 0.055
  • 逆向(非线性→线性):
    • 若 C_srgb ≤ 0.04045:C_lin = C_srgb/12.92
    • 否则:C_lin = ((C_srgb+0.055)/1.055)^{2.4}
  • 必要性:人眼对亮度响应非线性;伽马压缩让编码更符合感知且提高低亮度编码效率。图形合成/滤镜/光照计算必须在“线性空间”进行,否则产生亮度错误与光晕。

4. RGB↔XYZ↔Lab 转换(矩阵与公式)

  • sRGB(D65)到XYZ(线性RGB前提):
    • \begin{bmatrix}X\\Y\\Z\end{bmatrix} = \begin{bmatrix}0.4124564 & 0.3575761 & 0.1804375\\ 0.2126729 & 0.7151522 & 0.0721750\\ 0.0193339 & 0.1191920 & 0.9503041\end{bmatrix} \begin{bmatrix}R\\G\\B\end{bmatrix}
  • XYZ到sRGB(线性)矩阵:
    • \begin{bmatrix}R\\G\\B\end{bmatrix} = \begin{bmatrix} 3.2404542 & -1.5371385 & -0.4985314\\ -0.9692660 & 1.8760108 & 0.0415560\\ 0.0556434 & -0.2040259 & 1.0572252\end{bmatrix} \begin{bmatrix}X\\Y\\Z\end{bmatrix}
  • RGB→Lab:通过 RGB→XYZ 后使用参考白点(D65)进行 XYZ→Lab 的非线性映射;Lab近似感知均匀,适合度量与增强。
  • 色适应(Chromatic Adaptation):不同白点(如D50↔D65)之间需使用Bradford等适应矩阵进行转换以保持颜色稳定。

5. 工作色彩空间与显示色彩空间(ICC/色彩管理)

  • 工作空间:图像编辑/合成使用的空间(如ProPhoto、Adobe RGB),决定可操作色域与数值分布。
  • 显示空间:显示设备实际支持的空间(sRGB/P3等)。色彩管理系统(CMS)根据ICC配置进行颜色转换与伽马调整以匹配设备。
  • 关键原则:在工作空间进行线性操作;导出/显示时转换到目标显示空间并应用相应TRC。

6. 组合与滤镜:线性空间操作的必要性

  • 合成(Additive/Alpha Blend)与光照/模糊/卷积等应在“线性RGB”进行,再应用sRGB伽马;否则亮度会错误(常见问题:叠加变灰、光照不自然)。
  • 预乘Alpha(Premultiplied Alpha):在线性空间先与颜色相乘降低边缘光晕与色溢出,再进行合成。

7. HDR 与RGB(scRGB、PQ、HLG)简述

  • scRGB:在线性RGB基础上扩展到浮点范围,覆盖超出sRGB的亮度。
  • PQ(ST 2084)与HLG:非线性传递使HDR显示在更大亮度范围内感知均衡;RGB值需按标准TRC解码到线性光再运算。
  • 广色域与HDR:Display P3与BT.2020常配合HDR,需色域与TRC双重管理。

8. 像素格式与通道顺序(RGB/BGR、stride)

  • 通道顺序:许多库(如OpenCV)默认BGR;错误的通道顺序会导致色偏。注意PIL为RGB,OpenCV为BGR。
  • 内存布局:逐像素交织(RGBRGB…)或行对齐(stride);处理图像时应使用实际步长而非仅宽度。

9. 常见代码示例(OpenCV/PIL)

import cv2
import numpy as np

# sRGB -> 线性RGB
def srgb_to_linear(img):
  f = img.astype(np.float32)/255.0
  mask = f <= 0.04045
  f[mask] = f[mask]/12.92
  f[~mask] = ((f[~mask]+0.055)/1.055)**2.4
  return f

# 线性RGB -> sRGB
def linear_to_srgb(f):
  g = np.empty_like(f)
  mask = f <= 0.0031308
  g[mask] = 12.92*f[mask]
  g[~mask] = 1.055*(f[~mask]**(1/2.4)) - 0.055
  return np.clip(g*255.0, 0, 255).astype(np.uint8)

# 示例:线性空间做加权混合
img = cv2.imread('input.jpg')[:, :, ::-1]  # BGR->RGB
lin = srgb_to_linear(img)
blend = 0.7*lin + 0.3*lin.mean(axis=2, keepdims=True)
out = linear_to_srgb(blend)
cv2.imwrite('blend_linear.png', out[:, :, ::-1])

# OpenCV XYZ/Lab转换(注意通道顺序)
bgr = cv2.imread('input.jpg')
xyz = cv2.cvtColor(bgr, cv2.COLOR_BGR2XYZ)
lab = cv2.cvtColor(bgr, cv2.COLOR_BGR2Lab)
cv2.imwrite('xyz.png', xyz)
cv2.imwrite('lab.png', lab)
from PIL import Image, ImageOps
import numpy as np

img = Image.open('input.jpg').convert('RGB')
arr = np.asarray(img).astype(np.float32)/255.0
gamma = 2.2
lin = arr**gamma  # 仅为示例(更准确应使用sRGB TRC)
lin_blur = lin.mean(axis=2, keepdims=True)
out = np.clip(lin_blur**(1/gamma)*255.0, 0, 255).astype(np.uint8)
Image.fromarray(out.squeeze()).save('luma_blend.png')

10. 常见坑与排查

  • 在线性/非线性混用:在sRGB空间做合成/滤镜会产生亮度错误。应转换到线性RGB后运算。
  • 通道顺序误用:BGR与RGB混淆导致色偏。
  • 色域与白点:sRGB与P3/Adobe RGB转换未做色适应(Bradford)导致颜色漂移。
  • ICC/色彩管理关闭:广色域图像在不支持CMS的应用中显示发艳或失真。
  • HDR与TRC:HDR内容按sRGB显示会过曝/发灰;需按PQ/HLG正确映射。

结语

RGB是图像显示与合成的基础,但必须区分线性与非线性空间、明确原色与白点并使用正确的矩阵与色彩管理。工程实践中遵循“在线性空间进行物理/合成运算,显示前再应用目标TRC”的原则,可显著提升真实感与稳定性。

Logo

邀请您加入社区

更多推荐