2. RK ISP硬件架构

做 ISP 调优,第一件事不是调参数,而是搞清楚数据是怎么在芯片里跑的。RK 的 ISP 硬件架构,说白了就是一条流水线:Sensor 把光信号转成电信号,然后 RAW 数据进来,经过一系列处理,最后变成我们看到的 YUV 图像。

我个人习惯,拿到一块新平台,先看它的 ISP 框图。不看框图就调参数,等于闭着眼开车。今天我们就来拆解 RK ISP 的内部模块,看看 RAW 域、RGB 域和 YUV 域到底在干什么。

核心观点: ISP 的处理流程是分域的,每个域解决不同的问题。RAW 域修硬件缺陷,RGB 域做色彩重建,YUV 域做画质增强。搞混了域,参数调了也白调。

2.1 ISP 整体流水线

先上一张整体架构图。这张图我每次培训都会画,因为它把 ISP 的三大域分得清清楚楚。

RK ISP 硬件流水线架构(三大域) RAW 域 (硬件缺陷修复) DPC(坏点校正) BLC(黑电平校正) LSC(镜头阴影校正) AWB Gain(白平衡增益) Demosaic(去马赛克) 输出:RAW → RGB RGB 域 (色彩重建) CCM(色彩校正) Gamma 校正 Tone Mapping 输出:RGB → YUV YUV 域 (画质增强) NR(降噪) Sharpen(锐化) 饱和度/对比度调节 边缘增强(EE) 输出:YUV 420/422 Sensor RAW 输入 YUV 输出到编码/显示 注意:各模块顺序在不同 RK 芯片版本中可能有微调,但三大域的划分是固定的。

你看,数据从左到右流过去。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 域的分界线。

调优技巧: RAW 域的模块顺序很重要。比如 DPC 必须在 BLC 之后做,因为黑电平校正后的数据才是真实的像素值。LSC 必须在 AWB Gain 之前做,否则阴影校正会放大白平衡的误差。这些顺序在 RK 的 ISP 驱动里是写死的,但你要理解为什么这么排。

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,也就是对不同区域用不同的映射曲线。这个参数调起来比较麻烦,调不好会出现光晕或者细节丢失。

常见误区: 很多人把 Gamma 和 Tone Mapping 混为一谈。Gamma 是全局的、固定的曲线,Tone Mapping 是局部的、自适应的映射。Gamma 调的是亮度感知,Tone Mapping 调的是动态范围。在 RK 的 ISP 里,这两个模块是独立的,参数要分开调。

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 关掉,否则两个模块叠加容易过冲。

关键点: YUV 域的模块顺序是:先降噪,再锐化,最后做饱和度/对比度调节。降噪必须在锐化之前,否则锐化会把噪声也放大。这个顺序在 RK 的 ISP 硬件里是固定的,但你可以通过参数控制每个模块的强度。

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%,问题立刻解决。这就是理解架构的好处——知道问题出在哪个域,直接对症下药。

我的建议: 刚开始调 RK ISP 的时候,先把每个域的默认参数跑一遍,看看每个模块对图像的影响。比如把 DPC 关掉看看坏点,把 LSC 关掉看看暗角,把 NR 关掉看看噪声。这样你就能直观地理解每个模块的作用,以后遇到问题就知道该调哪里了。