第2章:ISP Pipeline概览——从RAW图到最终图像的全流程

各位同学,欢迎来到ISP调试的入门课。今天咱们聊聊ISP Pipeline,也就是图像信号处理的全流程。说白了,就是手机摄像头从“看到”到“拍好”的整个过程。

我刚开始接触ISP时,觉得这东西就是个黑盒子——RAW图进去,美美的照片出来。后来自己动手调过几款sensor,才发现这里面门道真不少。今天我就带大家把这个黑盒子拆开看看。

2.1 什么是ISP Pipeline?

ISP Pipeline,你可以想象成一条流水线。RAW图是原材料,经过一道道工序,最终变成你手机相册里的JPEG。

这条流水线大致长这样:

RAW图 → BLC → LSC → AWB → Demosaic → CCM → Gamma → NR → Sharpen → 输出

嗯,别被这一长串吓到。咱们一个一个来拆解。

2.2 关键模块介绍

2.2.1 BLC(黑电平校正)

BLC是Pipeline的第一步。为什么需要它?因为sensor在完全无光的情况下,像素也会输出一个基础电压值。这个值不是零,而是某个固定的偏移量。

BLC的作用:把这个偏移量减掉,让黑色真正变成黑色。

核心公式

校正后像素值 = 原始像素值 - 黑电平值

我在项目中遇到过一款sensor,黑电平值在不同温度下会漂移。夏天拍出来的照片偏紫,冬天偏绿。后来我加了一个温度补偿表,才把这个问题搞定。

调试小技巧:BLC参数通常由sensor厂商提供,但建议你在暗室中实测验证。我曾经遇到过厂商给的参数不准,导致暗部细节全丢的情况。

2.2.2 LSC(镜头阴影校正)

你想想看,镜头中心的光线是直射的,边缘的光线是斜射的。这就导致一个问题——中心亮、边缘暗。这就是镜头阴影,也叫Lens Shading。

LSC的做法:给每个像素乘上一个增益系数。中心区域增益小,边缘区域增益大。

校正后像素值 = 原始像素值 × 增益系数(x, y)

增益系数通常是一个二维网格,我习惯用32×32的网格。网格太密会浪费算力,太疏又校正不干净。

注意:LSC校正过度会导致边缘出现“白边”或“色偏”。我见过有人把增益调得太大,结果照片边缘发紫,像加了滤镜一样。

2.2.3 AWB(自动白平衡)

AWB是ISP里最“玄学”的模块之一。它的任务是让白色物体在任何光源下都呈现白色。

为什么难?因为人眼有色彩恒常性,但sensor没有。你在暖色灯光下看一张白纸,人眼觉得它是白的,但sensor拍出来是黄的。

AWB的流程

  1. 统计图像中的色温信息
  2. 估算当前光源色温
  3. 计算R/G/B通道的增益
  4. 应用增益校正

我个人习惯用灰度世界法做基础校正,再用色温曲线做精细调整。但说实话,AWB没有完美方案。我调试过一款手机,在室内暖光下白平衡总是偏暖,后来发现是sensor的R通道响应偏弱,需要单独补偿。

避坑指南:我曾经把AWB的增益范围设得太大,结果在混合光源下(比如室内有日光灯又有窗户光),图像出现了明显的色块。后来我把增益上限限制在1.5倍以内,问题就解决了。

2.2.4 CCM(色彩校正矩阵)

CCM是让颜色“准”的关键。sensor的RGB响应和人眼不一样,所以需要用一个3×3的矩阵来转换。

[R']   [a11 a12 a13]   [R]
[G'] = [a21 a22 a23] × [G]
[B']   [a31 a32 a33]   [B]

这个矩阵的系数怎么定?通常用24色卡来标定。我习惯在D65(日光)和A光源(白炽灯)下分别标定,然后做插值。

嗯,这里要注意:CCM的系数不能太大。我见过有人为了追求色彩鲜艳,把对角系数调到1.5以上,结果颜色过饱和,红色溢出成了“血红色”。

2.2.5 Gamma校正

Gamma校正解决的是“亮度感知”问题。人眼对暗部细节更敏感,对亮部细节不敏感。但sensor是线性的,所以需要做非线性映射。

标准Gamma曲线

输出 = 输入 ^ (1/2.2)

说白了,就是把暗部拉开,把亮部压缩。这样暗部细节更丰富,亮部也不容易过曝。

我在项目中遇到过一个问题:Gamma曲线太陡,导致暗部噪点被放大。后来我改用分段Gamma——暗部用缓曲线,亮部用陡曲线,效果好了很多。

2.2.6 NR(降噪)

降噪是ISP里最吃算力的模块。噪点主要来自sensor的热噪声和光子散粒噪声。

常见的降噪方法

  • 空域降噪:比如双边滤波、非局部均值滤波
  • 时域降噪:利用多帧图像做平均
  • 频域降噪:小波变换、DCT变换

我个人习惯用空域+时域结合的方式。单帧降噪容易糊掉细节,多帧降噪又怕运动物体拖影。所以我会先做运动检测,运动区域用空域降噪,静止区域用时域降噪。

警告:降噪强度不是越大越好。我曾经把降噪开到最大,结果照片像油画一样,细节全没了。降噪的度,要结合sensor的噪声水平和场景来调。

2.2.7 Sharpen(锐化)

锐化是Pipeline的最后一步。降噪会损失细节,锐化就是把这些细节“找回来”。

经典锐化方法:Unsharp Mask(USM)

锐化图像 = 原图 + 增益 × (原图 - 模糊图)

说白了,就是提取高频信息(边缘),然后叠加回原图。

我调试锐化时,最怕出现“振铃效应”——边缘附近出现一圈白边或黑边。这通常是因为增益太大或者模糊半径不合适。我习惯用3×3的高斯核做模糊,增益控制在0.3~0.8之间。

经验之谈:锐化要“看菜下饭”。高分辨率sensor可以锐化强一点,低分辨率sensor锐化太强反而会放大噪点。我调过一款16MP的sensor,锐化增益设到0.5就够用了。

2.3 Pipeline的调试顺序

这么多模块,先调哪个?后调哪个?我建议的顺序是:

顺序 模块 原因
1 BLC 基础校正,必须先做
2 LSC 亮度均匀性,影响后续所有模块
3 AWB 色温校正,影响色彩
4 CCM 色彩校正,依赖AWB结果
5 Gamma 亮度映射,影响对比度
6 NR 降噪,依赖Gamma后的图像
7 Sharpen 最后一步,恢复细节

这个顺序不是绝对的,但新手按这个顺序来,不容易出错。我刚开始调试时,先调了Sharpen再调NR,结果锐化放大了噪点,降噪又糊掉了细节,来回折腾了好几天。

2.4 小结

好了,今天的内容就到这里。咱们把ISP Pipeline的各个模块过了一遍,从BLC到Sharpen,每个模块都有它的使命。

你想想看,一张RAW图经过这么多道工序,才变成你看到的照片。每一道工序都像是一个“滤镜”,但比滤镜复杂得多。调试ISP,说白了就是找到这些“滤镜”的最佳参数组合。

下一章,我会详细讲讲BLC的调试方法,包括如何测量黑电平、如何做温度补偿。到时候咱们再聊。

一句话总结:ISP Pipeline是一条从RAW到图像的流水线,每个模块各司其职,调试时要按顺序来,不能跳步。