第一章:ISP Pipeline基础——从Bayer到YUV的奇幻漂流

各位同学,欢迎来到《暗光场景ISP参数调试实战》的第一课。

我是你们的老朋友,一个在成像领域摸爬滚打了十几年的工程师。今天咱们聊聊ISP Pipeline的基础。说白了,就是图像从传感器出来,到变成你屏幕上那张漂亮照片,中间到底经历了什么。

很多人觉得ISP就是个黑盒子,参数调来调去全靠试。我刚开始也这么干,后来发现不行。你得理解每个模块在干什么,为什么这么干,才能调出好效果。尤其是暗光场景,一步错步步错。

核心观点:ISP Pipeline的本质,是把传感器捕捉的原始电信号,一步步加工成人眼看起来舒服的数字图像。这个过程分为三个域:Bayer域、RGB域、YUV域。

1.1 三个域,三件事

先说说这三个域。我习惯把它们比作三个车间:

  • Bayer域:原始车间。传感器出来的数据,每个像素只有一种颜色(R、G、B之一)。数据量最小,但信息最原始。
  • RGB域:彩色车间。通过去马赛克,每个像素都有了完整的RGB值。这时候图像是彩色的,但可能偏色、噪点多。
  • YUV域:人眼车间。把亮度(Y)和颜色(U、V)分开。人眼对亮度敏感,对颜色不敏感,所以可以单独处理。

你想想看,为什么要有这三个域?因为每个域适合做不同的事。Bayer域做黑电平校正、去噪,效率高;RGB域做白平衡、色彩校正,效果好;YUV域做锐化、降噪,符合人眼特性。

我的经验:暗光场景下,我建议在Bayer域就把噪声压住。一旦进了RGB域,噪声和颜色混在一起,再想分开就难了。我曾经在一个项目里,因为Bayer域去噪没做好,后面怎么调都救不回来,最后只能改硬件。

1.2 关键模块逐个拆解

好,咱们一个一个模块过。每个模块我都会讲它干什么、为什么重要、暗光下怎么调。

1.2.1 黑电平校正(Black Level Correction)

传感器在没有光的时候,理论上输出应该是0。但实际不是,因为电路有暗电流。这个暗电流就是黑电平。

黑电平校正,就是把每个像素减去一个固定的值。这个值通常从传感器的暗像素区域读出。

// 黑电平校正伪代码
for each pixel:
    pixel_out = pixel_in - black_level
    if pixel_out < 0:
        pixel_out = 0

暗光下,黑电平的影响会被放大。因为信号本身很弱,黑电平稍微不准,暗部细节就没了。我遇到过一台手机,暗光下拍出来一片死黑,查了半天,原来是黑电平校正参数没更新,用的还是白天的那组值。

注意:黑电平校正必须在Bayer域做,而且要在去噪之前。顺序错了,噪声会被放大。

1.2.2 去噪(Denoise)

暗光下,噪声是最大的敌人。去噪模块通常分两步:

  • Bayer域去噪:用空域滤波,比如均值滤波、中值滤波。我习惯用双边滤波,保边效果好。
  • YUV域去噪:用时域滤波,比如多帧降噪。暗光下我一般开3-5帧合成。

这里有个坑:去噪太强,细节就没了;去噪太弱,噪点满天飞。怎么平衡?我的做法是:先做边缘检测,边缘区域少去噪,平坦区域多去噪。

1.2.3 去马赛克(Demosaic)

Bayer格式每个像素只有一个颜色,去马赛克就是通过插值,把缺失的两个颜色算出来。

常用的算法有:

  • 双线性插值:简单,但边缘有锯齿
  • 方向插值:效果好,但计算量大
  • 自适应插值:根据图像内容选择插值方向

暗光下,去马赛克容易产生伪彩色。因为噪声会被插值算法放大。我建议暗光场景用方向插值,配合边缘导向的权重。

1.2.4 白平衡(White Balance)

白平衡的目的是让白色物体在任何光源下都呈现白色。说白了,就是调整R、G、B三个通道的增益。

暗光下,白平衡容易偏色。因为传感器对红蓝光的响应不同,加上噪声干扰,自动白平衡经常翻车。我遇到过晚上拍路灯,画面偏黄,怎么调都调不回来。后来发现是白平衡算法把路灯的黄色当成了光源色温,一直在往蓝色方向拉。

避坑指南:暗光场景,我建议用固定色温的白平衡,或者用灰度世界法加一个置信度阈值。别让算法在暗光下乱猜。

1.2.5 Gamma校正(Gamma Correction)

Gamma校正解决的是人眼对亮度的非线性感知问题。人眼对暗部变化敏感,对亮部变化不敏感。所以要把暗部拉开,亮部压缩。

标准Gamma曲线:

output = input ^ (1/2.2)

暗光下,Gamma校正会把暗部噪声也放大。所以很多ISP会在Gamma之前做一次去噪。我习惯在Gamma之后再加一个微调,把暗部噪声压一压。

1.2.6 色彩校正(Color Correction)

色彩校正通过一个3x3矩阵,把传感器捕捉的颜色映射到标准色彩空间(比如sRGB)。

这个矩阵通常是在实验室里标定好的。但暗光下,传感器的色彩响应会偏移。我建议暗光场景用另一套色彩校正矩阵,专门针对低照度优化。

场景 色彩校正矩阵(示例)
正常光照 [1.2, -0.1, -0.1; -0.1, 1.3, -0.2; -0.1, -0.2, 1.3]
暗光 [1.1, -0.05, -0.05; -0.05, 1.2, -0.15; -0.05, -0.15, 1.2]

你看,暗光下矩阵的非对角元素更小,说明颜色串扰更少。这是为了抑制噪声。

1.2.7 锐化(Sharpening)

锐化是最后一步,目的是增强边缘。常用的是非锐化掩模(Unsharp Mask):

sharpened = original + alpha * (original - blurred)

暗光下,锐化要小心。因为噪声也会被锐化。我一般把alpha值降低,或者只在边缘区域做锐化。

总结一下:暗光场景的ISP调试,核心是平衡。平衡去噪和细节,平衡白平衡和偏色,平衡锐化和噪声。没有万能参数,只有理解原理后的针对性调整。

1.3 ISP Pipeline流程图

下面这张图,是我自己画的ISP Pipeline流程。你把它存下来,以后调试的时候对照着看。

ISP Pipeline 流程图 Bayer域 黑电平校正 Bayer域去噪 去马赛克 RGB域 白平衡 色彩校正 Gamma校正 YUV域 YUV域去噪 锐化 输出YUV图像 传感器原始数据 彩色图像 亮度/色度分离 暗光场景下,Bayer域去噪和Gamma校正是关键 建议在Bayer域先做黑电平校正,再去噪 RGB域注意白平衡不要偏色 YUV域锐化要适度,避免放大噪声

嗯,这张图基本把ISP Pipeline的流程说清楚了。你注意看,从Bayer域到RGB域,中间有个去马赛克。从RGB域到YUV域,中间有个色彩空间转换。每个域都有自己专属的模块。

好了,第一章的内容就到这里。记住,ISP调试不是玄学,是科学。理解每个模块的原理,你就能在暗光场景下做出正确的参数选择。

专注资料整理