2、RAW域基础:Bayer阵列原理、黑电平校正、镜头阴影校正、坏点校正

各位好,欢迎来到第二章。上一章我们聊了ISP的整体流水线,今天咱们把镜头拉近,聚焦在RAW域最前端的几个基础模块。

说白了,Sensor送出来的原始数据,就是RAW图。但这玩意儿可不是一张能直接看的照片。它里面藏着很多“脏东西”——黑电平偏移、镜头带来的亮度不均、还有Sensor本身的坏点。如果不处理,后面再怎么调都是白搭。

我个人习惯把RAW域处理比作“打地基”。地基没打好,楼盖得再高也是危房。今天我们就来拆解这四个地基模块:Bayer阵列、黑电平校正、镜头阴影校正、坏点校正。

2.1 Bayer阵列:Sensor眼中的世界

为什么叫Bayer阵列?因为大部分手机Sensor的像素排列,都遵循这个模式。每个像素只能感知一种颜色——红、绿或蓝。你想想看,一个2000万像素的Sensor,其实只有500万个红色像素、500万个蓝色像素、1000万个绿色像素。

为什么绿色多一倍?因为人眼对绿色最敏感。Sensor厂商们很聪明,用这种排列来模拟人眼的视觉特性。

核心概念:Bayer阵列不是全彩图,而是马赛克。每个像素点只有一种颜色信息,缺失的另外两种颜色需要靠后面的“去马赛克”模块插值出来。

常见的Bayer模式有四种:RGGB、BGGR、GRBG、GBRG。区别就在于左上角第一个像素是什么颜色。调试时一定要确认清楚,否则颜色会完全错乱。

Bayer模式 左上角像素 常见Sensor厂商
RGGB R Sony(大部分)
BGGR B 部分OmniVision
GRBG G 部分Samsung
GBRG G 较少见

我的经验:有一次项目调试,画面颜色偏紫,查了半天发现是Bayer模式配错了。Sensor文档写的是RGGB,但驱动里配成了BGGR。这种低级错误,排查起来最费时间。建议拿到新Sensor后,先拍一张纯色图验证一下排列。

2.2 黑电平校正:把“零”找回来

什么是黑电平?理论上,Sensor完全遮光时,输出应该是0。但实际不是。因为Sensor的模拟电路有暗电流,即使没光,也会读出一定的电压值。这个值就是黑电平。

黑电平校正的目的很简单:把不该有的底噪减掉,让黑色真正变成0。

校正公式也很直接:

校正后像素值 = 原始像素值 - 黑电平值

但这里有个坑——黑电平值不是固定的。它会随着温度、增益、曝光时间变化。我见过一些方案直接写死一个固定值,结果在高温下画面发绿,低温下画面发紫。

注意:黑电平校正必须在Bayer域进行,不能等到RGB域再做。因为不同颜色通道的黑电平可能不同,分开校正才能保证颜色准确。

实际项目中,黑电平校正通常分两步:

  1. 静态校正:读取Sensor OTP(一次性可编程)中存储的黑电平值,或者通过全黑帧计算平均值。
  2. 动态校正:根据当前增益和温度,查表或插值得到实时黑电平值。

我曾经在一个低光项目中,发现暗部偏色严重。排查到最后,发现是黑电平校正没考虑增益变化。增益提高后,黑电平也跟着漂了,但校正值没变。结果就是暗部颜色完全跑偏。

2.3 镜头阴影校正:还你一个均匀的亮度

镜头阴影,也叫Lens Shading。说白了,就是镜头中心亮、四周暗。这是物理光学决定的——镜头边缘的光线入射角大,到达Sensor的光量自然少。

校正方法也不复杂:给每个像素乘上一个增益系数。中心区域增益小,边缘区域增益大。

但这里有个关键点——不同颜色通道的阴影程度不一样。因为不同波长的光在镜头中的折射率不同,导致红色和蓝色的阴影曲线不同。所以校正时,R、Gr、Gb、B四个通道要分开处理。

技术要点:镜头阴影校正通常使用网格增益表。Sensor厂商会提供一张网格图,每个网格点对应一个增益值。ISP在运行时,对网格之间的像素进行双线性插值。

网格的密度很讲究。网格太稀疏,校正后会出现明显的“块状”不均匀;网格太密,存储开销大,而且容易把Sensor本身的瑕疵也校正进去。

网格密度 优点 缺点
5x5 存储小,计算快 校正精度低,边缘可能不均匀
9x9 精度适中,主流方案 存储和计算可接受
17x17 精度高,适合大Sensor 存储大,调试复杂

避坑指南:我曾经遇到一个项目,镜头阴影校正后画面出现“彩虹纹”。排查发现是R和B通道的增益表没对齐,导致边缘颜色偏紫。后来把四个通道的增益曲线统一做了平滑处理,问题才解决。

2.4 坏点校正:把“死像素”藏起来

Sensor在生产过程中,难免会有一些像素点“坏掉”。坏点分两种:

  • 死点:永远输出0或固定值,不响应光线。
  • 亮点:永远输出最大值,看起来像一颗星星。

坏点校正的原理很简单:用周围像素的值来替换坏点。但难点在于——如何准确检测出坏点?

常用的检测方法有两种:

  1. 静态坏点表:在产线上拍一张均匀亮度的图,记录下所有异常像素的坐标。这种方法准确,但需要产线支持。
  2. 动态坏点检测:在ISP运行时,实时判断当前像素是否异常。比如,如果某个像素的值与周围8个像素的平均值相差超过阈值,就认为是坏点。

注意:动态坏点检测容易误判。比如画面中的高光点、细线条,都可能被当成坏点。阈值设得太严,会把正常细节抹掉;设得太松,坏点又去不掉。这个平衡需要反复调试。

我个人的习惯是:先用静态坏点表把已知的坏点去掉,再用动态检测做补充。这样既能保证准确率,又能覆盖Sensor老化后新出现的坏点。

2.5 本章知识体系

下面这张图,把今天讲的四个模块串起来了。你可以看到它们在RAW域中的位置和关系。

RAW域基础处理流程 Sensor RAW数据 Bayer模式解析 黑电平校正 镜头阴影校正 坏点校正 校正后RAW数据 注意: 所有校正必须在Bayer域 完成,不能提前去马赛克。 顺序不可颠倒: 先解析Bayer模式, 再校正黑电平,然后做 镜头阴影,最后去坏点。

嗯,这四个模块看起来各自独立,但实际上环环相扣。黑电平校正没做好,镜头阴影校正的增益系数就会算错;坏点校正放在最后,是因为前面的校正可能会改变坏点的特征值,影响检测准确率。