3、光学补偿基础:Mura缺陷成因、DeMura原理、Demura流程
各位好,我是老赵。在OLED驱动这行摸爬滚打了十几年,今天咱们聊聊一个让所有面板厂又爱又恨的话题——Mura补偿。
你想想看,一块OLED屏,像素级发光,每个子像素的亮度、色度天生就有差异。工艺再牛,也做不到100%均匀。这就是Mura的根源。我当年在产线调试第一块柔性屏时,点亮后满屏的云斑纹,心里那个凉啊……后来才明白,没有DeMura,高端OLED根本没法量产。
3.1 Mura缺陷:它到底是什么?
Mura,日语里是“斑”的意思。说白了,就是显示画面上的局部亮度或颜色不均匀。它不是坏点,也不是线缺陷,而是那种“看着别扭”的云团状、条纹状或网格状的差异。
我习惯把Mura分成三类,这样在分析根因时思路更清晰:
| Mura类型 | 典型成因 | 表现特征 | 我踩过的坑 |
|---|---|---|---|
| 亮度Mura | TFT阈值电压漂移、OLED材料蒸镀厚度不均、EL老化 | 低灰阶下最明显,像水渍一样 | 曾有一批屏,低灰阶下全是“云斑”,查了两个月发现是蒸镀源距偏差 |
| 色度Mura | RGB发光材料寿命差异、CF光阻厚度不均、微腔效应 | 白画面下偏红或偏蓝,局部色温不一致 | 某次客户投诉白屏偏绿,最后定位是蓝色子像素的微腔深度偏了0.5nm |
| 条纹Mura | Gate驱动IC输出偏差、数据线RC延迟、Mask阴影效应 | 水平或垂直的明暗条纹 | FHD分辨率下,Gate线负载不均导致每隔32行出现一条暗带 |
3.2 DeMura原理:怎么把不均匀“抹平”?
DeMura的核心思想很简单:先测出每个像素的偏差,再反向补偿回去。但实现起来,门道很深。
我个人习惯把DeMura分为两个阶段:
- 测量阶段:用高精度相机拍下屏在不同灰阶下的亮度/色度分布,生成一张“偏差地图”。
- 补偿阶段:根据偏差地图,修改每个子像素的驱动数据,让最终发光均匀。
补偿的数学本质,其实就是一个查表映射。我举个例子:
// 伪代码:DeMura补偿核心逻辑
// 原始数据:8bit,0-255
// Mura偏差:-10% ~ +10%
for each pixel (x, y) {
// 读取该像素的偏差系数
float gain = mura_map[x][y]; // 0.9 ~ 1.1
// 补偿后的灰阶
int compensated = round(original_gray * (1.0 / gain));
// 钳位到有效范围
if (compensated > 255) compensated = 255;
if (compensated < 0) compensated = 0;
// 写入驱动IC
write_pixel(x, y, compensated);
}
你看,原理上就是乘一个倒数。但实际工程中,要考虑的东西多着呢:
- 灰阶非线性:OLED的Gamma曲线不是线性的,低灰阶补偿精度要求更高。我建议至少用64个灰阶点做标定。
- 温度漂移:Mura偏差会随温度变化。我曾经在冬天调试好的补偿参数,夏天一测全偏了。后来加了温度补偿系数。
- 视角依赖:大视角下的Mura和小视角不一样。高端产品会做多视角补偿。
3.3 DeMura流程:从产线到模组
完整的DeMura流程,我把它画成了一张流程图。你看完就明白为什么DeMura这么烧钱了——每一步都是精度和成本的博弈。
流程看着简单,但每个环节都有坑。我挑几个重点说说:
3.4 关键环节详解
第一步:面板点亮与老化
新出厂的OLED,电学特性还没稳定。直接拍Mura,数据不准。我建议至少老化30分钟,让TFT阈值电压和OLED发光效率稳定下来。产线上为了赶时间,经常只老化5分钟,结果补偿参数到了用户手里就变了。
第二步:多灰阶拍摄
相机选型很关键。我踩过最大的坑是用了普通工业相机,结果低灰阶下信噪比不够,Mura没拍到,反而把相机噪声补偿进去了。后来换了科学级CMOS,动态范围14bit以上,才算搞定。
拍摄灰阶的选择,我一般这样定:
- 低灰阶(0-63):每16阶拍一张,共4张
- 中灰阶(64-191):每32阶拍一张,共4张
- 高灰阶(192-255):拍1张255全白
总共9张,既能覆盖Gamma曲线拐点,又不会太慢。
第三步:Mura偏差提取
这一步的核心是“去背景”。拍出来的图像包含:面板Mura + 相机响应不均匀 + 环境光。我习惯用多项式拟合或高斯滤波做背景分离。举个例子:
// 背景分离算法(简化版)
// 输入:raw_image 拍摄的原始图像
// 输出:mura_map 纯Mura偏差
// 1. 低通滤波提取背景(相机+环境)
background = gaussian_blur(raw_image, sigma=50);
// 2. 相减得到Mura成分
mura_component = raw_image - background;
// 3. 归一化为增益系数
mura_map = mura_component / background;
这里sigma的选取很关键。选小了,会把Mura当背景滤掉;选大了,背景分离不干净。我一般根据Mura的空间频率来定——低频Mura用大sigma,高频Mura用小sigma。
第四步:补偿参数计算
算出mura_map后,要转成驱动IC能用的格式。不同IC厂家的格式不一样:
| 驱动IC厂商 | 补偿数据格式 | 存储方式 | 我遇到的坑 |
|---|---|---|---|
| 厂商A | 8bit增益系数,每像素1字节 | OTP烧录 | OTP容量有限,只能存4个灰阶的补偿 |
| 厂商B | 10bit偏移量,每像素2字节 | Flash外挂 | Flash读取速度跟不上,导致画面撕裂 |
| 厂商C | 分段线性拟合,每段2个系数 | 寄存器配置 | 拟合精度不够,低灰阶补偿有台阶感 |
第五步:烧录与验证
烧录完成后,一定要做二次验证。我见过最惨的一次,烧录器时序有问题,补偿数据写错了地址,结果整批屏补偿后Mura更严重了。所以验证环节不能省:
- 拍一张补偿后的全灰阶画面
- 计算均匀性指标(U'值或ΔE)
- 对比补偿前后的Mura幅度
验证通过的标准,我一般定在:补偿后亮度均匀性 < 3%,色度均匀性 Δu'v' < 0.003。达不到就返工。