4. ISP图像信号处理
ISP,说白了就是让摄像头“看”得更清楚的大脑。Sensor把光信号转成电信号,但原始数据(raw data)根本没法直接用——偏色、噪点、暗角、模糊,问题一大堆。我刚开始做安防摄像头那会儿,以为Sensor好画面就好,结果被ISP狠狠教育了一顿。
今天咱们就把ISP Pipeline从头到尾捋一遍。你想想看,一张照片从Sensor出来到最终显示,中间经历了什么?
ISP Pipeline整体架构
先看一张整体流程图,我习惯把ISP分成三个大阶段:前端预处理、中间处理、后端输出。
核心认知:ISP不是简单的“滤镜堆叠”,而是一个有严格时序和依赖关系的处理链。前一级的输出质量,直接决定后一级的效果上限。
我的经验:很多新手一上来就调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的经典控制框架是:
- 统计采集:从图像中提取亮度直方图、色温统计、对比度信息
- 策略决策:根据统计值,计算目标曝光量、目标白平衡增益、对焦位置
- 执行调整:通过I2C/SPI写Sensor寄存器,或调整ISP内部参数
- 反馈迭代:下一帧重新统计,形成闭环
核心要点:3A的收敛速度和稳定性是一对矛盾。收敛太快容易振荡,收敛太慢用户体验差。我习惯用PID控制,P项保证响应速度,I项消除稳态误差,D项抑制过冲。参数调优时,先调P,再加I,最后加D——这个顺序不要乱。
嗯,ISP Pipeline的内容就讲到这里。每个模块单独拿出来都能讲一整天,但今天咱们先把骨架搭起来。后面几章会逐个深入每个模块的硬件实现和调优技巧。