3、Gamma校正原理:Gamma曲线数学定义、显示设备非线性特性、Gamma编码与解码

Gamma校正(Gamma Correction)是色彩管理中最基础、最核心的非线性变换。它起源于CRT(阴极射线管)显示器的物理特性,并延续至今成为整个数字成像与显示系统的标准环节。理解Gamma曲线的数学定义、显示设备的非线性响应以及编码/解码流程,是配置DRM CRTC Gamma LUT的前提。

3.1 Gamma曲线的数学定义

Gamma曲线本质上是一个幂律函数(Power-Law Function),其数学表达式为:

V_out = A × (V_in)^γ

其中:

  • V_in:输入信号(归一化到 [0, 1] 区间)
  • V_out:输出信号(归一化到 [0, 1] 区间)
  • γ (Gamma):幂指数,决定曲线的弯曲程度
  • A:增益系数(通常为1.0,用于调整整体亮度)

当 γ = 1 时,曲线为线性直线(V_out = V_in)。当 γ > 1 时,曲线向下弯曲(压缩暗部、拉伸亮部);当 γ < 1 时,曲线向上弯曲(拉伸暗部、压缩亮部)。

关键概念: Gamma值决定了输入与输出之间的映射关系。在显示系统中,通常使用 γ ≈ 2.2 作为标准显示Gamma,而编码Gamma(如sRGB)则使用 γ ≈ 1/2.2 ≈ 0.45 进行预补偿。
数学特性: Gamma曲线是单调递增函数,保证输入信号的亮度顺序在输出中保持不变。同时,它在暗部区域的斜率较大,意味着对暗部细节的编码效率更高。
不同Gamma值下的幂律曲线对比 输入信号 (V_in) 输出信号 (V_out) 0 0.5 1.0 0 0.5 1.0 γ = 1.0 (线性) γ = 2.2 (显示) γ = 0.45 (编码) 显示Gamma (γ=2.2) 压缩暗部;编码Gamma (γ=0.45) 拉伸暗部,两者互为逆运算

3.2 显示设备的非线性特性

所有物理显示设备(CRT、LCD、OLED、投影仪)都具有固有的非线性光电转换特性。这意味着输入的数字信号强度与屏幕实际发出的光强度之间不是简单的线性关系。

3.2.1 CRT显示器的物理Gamma

CRT显示器的发光强度由电子枪的加速电压控制,其物理关系近似为:

Luminance ∝ (Voltage)^γ_crt

其中 γ_crt 通常在 2.2 ~ 2.5 之间。这意味着如果输入电压线性增加,屏幕亮度会以幂律方式增长,导致暗部区域亮度变化缓慢,亮部区域变化剧烈。

3.2.2 LCD/OLED的Gamma特性

现代LCD和OLED显示器虽然物理原理不同,但为了兼容已有的视频标准和色彩空间,其电光转换函数(EOTF)仍然被设计为近似 Gamma 2.2 曲线。部分高端显示器支持硬件校准,可以切换不同的Gamma曲线(如 sRGB、DCI-P3、BT.1886)。

常见显示设备的Gamma特性对比
设备类型 物理Gamma范围 标准EOTF 备注
CRT显示器 2.2 ~ 2.5 Gamma 2.2 原始物理特性,无补偿
LCD显示器 2.0 ~ 2.4 Gamma 2.2 / sRGB 通过液晶分子扭转控制透光率
OLED显示器 2.2 ~ 2.4 Gamma 2.2 / BT.1886 自发光像素,黑位更低
投影仪 2.0 ~ 2.6 Gamma 2.2 / 2.4 受环境光影响较大
注意: 显示设备的非线性特性是Gamma校正存在的根本原因。如果不进行校正,图像在显示器上会出现暗部细节丢失(太暗)或亮部过曝(太亮)的问题。DRM CRTC中的Gamma LUT正是用来补偿这种非线性的。
显示设备非线性响应示意图 输入信号 0.2 0.4 0.6 0.8 1.0 显示设备 非线性EOTF γ ≈ 2.2 输出亮度 0.04 (暗部压缩) 0.16 0.36 0.64 1.00 (亮部拉伸) 输入信号0.2 → 输出亮度0.04(暗部被压缩);输入信号1.0 → 输出亮度1.00(亮部线性) 这种非线性导致暗部细节损失,需要通过Gamma校正进行预补偿

3.3 Gamma编码与解码

为了在有限的比特深度(如8bit、10bit)内更高效地存储和传输亮度信息,人眼对暗部变化更敏感的特性被利用起来。Gamma编码在信号源端对线性光信号进行预扭曲,Gamma解码在显示端进行逆扭曲,从而在整体上恢复线性光感知。

3.3.1 Gamma编码(Encoding Gamma)

编码Gamma通常在相机、渲染引擎或图像编码器中执行。它将线性场景光信号转换为非线性编码信号:

V_encoded = (V_linear)^(1/γ_display)

对于标准sRGB色彩空间,编码Gamma近似为 1/2.2 ≈ 0.45,并在接近0的区域使用线性段以避免无穷大斜率:

V_srgb = 
  12.92 × V_linear,                    当 V_linear ≤ 0.0031308
  1.055 × (V_linear)^(1/2.4) - 0.055,  当 V_linear > 0.0031308

3.3.2 Gamma解码(Decoding Gamma)

解码Gamma在显示设备或驱动中执行。它将接收到的非线性编码信号转换为驱动显示面板的线性光信号:

V_linear = (V_encoded)^γ_display

在DRM CRTC驱动中,Gamma解码通常通过硬件Gamma LUT实现。LUT的每个条目存储了从编码值到线性值的映射结果。

Gamma编码与解码对比
特性 Gamma编码 Gamma解码
执行位置 信号源端(相机、GPU渲染、图像编码) 显示端(显示器、CRTC Gamma LUT)
数学形式 V_out = V_in^(1/γ) V_out = V_in^γ
典型γ值 1/2.2 ≈ 0.45 (sRGB) 2.2 (标准显示)
作用 分配更多比特给暗部,减少量化噪声 恢复线性光,补偿显示设备非线性
DRM实现 通常由用户空间或GPU着色器完成 CRTC Gamma LUT / Degamma LUT
核心要点: Gamma编码与解码互为逆运算。编码时使用 1/γ,解码时使用 γ。两者结合后,整体系统响应恢复为线性(V_out = V_in),从而保证图像从采集到显示的全链路亮度保真度。
Gamma编码与解码全链路流程图 场景线性光 V_linear Gamma编码 V_enc = V_lin^(1/γ) γ ≈ 2.2 编码信号 8bit / 10bit Gamma解码 V_lin = V_enc^γ CRTC Gamma LUT 显示线性光 V_linear Gamma编码与解码全链路 场景线性光 → 编码(1/γ) → 存储/传输 → 解码(γ) → 显示线性光 编码与解码互为逆运算,整体系统响应恢复为线性:V_out = (V_lin^(1/γ))^γ = V_lin

3.4 Gamma校正与DRM CRTC的关联

在DRM/KMS框架中,CRTC的Gamma LUT(查找表)直接实现了Gamma解码功能。当用户空间设置CRTC Gamma LUT时,驱动将LUT数据加载到硬件寄存器中,硬件在扫描输出过程中对每个像素的RGB值进行查表映射。

  • 硬件Gamma LUT:通常为256条目(8bit)或1024条目(10bit),每个条目包含R、G、B三个通道的映射值。
  • 软件Gamma LUT:通过 drm_crtc_set_gamma() 或 drm_mode_gamma_set_ioctl() 接口设置,驱动负责将用户空间数据转换为硬件格式。
  • Degamma LUT:部分硬件支持独立的Degamma阶段,用于在Gamma校正之前进行额外的色彩空间转换(如从sRGB到线性RGB)。
实践建议: 在编写DRM CRTC驱动时,如果硬件支持可编程Gamma LUT,建议默认加载sRGB Gamma曲线(γ=2.2)。对于HDR内容,则需要加载PQ(ST.2084)或HLG曲线,这些曲线不是简单的幂律函数,而是更复杂的感知量化曲线。