2. 亮度与灰阶:Gamma校正原理、灰阶映射、亮度均匀性指标

好,我们直接进入正题。亮度与灰阶,说白了就是解决一个问题:你给像素一个数字,它到底该发多亮?

这听起来简单,但里面坑不少。我刚开始做OLED驱动的时候,就吃过亏——明明代码里写了均匀的灰阶值,屏幕上却暗部糊成一团,亮部又过曝。后来才明白,这背后是Gamma在作怪。

2.1 为什么需要Gamma校正?

人眼对亮度的感知,不是线性的。你想想看,在暗室里点一根蜡烛,感觉亮度翻倍了;但在大太阳底下再加一根蜡烛,你根本感觉不到变化。

这就是韦伯-费希纳定律:人眼对亮度的响应近似对数曲线。而显示器的发光特性,恰好是相反的幂律曲线。

核心公式:

显示亮度 = (输入灰阶 / 最大灰阶) ^ Gamma

标准Gamma值 = 2.2(大多数显示设备)

如果不做校正,直接线性映射灰阶,你会看到暗部细节丢失、中间调偏暗、整体对比度失调。我见过不少刚入行的工程师,花了两周调色彩,最后发现只是Gamma没设对。

2.2 Gamma校正的两种实现方式

实际工程中,Gamma校正分两个层面:数字域和模拟域。

实现方式 原理 优点 缺点
数字Gamma 在查找表(LUT)中预计算校正后的灰阶值 灵活、可编程、精度高 占用存储空间、有量化误差
模拟Gamma 通过参考电压分压网络,直接改变像素驱动电压 响应快、无量化损失 硬件固定、难以动态调整

我个人习惯在量产项目中用数字Gamma + 小规模模拟微调的组合。为什么呢?因为OLED的亮度-电压曲线会随温度漂移,纯模拟方案很难补偿。

2.3 灰阶映射:从8bit到10bit,够用吗?

标准8bit灰阶是256级。但OLED的亮度范围很宽,从0.001 nit到1000 nit,256级根本不够用。

举个例子:在低亮度区域,相邻灰阶的亮度差如果超过人眼可分辨的阈值(约1%),就会出现灰阶断层——平滑渐变变成一条条色带。

我的经验:

我曾经在一个高端显示器项目里,坚持把驱动IC从8bit换成10bit。当时硬件团队觉得没必要,说成本高了20%。结果样机出来,8bit版本在暗部渐变测试中肉眼可见条纹,10bit版本完全平滑。从那以后,我再也没在OLED项目里用过8bit驱动。

灰阶映射的流程,我一般这样走:

  1. 输入归一化:将输入灰阶映射到[0.0, 1.0]区间
  2. Gamma预补偿:应用Gamma=2.2的逆变换,即 输出 = 输入 ^ (1/2.2)
  3. 量化:根据驱动IC的bit深度,将浮点值映射到整数灰阶
  4. 抖动处理:如果bit深度不够,用空间或时间抖动来模拟中间灰阶
// 一个简化的Gamma校正LUT生成示例(C语言风格)
// 假设10bit DAC,1024级灰阶
uint16_t gamma_lut[1024];
for (int i = 0; i < 1024; i++) {
    float normalized = (float)i / 1023.0f;
    float corrected = powf(normalized, 1.0f / 2.2f);
    gamma_lut[i] = (uint16_t)(corrected * 1023.0f + 0.5f);
}

2.4 亮度均匀性指标:别让屏幕变成“花脸”

OLED有个天生的痛点:亮度均匀性。同一片玻璃基板上,不同位置的像素,发光效率可能差5%~15%。

行业里用两个指标来量化:

  • U'(均匀性):全屏白场下,最亮区域与最暗区域的亮度比值。一般要求 < 1.3(即最暗不低于最亮的77%)
  • ΔU'(局部均匀性):相邻5×5像素块之间的亮度差异。要求 < 2%

注意:

均匀性测试必须在暗室中进行,环境光 < 1 lux。我曾经见过一个团队在普通办公室测均匀性,结果环境光反射导致数据完全失真,白白浪费了两周调试时间。

影响均匀性的因素,我列了个清单:

因素 影响程度 典型表现
TFT阈值电压漂移 高 低灰阶下出现横纹/竖纹
OLED材料老化 中 长时间显示后出现残影
IR Drop(压降) 高 屏幕边缘比中心暗
制程工艺偏差 中 随机分布的亮斑或暗斑

2.5 光学补偿:把不均匀“算”回来

既然硬件做不到均匀,我们就用软件来补。这就是DeMura(去亮斑)技术。

基本思路是:

  1. 用高精度相机拍摄全屏白场、灰场、黑场图像
  2. 计算每个像素的亮度偏差系数
  3. 将补偿系数写入驱动IC的OTP(一次性可编程)存储器
  4. 显示时,驱动IC自动对每个像素的灰阶值做反向补偿

嗯,这里要注意:补偿系数不能超过驱动IC的bit深度限制。比如10bit驱动,最大补偿范围也就±512级,超出的话会削波。

补偿公式(简化版):

实际灰阶 = 目标灰阶 × (全局平均亮度 / 该像素亮度)

但实际工程中,还要考虑相邻像素的串扰和温度补偿,公式会更复杂。

2.6 知识结构总览

我把这一章的核心逻辑画成了图,方便你理解各部分的关系:

亮度与灰阶知识结构 亮度与灰阶 Gamma校正原理 人眼感知非线性 标准Gamma=2.2 数字域 vs 模拟域 灰阶映射 8bit → 10bit 演进 LUT预计算 抖动处理 亮度均匀性 U' 与 ΔU' 指标 IR Drop 影响 DeMura补偿 目标:人眼感知线性 + 全屏均匀 手段:Gamma校正 + 灰阶映射 + DeMura补偿

2.7 实战中的几个坑

最后,分享几个我踩过的坑,希望能帮你省点时间:

  • Gamma值不是死的:不同亮度下,最佳Gamma值会变。我建议在50nit、200nit、500nit三个亮度点分别测量,取加权平均。
  • 补偿系数要留余量:DeMura补偿不要做到极限,留5%~10%的余量给温度漂移和老化。
  • 测试条件要统一:亮度计的位置、角度、积分时间,每次测试必须一致。我习惯写一个自动化测试脚本,避免人为误差。
  • 别忘了黑场:OLED的“纯黑”其实也有微弱的漏光。黑场均匀性同样需要补偿,否则暗场景下会出现“脏屏”效果。

嗯,这一章的内容就到这里。亮度与灰阶是OLED显示质量的基石,搞懂了这些,后面的色彩管理和HDR就好办了。