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 概念体系
3.7 硬件调优中的 Gamma 实践
讲完理论,说点实际的。在硬件调优中,Gamma 校正通常分三步走:
- 测量 EOTF 曲线:用色度计采集 0~255 灰阶的亮度数据
- 计算目标曲线:根据标准(Gamma 2.2 或 sRGB)生成理想 EOTF
- 生成校正 LUT:用实测曲线与目标曲线的偏差计算查找表
经验之谈:我曾经在 FPGA 上实现 Gamma 校正时,发现 8bit LUT 在低灰阶段量化误差太大。后来改用 10bit 内部精度 + 抖动处理,暗部平滑度明显提升。如果你做硬件设计,建议内部精度至少比输出位宽多 2bit。
最后提醒一句:Gamma 校正不是一劳永逸的。面板老化、温度变化、背光衰减都会导致 EOTF 漂移。定期校准,才是硬道理。