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域再做。因为不同颜色通道的黑电平可能不同,分开校正才能保证颜色准确。
实际项目中,黑电平校正通常分两步:
- 静态校正:读取Sensor OTP(一次性可编程)中存储的黑电平值,或者通过全黑帧计算平均值。
- 动态校正:根据当前增益和温度,查表或插值得到实时黑电平值。
我曾经在一个低光项目中,发现暗部偏色严重。排查到最后,发现是黑电平校正没考虑增益变化。增益提高后,黑电平也跟着漂了,但校正值没变。结果就是暗部颜色完全跑偏。
2.3 镜头阴影校正:还你一个均匀的亮度
镜头阴影,也叫Lens Shading。说白了,就是镜头中心亮、四周暗。这是物理光学决定的——镜头边缘的光线入射角大,到达Sensor的光量自然少。
校正方法也不复杂:给每个像素乘上一个增益系数。中心区域增益小,边缘区域增益大。
但这里有个关键点——不同颜色通道的阴影程度不一样。因为不同波长的光在镜头中的折射率不同,导致红色和蓝色的阴影曲线不同。所以校正时,R、Gr、Gb、B四个通道要分开处理。
技术要点:镜头阴影校正通常使用网格增益表。Sensor厂商会提供一张网格图,每个网格点对应一个增益值。ISP在运行时,对网格之间的像素进行双线性插值。
网格的密度很讲究。网格太稀疏,校正后会出现明显的“块状”不均匀;网格太密,存储开销大,而且容易把Sensor本身的瑕疵也校正进去。
| 网格密度 | 优点 | 缺点 |
|---|---|---|
| 5x5 | 存储小,计算快 | 校正精度低,边缘可能不均匀 |
| 9x9 | 精度适中,主流方案 | 存储和计算可接受 |
| 17x17 | 精度高,适合大Sensor | 存储大,调试复杂 |
避坑指南:我曾经遇到一个项目,镜头阴影校正后画面出现“彩虹纹”。排查发现是R和B通道的增益表没对齐,导致边缘颜色偏紫。后来把四个通道的增益曲线统一做了平滑处理,问题才解决。
2.4 坏点校正:把“死像素”藏起来
Sensor在生产过程中,难免会有一些像素点“坏掉”。坏点分两种:
- 死点:永远输出0或固定值,不响应光线。
- 亮点:永远输出最大值,看起来像一颗星星。
坏点校正的原理很简单:用周围像素的值来替换坏点。但难点在于——如何准确检测出坏点?
常用的检测方法有两种:
- 静态坏点表:在产线上拍一张均匀亮度的图,记录下所有异常像素的坐标。这种方法准确,但需要产线支持。
- 动态坏点检测:在ISP运行时,实时判断当前像素是否异常。比如,如果某个像素的值与周围8个像素的平均值相差超过阈值,就认为是坏点。
注意:动态坏点检测容易误判。比如画面中的高光点、细线条,都可能被当成坏点。阈值设得太严,会把正常细节抹掉;设得太松,坏点又去不掉。这个平衡需要反复调试。
我个人的习惯是:先用静态坏点表把已知的坏点去掉,再用动态检测做补充。这样既能保证准确率,又能覆盖Sensor老化后新出现的坏点。
2.5 本章知识体系
下面这张图,把今天讲的四个模块串起来了。你可以看到它们在RAW域中的位置和关系。
嗯,这四个模块看起来各自独立,但实际上环环相扣。黑电平校正没做好,镜头阴影校正的增益系数就会算错;坏点校正放在最后,是因为前面的校正可能会改变坏点的特征值,影响检测准确率。