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驱动。
灰阶映射的流程,我一般这样走:
- 输入归一化:将输入灰阶映射到[0.0, 1.0]区间
- Gamma预补偿:应用Gamma=2.2的逆变换,即 输出 = 输入 ^ (1/2.2)
- 量化:根据驱动IC的bit深度,将浮点值映射到整数灰阶
- 抖动处理:如果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(去亮斑)技术。
基本思路是:
- 用高精度相机拍摄全屏白场、灰场、黑场图像
- 计算每个像素的亮度偏差系数
- 将补偿系数写入驱动IC的OTP(一次性可编程)存储器
- 显示时,驱动IC自动对每个像素的灰阶值做反向补偿
嗯,这里要注意:补偿系数不能超过驱动IC的bit深度限制。比如10bit驱动,最大补偿范围也就±512级,超出的话会削波。
补偿公式(简化版):
实际灰阶 = 目标灰阶 × (全局平均亮度 / 该像素亮度)
但实际工程中,还要考虑相邻像素的串扰和温度补偿,公式会更复杂。
2.6 知识结构总览
我把这一章的核心逻辑画成了图,方便你理解各部分的关系:
2.7 实战中的几个坑
最后,分享几个我踩过的坑,希望能帮你省点时间:
- Gamma值不是死的:不同亮度下,最佳Gamma值会变。我建议在50nit、200nit、500nit三个亮度点分别测量,取加权平均。
- 补偿系数要留余量:DeMura补偿不要做到极限,留5%~10%的余量给温度漂移和老化。
- 测试条件要统一:亮度计的位置、角度、积分时间,每次测试必须一致。我习惯写一个自动化测试脚本,避免人为误差。
- 别忘了黑场:OLED的“纯黑”其实也有微弱的漏光。黑场均匀性同样需要补偿,否则暗场景下会出现“脏屏”效果。
嗯,这一章的内容就到这里。亮度与灰阶是OLED显示质量的基石,搞懂了这些,后面的色彩管理和HDR就好办了。