黑电平校正与去噪
图像传感器出来的原始数据,说白了就是一堆带着噪声的电压值。你想想看,光电转换过程哪有那么完美?暗电流、热噪声、读出噪声,全混在里面。这一章我们就来解决两个最基础的问题——黑电平校正和去噪。
黑电平校正原理
什么是黑电平?简单说,就是传感器在完全无光情况下输出的信号值。理想情况下应该是0,但实际不是。我见过最夸张的一次,某款CMOS在黑场下居然有512个码值(12bit),这要是不校正,暗部全是灰蒙蒙的。
核心公式:
校正后像素 = 原始像素 - 黑电平值
注意:校正后可能出现负值,需要做钳位处理(clip to 0)。
黑电平的获取方式主要有两种:
- 光学黑区(OB, Optical Black):传感器边缘被金属遮挡的像素行/列,直接读出作为参考。
- 暗帧(Dark Frame):盖上镜头盖拍一张全黑图,取平均作为黑电平。
我个人习惯用OB区做实时校正,因为暗帧受温度影响太大。有一次在户外做调试,早上和下午温度差了20度,暗帧的黑电平漂了30多个码值,差点把整个项目带偏。
| 方法 | 优点 | 缺点 |
|---|---|---|
| 光学黑区(OB) | 实时、不受温度影响 | 占用传感器面积,行/列数有限 |
| 暗帧(Dark Frame) | 精度高,可多次平均 | 受温度、曝光时间影响大 |
避坑指南:我曾经遇到过OB区像素本身就有缺陷的情况——坏点、暗电流不均匀。如果直接用这些像素做黑电平校正,整张图都会出现条纹。建议先对OB区做坏点检测和滤波。
空间域去噪
空间域去噪,说白了就是直接在像素点上做运算。我把它分成三类:均值滤波、高斯滤波、中值滤波。每种都有自己的脾气。
均值滤波
最简单,也最粗暴。取一个窗口,算平均值,替换中心像素。
// 3x3均值滤波核
kernel = [
[1/9, 1/9, 1/9],
[1/9, 1/9, 1/9],
[1/9, 1/9, 1/9]
]
优点:速度快,硬件实现简单。缺点:边缘全糊了。我在做安防摄像头时试过,人脸边缘像打了马赛克,客户直接退货。
高斯滤波
比均值滤波聪明一点。它给中心像素更高的权重,边缘像素权重低,符合自然图像的统计特性。
// 3x3高斯滤波核(σ≈0.85)
kernel = [
[1/16, 2/16, 1/16],
[2/16, 4/16, 2/16],
[1/16, 2/16, 1/16]
]
嗯,这里要注意:高斯滤波的σ值很关键。σ太小,去噪效果差;σ太大,图像变模糊。我一般建议σ取0.8~1.2之间,具体看噪声水平。
经验之谈:在硬件实现时,高斯滤波可以用两个一维卷积代替二维卷积,节省大量乘法器。先做水平方向,再做垂直方向,效果完全一样。
中值滤波
这个我特别喜欢。它不取平均,而是取窗口内所有像素的中位数。对付椒盐噪声(就是那种黑白点)特别有效。
// 3x3窗口排序取中值
窗口像素: [45, 52, 48, 255, 50, 49, 47, 51, 0]
排序后: [0, 45, 47, 48, 49, 50, 51, 52, 255]
中值: 49
你看,255和0这两个噪声点直接被排除了。均值滤波会被它们拉偏,中值滤波完全不受影响。
| 滤波方法 | 噪声类型 | 边缘保留 | 硬件开销 |
|---|---|---|---|
| 均值滤波 | 高斯噪声 | 差 | 低 |
| 高斯滤波 | 高斯噪声 | 中 | 中 |
| 中值滤波 | 椒盐噪声 | 好 | 高(需要排序) |
时域去噪
空间域去噪有个硬伤——它是在单帧里做,必然会损失细节。时域去噪的思路不一样:利用多帧信息,噪声是随机的,信号是稳定的,多帧平均就能把噪声压下去。
核心公式很简单:
output_frame[n] = α * input_frame[n] + (1 - α) * output_frame[n-1]
α是更新系数,取值范围0~1。α越大,当前帧权重越高,去噪效果弱但运动拖影少;α越小,去噪强但容易产生鬼影。
关键参数:
- α = 0.1 ~ 0.3:强去噪,适合静态场景
- α = 0.5 ~ 0.7:平衡模式,适合一般场景
- α = 0.8 ~ 1.0:弱去噪,适合运动场景
我曾经在智能交通项目中吃过亏。路口抓拍,车是运动的,我用α=0.2做时域去噪,结果车尾拖了一条长长的鬼影,像彗星一样。后来加了运动检测,运动区域自动调高α,静止区域用低α,问题才解决。
重要提醒:时域去噪必须配合运动补偿(Motion Compensation),否则运动物体边缘会出现严重的拖影。最简单的做法是计算帧差,帧差大的区域提高α值。
实际项目中,我通常把空间域去噪和时域去噪结合起来用。先做中值滤波去掉椒盐噪声,再做时域滤波压制高斯噪声,最后用高斯滤波做微调。这套组合拳在大部分场景下效果都不错。
最后说一句:去噪不是越强越好。我见过有人把图像磨得跟油画一样,细节全没了。调优的时候,一定要盯着边缘和纹理看,噪声压下去了,细节还在,这才是好算法。