photograph_tutorial

第四章:色彩科学与白平衡

本章概要

色彩是摄影的灵魂,而手机摄影中的色彩处理涉及复杂的物理学、生理学和计算机科学。本章将从色度学基础出发,深入探讨手机相机如何捕获、处理和再现色彩。我们将理解从光子到像素的完整色彩管线,掌握白平衡的原理与调节技巧,以及RAW格式在色彩处理中的优势。对于习惯处理数据的工程师而言,色彩本质上是一个多维信号处理问题。

4.1 色度学基础

色度学(Colorimetry)是定量描述和测量色彩的科学。对于数字成像系统而言,理解色度学就是理解如何将连续的电磁波谱映射到离散的数字表示。

4.1.1 光的物理特性与人眼感知

光是电磁波,可见光谱范围约为380nm-780nm。任何光源的完整描述是其光谱功率分布(Spectral Power Distribution, SPD):

\[S(\lambda) = \text{辐射功率密度 at 波长 } \lambda\]

人眼视网膜包含三种锥细胞(cone cells),分别对短波(S, ~420nm)、中波(M, ~530nm)、长波(L, ~560nm)敏感。这种三色视觉(trichromatic vision)是所有色彩理论的生理基础。

关键洞察:无限维的光谱信息被人眼降维到三维色彩空间,这意味着不同的SPD可能产生相同的色彩感知(同色异谱,metamerism)。

4.1.2 三刺激值理论

根据Grassmann定律,任何色彩感知可以用三个独立的刺激值表示。CIE 1931标准观察者定义了三个色彩匹配函数$\bar{x}(\lambda)$, $\bar{y}(\lambda)$, $\bar{z}(\lambda)$,将SPD映射到三刺激值:

\(X = k \int_{380}^{780} S(\lambda) \bar{x}(\lambda) d\lambda\) \(Y = k \int_{380}^{780} S(\lambda) \bar{y}(\lambda) d\lambda\) \(Z = k \int_{380}^{780} S(\lambda) \bar{z}(\lambda) d\lambda\)

其中$k$是归一化常数,$Y$被设计为亮度(luminance)通道。

工程视角:这是一个线性变换,将无限维光谱空间投影到3D空间。手机相机的RGB滤镜本质上是在硬件层面实现类似的投影。

4.1.3 色彩匹配函数

CIE色彩匹配函数(CMF)的设计包含几个关键特性:

  1. 非负性:$\bar{x}(\lambda) \geq 0$, $\bar{y}(\lambda) \geq 0$, $\bar{z}(\lambda) \geq 0$(便于物理实现)
  2. $\bar{y}(\lambda)$等同于光视效率函数:$V(\lambda)$,峰值在555nm
  3. 覆盖所有可见色彩:任何单色光都能用正的XYZ值表示
      CMF响应曲线示意图
      
      1.8 |    x̄(λ)
          |    /\
      1.2 |   /  \     ȳ(λ)
          |  /    \    /\
      0.6 | /      \  /  \     z̄(λ)
          |/        \/    \    /\
      0.0 |________________\__/__\___
          400   500   600   700
                波长 (nm)

Rule of thumb:

4.2 CIE色彩空间体系

4.2.1 CIE XYZ色彩空间

CIE XYZ是所有色彩空间的基础,其设计原则是数学优雅性而非直观性。XYZ值的物理含义:

从相机RGB到XYZ的转换通常使用3×3色彩矩阵:

\[\begin{bmatrix} X \\ Y \\ Z \end{bmatrix} = M_{RGB \to XYZ} \begin{bmatrix} R \\ G \\ B \end{bmatrix}\]

例如,sRGB到XYZ的转换矩阵(D65光源):

\[M_{sRGB \to XYZ} = \begin{bmatrix} 0.4124 & 0.3576 & 0.1805 \\ 0.2126 & 0.7152 & 0.0722 \\ 0.0193 & 0.1192 & 0.9505 \end{bmatrix}\]

4.2.2 CIE xyY与色度图

为了分离色度(chromaticity)和亮度,定义归一化坐标:

\[x = \frac{X}{X+Y+Z}, \quad y = \frac{Y}{X+Y+Z}, \quad z = \frac{Z}{X+Y+Z} = 1-x-y\]

CIE 1931色度图是xy平面的可视化,形状像马蹄铁:

    CIE 1931 色度图示意
    
    0.9 |     520nm
        |    /    \
    0.6 |   /      \ 540nm
      y |  /   D65  \
    0.3 | 480nm  *   \  700nm
        |  \___    ___/
    0.0 |    380-700nm
        |________________
        0.0   0.3   0.6   0.9
                x

关键特性

4.2.3 CIE LAB与感知均匀性

XYZ空间的问题是感知非均匀:相同的数值差异在不同区域产生不同的视觉差异。CIE LAB通过非线性变换实现感知均匀性:

\(L^* = 116f(Y/Y_n) - 16\) \(a^* = 500[f(X/X_n) - f(Y/Y_n)]\) \(b^* = 200[f(Y/Y_n) - f(Z/Z_n)]\)

其中$f(t) = t^{1/3}$ (当$t > \delta^3$),$\delta = 6/29$

色差计算(手机相机色彩准确度评估): \(\Delta E_{ab}^* = \sqrt{(\Delta L^*)^2 + (\Delta a^*)^2 + (\Delta b^*)^2}\)

Rule of thumb: $\Delta E < 1$:不可察觉;$\Delta E < 3$:轻微可见;$\Delta E > 6$:明显差异

4.2.4 色域(Gamut)与色彩空间转换

色域定义了设备能够再现的色彩范围。常见标准:

色彩空间 覆盖CIE 1931 典型应用
sRGB ~35% 网络、标准显示器
Adobe RGB ~50% 专业摄影
DCI-P3 ~45% 电影、iPhone显示
Rec.2020 ~75% HDR视频

手机摄影的色域管线:

  1. 传感器色域:由滤色片决定,通常大于sRGB
  2. 处理色域:ISP内部处理,通常使用更大色域
  3. 输出色域:JPEG通常sRGB,HEIF支持P3
  4. 显示色域:现代手机屏幕通常支持DCI-P3

4.3 色温与白平衡原理

4.3.1 黑体辐射与普朗克轨迹

黑体是理想的热辐射体,其光谱分布由普朗克定律描述:

\[M(\lambda, T) = \frac{2\pi hc^2}{\lambda^5} \cdot \frac{1}{e^{hc/\lambda k_B T} - 1}\]

色温(Color Temperature)定义为产生特定色度的黑体温度。普朗克轨迹是不同温度黑体在色度图上的轨迹:

  色温在xy色度图上的位置
  
  y
  0.45 |  2000K (烛光)
       |    \
  0.40 |     3000K (白炽灯)
       |       \
  0.35 |        5000K (日光)
       |          \___6500K (阴天)
  0.30 |              \___10000K (蓝天)
       |________________________
       0.25  0.35  0.45    x

4.3.2 相关色温(CCT)与Duv偏移

实际光源很少完全落在普朗克轨迹上。相关色温(Correlated Color Temperature)是距离最近的黑体温度。

Duv值:垂直于普朗克轨迹的距离

手机相机的色温调节通常提供:

4.3.3 光源的光谱功率分布

不同光源的SPD特征决定了其显色性:

连续光谱光源(显色性好):

离散光谱光源(显色性差):

显色指数(CRI):光源还原标准色彩的能力,最高100

4.3.4 白点校准与色彩适应

白平衡的本质是确定场景中的”白点”,使其在色彩空间中映射为中性灰。

Von Kries色彩适应模型: \(\begin{bmatrix} R' \\ G' \\ B' \end{bmatrix} = \begin{bmatrix} k_R & 0 & 0 \\ 0 & k_G & 0 \\ 0 & 0 & k_B \end{bmatrix} \begin{bmatrix} R \\ G \\ B \end{bmatrix}\)

其中$k_R, k_G, k_B$是白平衡增益系数。

Bradford变换(更精确的色彩适应):

  1. RGB → 锥细胞响应空间
  2. 应用Von Kries缩放
  3. 逆变换回RGB

手机ISP的白平衡实现:

  1. 统计模块:计算图像RGB统计信息
  2. 白点估计:基于算法确定场景白点
  3. 增益计算:计算R/G/B通道增益
  4. 应用校正:在Bayer域或RGB域应用增益

4.4 拜耳阵列与色彩重建

4.4.1 拜耳模式(RGGB)设计原理

Bryce Bayer在1976年发明的滤色阵列(Color Filter Array, CFA)是数字摄影的基石。标准拜耳模式采用2×2重复单元:

  标准拜耳阵列(RGGB)
  
  R G R G R G
  G B G B G B
  R G R G R G
  G B G B G B

设计原理

  1. 绿色像素占50%:人眼对绿光最敏感(峰值~555nm)
  2. 红蓝各占25%:人眼对红蓝敏感度较低
  3. 棋盘格排列:最大化空间采样频率

数学表示: 对于位置$(i,j)$的像素,其颜色通道为: \(\text{Color}(i,j) = \begin{cases} R & \text{if } i \bmod 2 = 0, j \bmod 2 = 0 \\ G & \text{if } i + j \bmod 2 = 1 \\ B & \text{if } i \bmod 2 = 1, j \bmod 2 = 1 \end{cases}\)

信息论视角:每个像素只记录1/3的色彩信息,需要通过插值重建完整RGB。

4.4.2 去马赛克算法

去马赛克(Demosaicing)是从拜耳数据重建全彩图像的过程。主要算法类别:

1. 双线性插值(最简单)

# 伪代码示例
G_at_R = (G_top + G_bottom + G_left + G_right) / 4
B_at_R = (B_topleft + B_topright + B_bottomleft + B_bottomright) / 4

2. 边缘感知插值 利用局部梯度信息避免跨边缘插值:

\[G_{i,j} = \begin{cases} \frac{G_{i-1,j} + G_{i+1,j}}{2} & \text{if } |\nabla_H| < |\nabla_V| \\ \frac{G_{i,j-1} + G_{i,j+1}}{2} & \text{if } |\nabla_V| < |\nabla_H| \\ \frac{G_{i-1,j} + G_{i+1,j} + G_{i,j-1} + G_{i,j+1}}{4} & \text{otherwise} \end{cases}\]

其中$\nabla_H$和$\nabla_V$是水平和垂直梯度。

3. 高级算法

性能vs质量权衡: | 算法 | 速度 | 质量 | 手机ISP使用 | |—–|——|——|————| | 双线性 | 最快 | 差 | 预览模式 | | 边缘感知 | 快 | 中等 | 实时取景 | | AHD/DCB | 中等 | 好 | 拍照模式 | | 深度学习 | 慢 | 最好 | 高端机型夜景 |

4.4.3 色彩插值误差与摩尔纹

去马赛克的固有问题是混叠(aliasing)和伪色(false colors)。

奈奎斯特频率限制

摩尔纹(Moiré)产生条件: 当场景频率接近或超过奈奎斯特频率时: \(f_{scene} \approx n \cdot f_{sampling} \pm f_{visible}\)

典型摩尔纹场景

抑制策略

  1. 光学低通滤镜(OLPF):牺牲锐度换取减少摩尔纹
  2. 自适应去马赛克:检测高频区域特殊处理
  3. 后处理去摩尔纹:基于频域分析

4.4.4 其他滤色阵列:X-Trans、RGBW

X-Trans(富士) 6×6非周期性排列,减少摩尔纹:

  X-Trans CMOS阵列
  
  G B G G R G
  R G R B G B
  G B G G R G
  G R G G B G
  B G B R G R
  G R G G B G

优势:

RGBW(华为等) 添加白色(W)像素提高感光度:

  RGBW阵列
  
  R G R G
  G W G W
  R G R G
  G W G W

数学模型: \(W = 0.299R + 0.587G + 0.114B\) \(\text{SNR}_{RGBW} \approx 1.4 \times \text{SNR}_{RGB}\)(低光下)

Quad Bayer(索尼等) 4个同色像素组成2×2单元:

  Quad Bayer (2×2 binning)
  
  R R G G
  R R G G
  G G B B
  G G B B

工作模式:

  1. 高感光模式:4合1像素,提高2EV感光度
  2. 高分辨率模式:独立读取,保持原始分辨率

Rule of thumb

4.5 自动白平衡算法

自动白平衡(Auto White Balance, AWB)是手机摄影的关键技术,目标是自动补偿光源色偏,使白色物体在任何光源下都呈现中性白。现代手机AWB系统综合多种算法,实时分析场景并调整色彩平衡。

4.5.1 灰世界假设算法

灰世界假设(Gray World Assumption)是最经典的AWB算法,假设场景中所有颜色的平均值应该是中性灰。

基本原理: \(\bar{R} = \frac{1}{N}\sum_{i=1}^{N} R_i, \quad \bar{G} = \frac{1}{N}\sum_{i=1}^{N} G_i, \quad \bar{B} = \frac{1}{N}\sum_{i=1}^{N} B_i\)

理想情况下:$\bar{R} = \bar{G} = \bar{B} = \text{Gray}$

白平衡增益计算: \(k_R = \frac{\bar{G}}{\bar{R}}, \quad k_G = 1, \quad k_B = \frac{\bar{G}}{\bar{B}}\)

或使用亮度归一化: \(k_R = \frac{Y_{avg}}{\bar{R}}, \quad k_G = \frac{Y_{avg}}{\bar{G}}, \quad k_B = \frac{Y_{avg}}{\bar{B}}\)

其中$Y_{avg} = 0.299\bar{R} + 0.587\bar{G} + 0.114\bar{B}$

算法改进

  1. 加权灰世界
    • 中心加权:图像中心权重更高
    • 亮度加权:排除过暗/过亮区域
    • 饱和度加权:排除高饱和度区域
  2. 分块处理
    图像分块示意(8×6网格)
    ┌─┬─┬─┬─┬─┬─┬─┬─┐
    ├─┼─┼─┼─┼─┼─┼─┼─┤
    ├─┼─┼─★─★─┼─┼─┼─┤  ★: 高权重区域
    ├─┼─┼─★─★─┼─┼─┼─┤  
    ├─┼─┼─┼─┼─┼─┼─┼─┤
    └─┴─┴─┴─┴─┴─┴─┴─┘
    

    每块独立计算,取中值或加权平均

  3. 异常值抑制
    • 去除颜色直方图的极端5%
    • 使用中值而非均值
    • Tukey’s biweight等鲁棒统计方法

优缺点分析

实现细节(伪代码):

def gray_world_awb(image, mask=None):
    # 计算有效像素的RGB均值
    if mask is not None:
        R_avg = mean(image[mask, 0])
        G_avg = mean(image[mask, 1])  
        B_avg = mean(image[mask, 2])
    else:
        R_avg, G_avg, B_avg = mean(image, axis=(0,1))
    
    # 计算增益(避免除零)
    gain_R = G_avg / max(R_avg, 1e-6)
    gain_B = G_avg / max(B_avg, 1e-6)
    
    # 限制增益范围[0.5, 2.0]
    gain_R = clip(gain_R, 0.5, 2.0)
    gain_B = clip(gain_B, 0.5, 2.0)
    
    return gain_R, 1.0, gain_B

4.5.2 白点检测算法

白点检测算法寻找图像中最可能是白色或灰色的区域,基于这些区域进行白平衡校正。

完美反射体假设: 场景中最亮的点通常是白色物体的镜面反射,应该呈现中性色。

MaxRGB算法: \(k_R = \frac{\max(R)}{R_{white}}, \quad k_G = \frac{\max(G)}{G_{white}}, \quad k_B = \frac{\max(B)}{B_{white}}\)

问题:容易被饱和像素误导

改进的白点检测

  1. 白色像素候选筛选
    • 亮度范围:$L \in [0.7L_{max}, 0.95L_{max}]$
    • 饱和度限制:$S < 0.3$
    • 色调一致性:相邻像素色调相似
  2. 基于色温轨迹的筛选
    色温约束区域(xy色度图)
       
         ↑ y
    0.45 │    可能白点区域
         │   ╱────╲
    0.35 │  ╱      ╲←普朗克轨迹
         │ ╱   ★    ╲  
    0.25 │╱          ╲
         └────────────→ x
         0.25  0.35  0.45
    

    白点约束:

    • 距离普朗克轨迹 < 0.05
    • 色温范围:2500K-10000K
  3. 统计聚类方法
    • K-means聚类找白色簇
    • DBSCAN去除离群点
    • 高斯混合模型(GMM)建模

Retinex理论的应用: 基于视觉感知,局部最亮点趋向被感知为白色: \(I(x,y) = R(x,y) \cdot L(x,y)\)

其中$I$是观察图像,$R$是反射率,$L$是光照。

假设局部最大反射率为1(白色): \(L(x,y) = \frac{I_{max}(x,y)}{R_{max}} = I_{max}(x,y)\)

多假设融合: 现代手机综合多个白点假设:

def multi_hypothesis_awb(image):
    # 收集多个白点候选
    candidates = []
    
    # 1. 最亮10%像素的中值
    bright_pixels = get_brightest(image, 0.1)
    candidates.append(median(bright_pixels))
    
    # 2. 低饱和度像素均值
    low_sat = get_low_saturation(image, threshold=0.2)
    candidates.append(mean(low_sat))
    
    # 3. 脸部区域外的白色
    non_face = exclude_faces(image)
    white_regions = detect_white(non_face)
    candidates.append(mean(white_regions))
    
    # 加权融合或投票
    return weighted_fusion(candidates)

4.5.3 基于色温估计的方法

直接估计场景光源色温,查表或计算对应的白平衡增益。

色温估计流程

  1. 特征提取
    • 色彩直方图特征
    • 色度均值和方差
    • 边缘色彩分布
  2. 贝叶斯估计: \(P(T|I) = \frac{P(I|T) \cdot P(T)}{P(I)}\)

    其中:

    • $T$:色温
    • $I$:图像观察
    • $P(T)$:色温先验分布
    • $P(I T)$:似然函数
  3. 查找表(LUT)方法: 预计算不同色温下的RGB增益:

    色温(K) R增益 G增益 B增益 场景
    2500 1.00 0.65 0.25 烛光
    3200 1.00 0.75 0.40 白炽灯
    4500 1.00 0.88 0.65 荧光灯
    5500 1.00 1.00 0.92 日光
    6500 0.95 1.00 1.00 阴天
    8000 0.85 0.95 1.00 阴影

场景相关色温估计

  1. 时间相关
    def time_based_prior(hour):
        if 6 <= hour < 10:  # 早晨
            return gaussian(4000, 500)
        elif 10 <= hour < 16:  # 白天
            return gaussian(5500, 300)
        elif 16 <= hour < 19:  # 傍晚
            return gaussian(3500, 500)
        else:  # 夜晚/室内
            return gaussian(3200, 800)
    
  2. 场景识别辅助
    • 室内场景:偏暖色温2700-4000K
    • 室外晴天:5000-6500K
    • 阴天/阴影:6500-8000K
    • 特殊场景:日落(2000-3000K)、蓝调时刻(12000K+)
  3. 多光源检测: 检测图像不同区域的主导色温:
    混合光源场景分析
    ┌────────────┬────────────┐
    │  窗外自然光  │   室内灯光   │
    │  (6500K)   │   (3200K)   │
    ├────────────┼────────────┤
    │     ↓      │      ↓      │
    │  冷色调区域  │   暖色调区域  │
    └────────────┴────────────┘
    

色温平滑与时间连续性

视频/取景器中避免色温跳变: \(T_{t} = \alpha T_{estimated} + (1-\alpha) T_{t-1}\)

其中$\alpha = 0.1-0.3$用于平滑过渡。

4.5.4 机器学习在AWB中的应用

深度学习方法直接从数据学习复杂的色彩校正映射。

1. 卷积神经网络(CNN)方法

网络架构示例:

输入图像 → Conv层 → 特征提取 → 全连接层 → RGB增益
  ↓
下采样(64×64)
  ↓
[Conv 3×3, 32] → ReLU → MaxPool
  ↓
[Conv 3×3, 64] → ReLU → MaxPool  
  ↓
[Conv 3×3, 128] → ReLU → GlobalAvgPool
  ↓
[FC 128→64] → ReLU
  ↓
[FC 64→3] → Sigmoid×2 (增益范围[0,2])
  ↓
(R_gain, G_gain, B_gain)

2. 语义感知AWB

利用场景理解改进白平衡:

def semantic_aware_awb(image, segmentation):
    # 语义分割识别不同物体
    sky_mask = (segmentation == 'sky')
    skin_mask = (segmentation == 'person')
    foliage_mask = (segmentation == 'vegetation')
    
    # 基于先验知识的色彩约束
    constraints = []
    if sky_mask.any():
        # 天空应偏蓝,色温>6000K
        constraints.append(('sky', sky_mask, (0.9, 1.0, 1.1)))
    
    if skin_mask.any():
        # 肤色保护,避免过度校正
        constraints.append(('skin', skin_mask, get_skin_prior()))
    
    # 优化满足多约束的白平衡
    return optimize_with_constraints(image, constraints)

3. 自监督学习方法

利用时间/空间一致性:

4. 元学习(Meta-Learning)

快速适应新场景:

class MetaAWB:
    def __init__(self):
        self.base_model = load_pretrained()
        self.adaptation_params = []
    
    def adapt(self, few_shots):
        # 使用少量样本快速适应
        gradients = compute_gradients(few_shots)
        self.adaptation_params = self.base_model.params - lr * gradients
    
    def predict(self, image):
        return self.base_model(image, self.adaptation_params)

5. 对抗生成网络(GAN)方法

训练判别器区分正确白平衡的图像:

性能对比

方法 准确度 速度 内存 鲁棒性
灰世界 70% <1ms <1MB
白点检测 75% 2ms <1MB
色温估计 80% 5ms 2MB
CNN 90% 10ms 20MB
语义感知 93% 30ms 50MB 很高

手机ISP的实际实现

现代手机通常采用混合策略:

  1. 快速路径:预览时使用简单算法
  2. 精确路径:拍照时使用复杂算法
  3. 场景检测:根据场景选择算法
  4. 用户反馈学习:记录用户手动调整习惯

Rule of thumb

4.6 RAW格式与色彩处理

RAW格式保存传感器的原始数据,为色彩处理提供最大灵活性。与JPEG的8位色深相比,RAW通常提供12-14位色深,保留了更多的色彩和亮度信息。手机摄影中,RAW格式让专业用户能够绕过手机ISP的自动处理,实现精确的色彩控制。

4.6.1 RAW数据结构与DNG格式

RAW文件包含未经处理的传感器数据,保持拜耳阵列的原始形式。

RAW文件基本结构

  1. 文件头(Header):元数据信息
  2. 拜耳数据(Bayer Data):原始像素值
  3. 缩略图(Thumbnail):快速预览用JPEG
  4. EXIF数据:拍摄参数
  5. 制造商数据:专有处理参数

DNG (Digital Negative)格式

Adobe开发的开放RAW标准,基于TIFF/EP规范:

DNG文件结构
┌────────────────────────┐
│    IFD0 (主图像)        │
│  ├─ 图像宽度/高度       │
│  ├─ 位深度             │
│  ├─ CFA模式            │
│  └─ 数据偏移           │
├────────────────────────┤
│    SubIFD (子图像)      │
│  ├─ 缩略图             │
│  └─ 预览图             │
├────────────────────────┤
│    RAW数据块           │
│  └─ 压缩/未压缩数据    │
├────────────────────────┤
│    色彩配置文件         │
│  ├─ 色彩矩阵           │
│  └─ 校准数据           │
└────────────────────────┘

关键DNG标签

数据组织方式

# 拜耳数据读取示例
def read_raw_data(dng_file):
    # 读取拜耳模式数据(16位整数)
    raw_data = np.frombuffer(data, dtype=np.uint16)
    raw_data = raw_data.reshape(height, width)
    
    # 黑电平校正
    black_level = metadata['BlackLevel']
    white_level = metadata['WhiteLevel']
    
    # 归一化到[0,1]
    normalized = (raw_data - black_level) / (white_level - black_level)
    normalized = np.clip(normalized, 0, 1)
    
    return normalized

压缩方式

压缩率对比: | 压缩方式 | 文件大小 | 质量损失 | 处理速度 | |———|———|———|———-| | 未压缩 | 100% | 无 | 最快 | | 无损压缩 | 40-60% | 无 | 快 | | 有损压缩 | 20-30% | 极小 | 中等 |

4.6.2 线性与非线性色彩空间

理解线性和非线性色彩空间的区别对RAW处理至关重要。

线性空间: 传感器捕获的光子数与数字值成正比: \(D = k \cdot \Phi\) 其中$D$是数字值,$\Phi$是光子通量,$k$是增益系数。

特点:

伽马校正(Gamma Correction)

人眼感知亮度近似对数关系,需要非线性变换: \(V_{out} = V_{in}^{\gamma}\)

标准伽马值:

色彩空间处理流程

传感器(线性) → 去马赛克 → 色彩矩阵 → 伽马校正 → 显示(非线性)
     ↓            ↓          ↓           ↓            ↓
  14-bit RAW   线性RGB    线性sRGB    sRGB        8-bit JPEG

线性空间的优势

  1. 精确的色彩混合
    # 线性空间混合
    result_linear = 0.5 * color1_linear + 0.5 * color2_linear
       
    # 非线性空间混合(错误)
    result_wrong = 0.5 * color1_srgb + 0.5 * color2_srgb
    
  2. 正确的曝光调整: 线性空间:$I_{adjusted} = I_{original} \cdot 2^{EV}$

  3. 准确的模糊/锐化: 卷积操作应在线性空间进行

对数编码(Log Encoding)

电影行业常用,最大化动态范围:

手机中的应用: \(V_{log} = c \cdot \log_{10}(a \cdot V_{linear} + b) + d\)

参数选择影响动态范围分配。

4.6.3 色彩矩阵与色彩校准

色彩矩阵将传感器RGB转换到标准色彩空间。

基本色彩矩阵变换: \(\begin{bmatrix} R_{sRGB} \\ G_{sRGB} \\ B_{sRGB} \end{bmatrix} = M_{3×3} \cdot \begin{bmatrix} R_{sensor} \\ G_{sensor} \\ B_{sensor} \end{bmatrix}\)

色彩矩阵优化

目标:最小化色差 \(E = \sum_{i=1}^{N} \|C_{reference,i} - M \cdot C_{sensor,i}\|^2\)

使用24色ColorChecker标定:

def calibrate_color_matrix(sensor_values, reference_values):
    # sensor_values: N×3 传感器RGB值
    # reference_values: N×3 标准sRGB值
    
    # 最小二乘法求解
    M = np.linalg.lstsq(sensor_values, reference_values, rcond=None)[0]
    
    # 确保矩阵行和为1(保持亮度)
    for i in range(3):
        M[i,:] = M[i,:] / np.sum(M[i,:])
    
    return M

双光源色彩矩阵

DNG支持两个校准光源的色彩矩阵:

def interpolate_color_matrix(CCT, CCT1, M1, CCT2, M2):
    # 倒数色温空间插值(Mired空间)
    mired = 1e6 / CCT
    mired1 = 1e6 / CCT1
    mired2 = 1e6 / CCT2
    
    # 线性插值
    t = (mired - mired1) / (mired2 - mired1)
    t = np.clip(t, 0, 1)
    
    return (1-t) * M1 + t * M2

前向矩阵(Forward Matrix)

从相机原生空间到XYZ的精确变换: \(XYZ = FM \cdot (CM \cdot RGB_{sensor})\)

其中:

色彩查找表(3D LUT)

非线性色彩映射,克服矩阵变换的限制:

3D LUT结构(17×17×17)
┌─────────────────┐
│  R轴 (17点)      │
│  ├─G轴 (17点)    │
│  │ └─B轴 (17点)  │
│  │   └─输出RGB   │
└─────────────────┘

优势:

Hue/Saturation映射

保持色调的饱和度调整: \(\begin{cases} H' = H + \Delta H(H) \\ S' = S \cdot k_S(H) \\ L' = L \end{cases}\)

其中$\Delta H$和$k_S$是色调相关的调整函数。

4.6.4 手机RAW的特点与限制

手机RAW相比相机RAW有独特的特点和限制。

手机RAW特点

  1. 小传感器特性
    • 像素尺寸:0.8-1.4μm(相机:3-8μm)
    • 更高的噪声水平
    • 有限的动态范围(10-12 EV)
    • 衍射限制更明显
  2. 计算RAW: 部分手机的”RAW”实际是多帧合成:
    def computational_raw(frames):
        # 对齐多帧
        aligned = align_frames(frames)
           
        # 时域降噪(保持线性)
        denoised = temporal_denoise(aligned)
           
        # 合并为单个RAW
        merged_raw = merge_to_bayer(denoised)
           
        # 保存为DNG
        save_as_dng(merged_raw, metadata)
    
  3. 嵌入式处理信息
    • 镜头校正参数
    • 降噪配置文件
    • HDR音调映射曲线
    • AI场景检测结果

限制与挑战

  1. 固定光圈限制
    • 无法调节景深
    • 衍射影响不可控
    • 依赖计算虚化
  2. 镜头像差
    手机镜头MTF曲线
    1.0 ┤
        │╲ 中心
    0.5 ┤ ╲___边缘
        │   ╲___
    0.0 ┤_____╲___
        └──────────
        0  50  100 lp/mm
    

    需要大量后期校正:

    • 畸变校正
    • 暗角补偿
    • 色差校正
    • 锐度不均匀性
  3. 色彩准确性
    • IR滤镜不完美
    • 微透镜串扰
    • 量子效率不均匀

手机RAW处理建议

  1. 降噪策略
    # 分离亮度和色度降噪
    def denoise_mobile_raw(raw):
        # 转换到YCbCr
        y, cb, cr = rgb_to_ycbcr(raw)
           
        # 亮度通道:保留细节
        y_denoised = nlmeans(y, h=0.1)
           
        # 色度通道:强降噪
        cb_denoised = bilateral(cb, sigma=2.0)
        cr_denoised = bilateral(cr, sigma=2.0)
           
        return ycbcr_to_rgb(y_denoised, cb_denoised, cr_denoised)
    
  2. 动态范围优化
    • 高光恢复:利用其他通道信息
    • 暗部提升:注意噪声控制
    • 局部音调映射:避免光晕
  3. 锐化处理
    • 去卷积锐化(Richardson-Lucy)
    • 自适应锐化(基于边缘检测)
    • 避免过度锐化伪影

专业应用流程

  1. Lightroom Mobile
    • 支持DNG直接编辑
    • 镜头配置文件校正
    • 高级色彩分级
  2. Snapseed
    • 基础RAW调整
    • 选择性编辑
    • 适合快速处理
  3. 第三方专业软件
    • Capture One:最佳色彩处理
    • DxO PhotoLab:优秀的降噪
    • RawTherapee:开源选择

Rule of thumb

4.7 专业模式下的色彩控制

4.7.1 手动白平衡调节技巧

4.7.2 色温与色调微调

4.7.3 自定义白平衡预设

4.7.4 混合光源场景处理

4.8 色彩优化实战

4.8.1 肤色还原优化

4.8.2 风景色彩增强

4.8.3 夜景色彩处理

4.8.4 HDR模式下的色彩映射

本章小结

常见陷阱与错误