2. RK ISP硬件架构
做 ISP 调优,第一件事不是调参数,而是搞清楚数据是怎么在芯片里跑的。RK 的 ISP 硬件架构,说白了就是一条流水线:Sensor 把光信号转成电信号,然后 RAW 数据进来,经过一系列处理,最后变成我们看到的 YUV 图像。
我个人习惯,拿到一块新平台,先看它的 ISP 框图。不看框图就调参数,等于闭着眼开车。今天我们就来拆解 RK ISP 的内部模块,看看 RAW 域、RGB 域和 YUV 域到底在干什么。
2.1 ISP 整体流水线
先上一张整体架构图。这张图我每次培训都会画,因为它把 ISP 的三大域分得清清楚楚。
你看,数据从左到右流过去。RAW 域处理的是 Sensor 最原始的数据,RGB 域开始做色彩还原,YUV 域做最后的画质修饰。每个域都有自己的一套模块,不能混着用。
2.2 RAW 域处理:修修补补的脏活累活
RAW 域的数据是什么?就是 Sensor 每个像素点直接输出的电压值,Bayer 格式,RGGB 排列。这个阶段的数据最原始,也最脏。
DPC(坏点校正)——Sensor 生产过程中难免有坏点,有的像素永远亮着(亮点),有的永远暗着(暗点)。DPC 模块就是把这些坏点找出来,用周围像素的值插值替换掉。我遇到过一批 Sensor,坏点率特别高,DPC 阈值调松了正常像素被误杀,调紧了坏点又漏过去。后来发现是 Sensor 的 ADC 模块有问题,换了批次才解决。
BLC(黑电平校正)——Sensor 在完全无光的情况下,输出值不是 0,而是某个偏置值。这个偏置就是黑电平。BLC 模块把它减掉,让黑色真正变成 0。嗯,这里要注意:不同增益下的黑电平是不一样的,高增益时黑电平会漂移。RK 的 ISP 支持分段 BLC,我建议你至少测 3 个增益点来拟合曲线。
LSC(镜头阴影校正)——镜头中心到边缘的光照衰减,导致四周变暗。LSC 模块给边缘像素乘一个增益系数来补偿。这个系数是二维的,RK 的 ISP 通常用 16x16 或 32x32 的网格来存储。我曾经在调试时发现边缘过亮,后来查出来是 LSC 增益表没对准 Sensor 的 ROI 区域。
AWB Gain(白平衡增益)——这里只是把白平衡的增益乘到 RAW 数据上,真正的色温估计是在 3A 算法里做的。为什么放在 RAW 域?因为增益乘在 RAW 上,后面的 Demosaic 和 CCM 才能正确处理色彩。
Demosaic(去马赛克)——Bayer 格式每个像素只有一种颜色,Demosaic 通过插值把另外两种颜色算出来,生成完整的 RGB 图像。这是 RAW 域的最后一个模块,也是 RAW 域到 RGB 域的分界线。
2.3 RGB 域处理:让颜色回归真实
数据进入 RGB 域后,每个像素都有 R、G、B 三个分量了。这个域的核心任务就是色彩重建。
CCM(色彩校正矩阵)——Sensor 的光谱响应和人眼不一样,拍出来的颜色偏色。CCM 用一个 3x3 的矩阵把 Sensor RGB 转换到标准 RGB(比如 sRGB 或 BT.709)。这个矩阵怎么来的?用 24 色卡标定出来的。我建议你至少用 D65、A 光、TL84 三种光源分别标定,然后根据场景切换。
Gamma 校正——人眼对暗部的变化更敏感,对亮部的变化不敏感。Gamma 曲线就是把线性数据映射到人眼的感知空间。标准 Gamma 是 2.2,但不同的显示设备可能不同。RK 的 ISP 支持分段 Gamma,你可以自定义曲线。我个人习惯在暗部用稍大的 Gamma 值来提亮细节,亮部用稍小的 Gamma 值防止过曝。
Tone Mapping——这个模块处理的是动态范围压缩。Sensor 的原始动态范围可能到 12bit 甚至 14bit,但输出只有 8bit。Tone Mapping 把高动态范围压缩到低动态范围,同时保留细节。RK 的 ISP 通常支持局部 Tone Mapping,也就是对不同区域用不同的映射曲线。这个参数调起来比较麻烦,调不好会出现光晕或者细节丢失。
2.4 YUV 域处理:画质的最后一道关
RGB 数据经过色彩空间转换变成 YUV,Y 是亮度,U/V 是色度。YUV 域的处理主要针对亮度和色度分开做。
NR(降噪)——降噪是 YUV 域最核心的模块。RK 的 ISP 通常支持 2D NR 和 3D NR。2D NR 在单帧内做空域降噪,3D NR 利用前后帧的相关性做时域降噪。我遇到过一个问题:3D NR 在运动场景下会产生拖影,后来把运动检测的阈值调高了一些,拖影就消失了。但代价是静止场景的降噪效果变差了一点,这就是 trade-off。
Sharpen(锐化)——降噪之后图像会变软,锐化就是把它拉回来。RK 的 ISP 支持非锐化掩模(USM),也就是提取高频分量,放大后再加回原图。锐化强度要控制好,调太强会出现振铃效应,调太弱又看不出效果。我一般先调到一个能看到边缘增强但又不出现振铃的临界点,然后回退 10%。
饱和度/对比度调节——这两个参数在 YUV 域做是因为 Y 和 UV 是分开的。调节饱和度只影响 UV 分量,不影响亮度。调节对比度只影响 Y 分量,不影响色彩。这样调起来互不干扰。
边缘增强(EE)——这个模块和 Sharpen 有点像,但 EE 专门针对边缘做增强,不是全局的。RK 的 ISP 会先检测边缘方向,然后沿着边缘方向做增强,垂直方向不做。这样能避免边缘锯齿和振铃。我建议你在调 EE 之前先把 Sharpen 关掉,否则两个模块叠加容易过冲。
2.5 三大域的对比总结
最后用一张表来总结三大域的区别,方便你对照理解。
| 处理域 | 输入数据 | 输出数据 | 核心模块 | 主要目标 |
|---|---|---|---|---|
| RAW 域 | Bayer RAW(单通道) | RGB(三通道) | DPC、BLC、LSC、Demosaic | 修复硬件缺陷,重建完整色彩 |
| RGB 域 | RGB(三通道) | YUV(三通道) | CCM、Gamma、Tone Mapping | 色彩校正,动态范围压缩 |
| YUV 域 | YUV(三通道) | YUV(三通道) | NR、Sharpen、EE、饱和度 | 画质增强,降噪锐化 |
你想想看,如果不懂这三个域的划分,拿到一个偏色问题,你可能会去调 YUV 域的饱和度,但问题其实出在 RAW 域的 AWB Gain 或者 RGB 域的 CCM 上。方向错了,调再多参数也没用。
我记得有一次,客户反馈图像偏绿。我一看,他调了半天的 YUV 饱和度,把 UV 分量调来调去,绿色就是下不去。我让他把 CCM 矩阵里的 G 通道系数降了 5%,问题立刻解决。这就是理解架构的好处——知道问题出在哪个域,直接对症下药。