第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的流程:
- 统计图像中的色温信息
- 估算当前光源色温
- 计算R/G/B通道的增益
- 应用增益校正
我个人习惯用灰度世界法做基础校正,再用色温曲线做精细调整。但说实话,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到图像的流水线,每个模块各司其职,调试时要按顺序来,不能跳步。