ISP图像信号处理:Pipeline整体架构与关键模块

ISP,说白了就是让摄像头“看”得更清楚的大脑。Sensor把光信号转成电信号,但原始数据(raw data)根本没法直接用——偏色、噪点、暗角、模糊,问题一大堆。我刚开始做安防摄像头那会儿,以为Sensor好画面就好,结果被ISP狠狠教育了一顿。

今天咱们就把ISP Pipeline从头到尾捋一遍。你想想看,一张照片从Sensor出来到最终显示,中间经历了什么?

ISP Pipeline整体架构

先看一张整体流程图,我习惯把ISP分成三个大阶段:前端预处理、中间处理、后端输出。

核心认知:ISP不是简单的“滤镜堆叠”,而是一个有严格时序和依赖关系的处理链。前一级的输出质量,直接决定后一级的效果上限。

ISP Pipeline 整体架构 前端预处理 BLC · DPC · LSC · AWB 中间处理 Demosaic · NR · Sharpen 后端输出 Gamma · CSC · YUV输出 3A算法(闭环控制) AE 自动曝光 AWB 自动白平衡 AF 自动对焦 反馈控制环路 💡 关键理解: • 前端预处理解决Sensor物理缺陷(黑电平、坏点、镜头阴影) • 中间处理解决图像质量(去马赛克、降噪、锐化) • 3A算法贯穿始终,动态调整曝光、白平衡和对焦参数

我的经验:很多新手一上来就调Sharpen和NR,觉得这两个模块最“出效果”。但如果你BLC没做对,AWB偏色严重,后面再怎么调也是白费力气。我曾经在一个项目里花了三周调降噪参数,最后发现是BLC的offset设错了——基础没打好,上层全是空中楼阁。

关键模块详解

1. BLC(黑电平校正)

BLC是ISP的第一个模块,也是最容易被忽略的。Sensor在完全无光的情况下,输出并不是0,而是有一个固定的偏置值——这就是黑电平。

为什么要做BLC?因为黑电平会吃掉暗部细节,还会影响后续AWB的统计精度。校正公式很简单:

// BLC校正示例
// raw_data: 原始像素值
// blc_offset: 黑电平偏移量(通常从OTP读取)
uint16_t blc_correct(uint16_t raw_data, uint16_t blc_offset) {
    if (raw_data < blc_offset)
        return 0;
    else
        return raw_data - blc_offset;
}

注意:BLC的offset不是固定值,它会随温度、增益变化。我见过一个项目,白天效果很好,晚上画面发灰——就是因为温度升高后黑电平漂了,但BLC参数没跟着变。建议做温度补偿查表。

2. AWB(自动白平衡)

AWB解决的是“白色在不同光源下看起来还是白色”的问题。你想想看,日光灯下的白纸和夕阳下的白纸,Sensor拍出来色温完全不同。

AWB的核心思路:找到场景中的“参考白点”,然后调整R/G/B增益,让白点恢复为纯白。

光源类型 色温(K) R/G增益比 B/G增益比
白炽灯 2800-3200 1.6-1.8 1.1-1.3
日光 5000-6500 1.0-1.2 1.0-1.2
阴天 6500-8000 0.8-1.0 1.4-1.6
荧光灯 4000-5000 1.2-1.4 1.0-1.2

避坑指南:我曾经在监控项目中遇到一个问题——夜晚场景下,AWB把红色的车灯误判为“暖色光源”,导致整个画面偏蓝。后来加了“色温置信度”判断,对大面积纯色区域做降权处理,才解决这个问题。

3. AE(自动曝光)

AE的目标很简单:让画面亮度合适。但实现起来一点都不简单。安防场景的亮度动态范围极大——从正午的10万lux到深夜的0.01lux,差了7个数量级。

AE的调节手段有三个:

  • 曝光时间(Shutter):控制进光时长,范围从1/10000s到几秒
  • 模拟增益(Analog Gain):放大Sensor输出信号,但会放大噪声
  • 数字增益(Digital Gain):数字域放大,噪声放大更明显

AE的策略通常是:优先调曝光时间,不够再加模拟增益,最后才用数字增益。为什么?因为数字增益的噪声代价最大。

// AE策略伪代码
if (当前亮度 < 目标亮度) {
    if (曝光时间 < 最大曝光时间) {
        增加曝光时间;
    } else if (模拟增益 < 最大模拟增益) {
        增加模拟增益;
    } else {
        增加数字增益;  // 最后手段
    }
}

4. Demosaic(去马赛克)

Sensor的每个像素只能感知一种颜色(R/G/B),通过Bayer阵列排列。Demosaic就是根据相邻像素,插值出每个像素缺失的两种颜色。

最简单的双线性插值效果很差——边缘会有彩色伪影。我建议至少用边缘导向插值:

  • 先判断当前像素属于水平边缘还是垂直边缘
  • 沿着边缘方向做插值,避免跨边缘模糊
  • 对纹理复杂区域,可以用自适应插值

小技巧:Demosaic和NR的顺序有讲究。先Demosaic再NR,会丢失颜色细节;先NR再Demosaic,插值精度更高。我习惯在Demosaic前做轻度的NR,只去除Sensor读出噪声,保留真实细节。

5. NR(降噪)

噪声是安防摄像头的天敌。低照度下,噪声会淹没细节,压缩编码也会因为噪声浪费码率。

NR分为空域降噪和时域降噪:

类型 原理 优点 缺点
空域降噪 对单帧图像做滤波 实现简单,无运动拖影 容易丢失细节
时域降噪 多帧图像叠加平均 降噪效果好,保留细节 运动场景有鬼影

实际项目中,我通常把两者结合:静态区域用强时域降噪,运动区域切回空域降噪。运动检测的精度直接影响NR效果——运动检测不准,鬼影就来了。

6. Sharpen(锐化)

锐化是把双刃剑。锐化过度,画面会出现“光晕”和“振铃”;锐化不足,画面又显得模糊。

常用的锐化方法是非锐化掩模(Unsharp Mask):

// Unsharp Mask 锐化
sharp = original + alpha * (original - blurred)

其中alpha是锐化强度,blurred是高斯模糊后的图像。关键点在于:

  • 只在边缘区域做锐化,平坦区域不做(避免放大噪声)
  • 边缘检测的阈值要合理——阈值太低,噪声被锐化;阈值太高,边缘没锐化到

血的教训:有一次我把锐化强度调得很大,在实验室看测试图效果很好。结果到现场,监控画面里的树叶边缘全是白边——因为树叶纹理复杂,锐化过度了。后来我加了“边缘幅度自适应”控制,强边缘弱锐化,弱边缘强锐化,才平衡了效果。

3A算法原理

3A是AE、AWB、AF三个闭环控制算法的统称。它们不是独立工作的,而是相互耦合:

  • AE影响AWB:曝光变化会改变颜色统计分布
  • AWB影响AE:白平衡增益调整后,亮度统计会变化
  • AF影响两者:对焦清晰度影响AE的亮度统计和AWB的颜色统计

3A的经典控制框架是:

  1. 统计采集:从图像中提取亮度直方图、色温统计、对比度信息
  2. 策略决策:根据统计值,计算目标曝光量、目标白平衡增益、对焦位置
  3. 执行调整:通过I2C/SPI写Sensor寄存器,或调整ISP内部参数
  4. 反馈迭代:下一帧重新统计,形成闭环

核心要点:3A的收敛速度和稳定性是一对矛盾。收敛太快容易振荡,收敛太慢用户体验差。我习惯用PID控制,P项保证响应速度,I项消除稳态误差,D项抑制过冲。参数调优时,先调P,再加I,最后加D——这个顺序不要乱。

嗯,ISP Pipeline的内容就讲到这里。每个模块单独拿出来都能讲一整天,但今天咱们先把骨架搭起来。后面几章会逐个深入每个模块的硬件实现和调优技巧。