RAW图基础:Bayer阵列、RAW格式与关键校正
各位同学,今天我们来聊聊ISP流水线的起点——RAW图。说白了,RAW图就是传感器最原始的“底片”,后面所有的处理都从这里开始。我做了这么多年ISP,发现很多问题追根溯源,其实都是RAW阶段没处理好。
Bayer阵列模式:传感器的“像素棋盘”
传感器上的每个像素只能感知光的强度,分不清颜色。那彩色照片怎么来的?靠的是在像素表面覆盖一层彩色滤光片阵列,也就是Bayer阵列。最常见的模式就是RGGB。
核心概念:每个2x2的像素单元里,有1个红色(R)、2个绿色(G)、1个蓝色(B)像素。人眼对绿色最敏感,所以绿色采样率是红蓝的两倍。
我刚开始接触这个的时候,总觉得RGGB太浪费——明明有四个像素,却只采三种颜色。后来才明白,这是人类视觉系统的妥协方案。
常见Bayer模式对比
| 模式 | 排列方式 | 典型应用 | 特点 |
|---|---|---|---|
| RGGB | R/G/G/B | 绝大多数手机、相机 | 标准模式,兼容性好 |
| RCCB | R/C/C/B | 安防、夜视 | 两个C(透明)像素进光量更大,暗光性能好 |
| RYYB | R/Y/Y/B | 华为部分机型 | 黄色滤光片透光率更高,但偏色校正复杂 |
我在项目中遇到过RYYB的坑。有一次调试华为平台的摄像头,发现拍出来的照片总是偏黄。查了半天,原来是RYYB的demosaic算法没适配好。说白了,黄色像素同时响应红光和绿光,传统算法直接套用会出问题。
避坑指南:我曾经接手过一个项目,客户把RGGB的ISP参数直接套在RCCB传感器上。结果暗光下噪点爆炸,亮光下颜色全偏。记住:换了Bayer模式,ISP流水线里的黑电平、增益、demosaic模块都得重新调。
RAW10/RAW12/RAW16:位深度的选择
传感器输出的原始数据,每个像素用多少比特来表示,这就是位深度。常见的就三种:RAW10、RAW12、RAW16。
你想想看,位深度决定了什么?动态范围和量化精度。位数越多,能区分的亮度等级就越多。
| 格式 | 每像素位数 | 亮度等级 | 典型场景 |
|---|---|---|---|
| RAW10 | 10 bit | 1024 | 低端手机、视频预览 |
| RAW12 | 12 bit | 4096 | 主流手机、安防 |
| RAW16 | 16 bit | 65536 | 专业相机、医疗影像 |
我个人习惯,做手机ISP项目时至少用RAW12。为什么?因为后面的黑电平校正、增益、去噪都会损失位深,如果起点只有10bit,处理完可能只剩8bit有效数据,画质根本不够用。
小技巧:高通平台里,RAW12的数据在内存中通常按16bit对齐存储。也就是说,每个像素占2字节,但高4位是无效的。写代码时记得做位操作,别把垃圾数据带进去。
黑电平与动态范围
黑电平是什么?传感器在完全无光的情况下,理论上应该输出0。但实际因为暗电流、电路噪声等原因,会有一个基础偏移值。这个偏移就是黑电平。
我举个例子:假设传感器黑电平是64(12bit RAW),那么像素值范围就不是0~4095,而是64~4095。如果不减去这个偏移,暗部细节就全被抬高了,画面发灰。
校正公式:校正后像素值 = 原始像素值 - 黑电平值
动态范围呢?说白了就是传感器能同时记录的最亮和最暗区域的比值。动态范围越大,高光不过曝、暗部不死黑。
我记得有一次调试夜景模式,发现暗部噪点特别多。查了半天,原来是黑电平校正没做对,导致暗部信号被压缩了。校正之后,动态范围直接提升了1.5档。
黑电平校正的两种方式
- 全局黑电平:整个传感器用一个固定值。简单,但精度一般。
- 行/列黑电平:每行或每列单独计算。精度高,但需要额外存储。
高通平台里,我建议用行黑电平。虽然多占点内存,但能有效消除行噪声。尤其是暗光下,行噪声特别明显。
暗角与镜头阴影校正
你有没有发现,很多照片四周比中心暗?这就是暗角,也叫镜头阴影。原因很简单:镜头中心进光量大,边缘进光量小。
校正方法也不复杂——给每个像素乘一个增益系数。中心区域增益接近1,边缘区域增益大于1。
注意:增益不能太大,否则边缘噪点会被放大。我一般限制最大增益不超过2.5倍。超过这个值,噪点就压不住了。
高通平台里,镜头阴影校正(LSC)通常在RAW域完成。参数存在OTP里,每个模组都不一样。我曾经遇到一个项目,OTP数据读出来全是0,结果拍出来的照片四周黑得像加了暗角滤镜。后来发现是模组厂烧录时出了问题。
本章知识结构
下面这张图,把本章的核心知识点串起来了。你仔细看看,Bayer阵列、RAW格式、黑电平、暗角校正,它们之间的关系一目了然。