3. Gamma 概念详解:数学定义、EOTF 与 Gamma 2.2/sRGB

Gamma 这个词,做显示的人天天挂在嘴边。但说实话,真正把它吃透的人不多。我见过不少硬件工程师,调了一辈子 Gamma,问起数学定义却支支吾吾。今天咱们就把这个硬骨头啃下来。

3.1 Gamma 的数学定义

Gamma 本质上是一个幂律函数。它的数学形式很简单:

V_out = (V_in) ^ γ

其中 V_in 是输入信号(归一化到 0~1),V_out 是输出亮度(也是 0~1),γ 就是 Gamma 值。

举个例子:

  • γ = 1.0 → 线性关系,输入多少输出多少
  • γ = 2.2 → 输入 0.5,输出 0.5^2.2 ≈ 0.217
  • γ = 0.45 → 输入 0.5,输出 0.5^0.45 ≈ 0.732

你想想看,γ 大于 1 会让暗部压缩、亮部拉伸;γ 小于 1 则反过来。这个特性,恰恰是 Gamma 校正的核心依据。

关键点:Gamma 不是「校正」本身,而是描述输入-输出关系的幂指数。Gamma 校正则是用逆函数去补偿这个非线性。

3.2 显示设备的电光转换函数(EOTF)

EOTF,全称 Electro-Optical Transfer Function。说白了,就是电信号怎么变成光信号的映射关系。

我在项目中遇到过一件事:某款 OLED 面板的 EOTF 曲线在低灰阶段严重偏离标准 Gamma 2.2。结果呢?暗部细节全丢了,客户投诉说「你们的屏幕黑成一团」。后来我们花了两个月重新校准 LUT,才把曲线拉回来。

EOTF 的通用表达式:

L = (V + c) ^ γ

其中 L 是亮度(cd/m²),V 是电压或数字码值,c 是偏移量(用于黑电平补偿)。

不同显示技术的 EOTF 差异很大:

显示技术 典型 EOTF 特性 Gamma 范围 备注
CRT 近似纯幂律 2.2 ~ 2.5 物理电子枪特性决定
LCD S 形曲线 + 背光补偿 1.8 ~ 2.4 需要 LUT 校正
OLED 低灰阶非线性明显 2.2 ~ 2.4 黑电平漂移需注意
投影 DLP 分段线性 + 伽马 2.0 ~ 2.6 灯泡老化影响大

避坑指南:我曾经在 LCD 项目中直接用 CRT 的 EOTF 模型去算 Gamma LUT,结果暗部偏色严重。不同技术的 EOTF 曲线形状差异很大,千万别偷懒套公式。

3.3 Gamma 2.2 标准

Gamma 2.2 是目前最主流的显示标准。为什么是 2.2?

历史原因:CRT 显示器的物理特性天然接近 Gamma 2.2~2.5。为了兼容性,行业逐渐把 2.2 定为基准。

实际效果:Gamma 2.2 在暗部有更好的细节保留,同时亮部过渡自然。我个人的经验是,Gamma 2.2 在大多数环境光下(300~500 lux)观感最舒适。

Gamma 2.2 的数学表达:

L_out = L_in ^ 2.2

逆校正函数:

L_in_corrected = L_in ^ (1/2.2) ≈ L_in ^ 0.4545

嗯,这里要注意:Gamma 2.2 是显示端的 EOTF,而编码端(比如相机、显卡)需要做 1/2.2 的预校正。两者配合,最终人眼看到的是线性光。

3.4 sRGB 标准中的 Gamma

sRGB 标准由微软和惠普在 1996 年联合制定。它并不是简单的 Gamma 2.2,而是分段函数。

sRGB 的 EOTF 定义:

if L_in ≤ 0.0031308:
    L_out = 12.92 * L_in
else:
    L_out = 1.055 * (L_in ^ (1/2.4)) - 0.055

为什么搞这么复杂?

  • 低灰阶段用线性:避免纯幂律在极暗处噪声放大
  • 高灰阶段用 Gamma 2.4:更接近 CRT 实际响应
  • 整体近似 Gamma 2.2:兼容主流显示设备

个人建议:做硬件调优时,sRGB 的分段 Gamma 比纯 Gamma 2.2 更实用。尤其是低灰阶的线性段,能有效抑制暗部量化噪声。我在 FPGA 实现中就用分段 LUT 替代了纯幂律查找表,效果立竿见影。

3.5 Gamma 2.2 与 sRGB 的对比

对比项 Gamma 2.2 sRGB
数学形式 纯幂律 分段函数(线性+幂律)
低灰阶处理 幂律压缩 线性映射(12.92 倍增益)
有效 Gamma 精确 2.2 约 2.2(实际 2.2~2.4 波动)
应用场景 传统 CRT、通用显示 Web、数字摄影、Windows
硬件实现 单 LUT 即可 需要分段 LUT 或混合计算

你可能会问:既然 sRGB 这么复杂,为什么还要用它?

答案很简单:兼容性。sRGB 是互联网和消费电子的默认色彩空间。如果你做的是消费级产品,sRGB 几乎是必选项。我在一个工业显示器项目中试过只用 Gamma 2.2,结果在浏览器里看图片偏灰——因为浏览器默认用 sRGB 解码。

3.6 知识结构图:Gamma 概念体系

Gamma 概念知识体系 Gamma 概念 数学定义 EOTF 行业标准 V_out = V_in ^ γ γ > 1 暗部压缩 电信号 → 光信号 CRT/LCD/OLED 差异 Gamma 2.2 sRGB 分段函数 核心要点 Gamma 是幂律指数,EOTF 是具体实现 Gamma 2.2 是纯幂律,sRGB 是分段近似 硬件调优需根据显示技术选择 EOTF 模型

3.7 硬件调优中的 Gamma 实践

讲完理论,说点实际的。在硬件调优中,Gamma 校正通常分三步走:

  1. 测量 EOTF 曲线:用色度计采集 0~255 灰阶的亮度数据
  2. 计算目标曲线:根据标准(Gamma 2.2 或 sRGB)生成理想 EOTF
  3. 生成校正 LUT:用实测曲线与目标曲线的偏差计算查找表

经验之谈:我曾经在 FPGA 上实现 Gamma 校正时,发现 8bit LUT 在低灰阶段量化误差太大。后来改用 10bit 内部精度 + 抖动处理,暗部平滑度明显提升。如果你做硬件设计,建议内部精度至少比输出位宽多 2bit。

最后提醒一句:Gamma 校正不是一劳永逸的。面板老化、温度变化、背光衰减都会导致 EOTF 漂移。定期校准,才是硬道理。