4、图像采集质量:光照条件、对焦精度、传感器噪声、镜头畸变控制
图像调优这件事,很多人一上来就扑向算法参数。但我个人的习惯是——先看采集端。源头脏了,后面再怎么洗也洗不干净。这章我们就聊聊采集质量的四个核心维度:光照、对焦、噪声、畸变。
核心观点:采集端引入的劣化,90% 无法通过后期算法完全修复。调优的第一道关口,在镜头和传感器上。
4.1 光照条件:一切质量的起点
光照不足,信噪比就崩。光照过强,高光溢出。光照不均匀,后续的白平衡和曝光补偿全得跟着跑偏。
我在项目中遇到过最典型的场景:一个安防摄像头,白天效果完美,一到黄昏就满屏噪点。查了半天,发现是自动增益(AGC)被拉到了 48dB 以上。说白了,硬件在拼命补光,但补的是噪声。
光照质量的关键指标
| 指标 | 理想范围 | 常见问题 |
|---|---|---|
| 照度 (Lux) | 100 ~ 1000 Lux | < 50 Lux 时噪声急剧上升 |
| 色温 (K) | 4000K ~ 6500K | 混合光源导致白平衡漂移 |
| 均匀性 | 中心/边缘亮度差 < 20% | 单侧强光导致局部过曝 |
| 频闪频率 | 0 Hz 或 > 100 Hz | 50/60 Hz 工频导致条纹 |
实战技巧:我建议在采集环境里放一个灰卡(18% 中性灰)。每次换场景先拍一帧灰卡,用来校准曝光和白平衡。这步花不了 10 秒,但能省掉后面 2 小时的调参时间。
4.2 对焦精度:清晰度的最后一道防线
对焦不准,再好的传感器也白搭。你想想看,一个边缘模糊的图像,锐化算法再怎么拉,也只是把模糊的边缘变得更刺眼,不会变清晰。
我曾经调试过一款工业扫码相机,客户投诉读码率低。我拿到原始图像一看,对焦环偏了大约 0.3mm。嗯,就这么点偏差,条码边缘的调制传递函数(MTF)从 0.6 掉到了 0.3。调回来之后,读码率直接从 85% 跳到 99.5%。
对焦质量评估方法
- MTF 测试:使用西门子星图或斜边卡,测量 10 lp/mm 和 30 lp/mm 处的 MTF 值。理想值 > 0.5。
- 边缘响应宽度:测量黑白过渡带的 10%-90% 宽度。理想值 < 2 个像素。
- 对比度检测:计算 ROI 内的拉普拉斯方差。数值越大,对焦越准。
避坑指南:我曾经见过有人用「图像看起来清晰」来评判对焦。这是大忌。人眼对高频细节不敏感,尤其是 30 岁以后。一定要用客观指标,比如 MTF 或 SFR(空间频率响应)。相信我,你的眼睛会骗你,但数据不会。
4.3 传感器噪声:隐藏在暗处的敌人
噪声这东西,你平时可能注意不到。但只要一放大、一调色、一压缩,它就全冒出来了。传感器噪声主要分三类:
| 噪声类型 | 来源 | 特征 | 抑制手段 |
|---|---|---|---|
| 散粒噪声 | 光子到达的随机性 | 与信号强度平方根成正比 | 增加曝光时间 / 多帧叠加 |
| 读出噪声 | 传感器电路热运动 | 与增益成正比 | 降低模拟增益 / 使用低噪声 ADC |
| 固定模式噪声 | 像素间响应不一致 | 空间位置固定,帧间不变 | 暗场校正 / 平场校正 |
我个人最头疼的是固定模式噪声(FPN)。因为它不是随机噪点,而是像网格一样固定在那里。人眼对这种规律性噪声特别敏感,一旦出现,画面就像蒙了一层纱。
我的习惯:每次拿到新传感器,第一件事就是拍一张全黑帧(盖上镜头盖,最短曝光),然后拍一张均匀白场。用这两帧做暗场和平场校正。这步做完,FPN 基本能压到 1 LSB 以下。
4.4 镜头畸变:几何世界的扭曲
畸变是镜头天生的物理缺陷。广角镜头尤其明显。你拍一条直线,它变成了一条弧线。这在人脸识别、文档扫描、测量类应用中,是致命的。
畸变主要分两种:
- 桶形畸变:画面中心向外膨胀,常见于广角端。
- 枕形畸变:画面四角向内收缩,常见于长焦端。
我记得有一次调试车载环视系统,四个鱼眼镜头拼接出来的地面标线全是弯的。查了半天,发现每个镜头的畸变参数都不一样,但固件里只写了一套参数。说白了,量产镜头之间的个体差异被忽略了。
畸变校正流程
- 标定:用棋盘格拍摄 10-20 张不同角度的图像。
- 提取角点:使用 OpenCV 的
findChessboardCorners。 - 计算内参和畸变系数:调用
calibrateCamera,得到 k1, k2, p1, p2, k3。 - 生成校正映射:使用
initUndistortRectifyMap生成 x/y 映射表。 - 重映射:用
remap对每一帧做插值校正。
// 畸变校正核心代码片段(C++ / OpenCV)
cv::Mat cameraMatrix, distCoeffs;
cv::Size imageSize;
// 从标定结果加载内参和畸变系数
// cameraMatrix = [fx, 0, cx; 0, fy, cy; 0, 0, 1]
// distCoeffs = [k1, k2, p1, p2, k3]
cv::Mat map1, map2;
cv::initUndistortRectifyMap(
cameraMatrix, distCoeffs, cv::Mat(),
cv::getOptimalNewCameraMatrix(cameraMatrix, distCoeffs, imageSize, 1.0),
imageSize, CV_32FC1, map1, map2
);
// 对每一帧做校正
cv::Mat frame, corrected;
cv::remap(frame, corrected, map1, map2, cv::INTER_LINEAR);
注意:畸变校正会损失边缘视场。如果你需要保留完整的视场角,建议在标定时设置
alpha=0(保留所有像素),但边缘会出现黑边。或者用 alpha=0.5 做折中。
4.5 知识体系总览
下面这张图把这四个维度的关系串起来了。你可以把它当作采集质量检查的路线图。
4.6 采集质量检查清单
每次搭建采集环境,我都会过一遍这个清单。你可以直接拿去用:
- 光照:照度是否在 100-1000 Lux?色温是否稳定?有无频闪?
- 对焦:MTF 是否 > 0.5?边缘响应宽度是否 < 2 像素?
- 噪声:暗场噪声是否 < 2 LSB?FPN 是否已做校正?
- 畸变:是否做过标定?畸变系数是否针对单个镜头?
一句话总结:采集质量决定了调优的天花板。光照、对焦、噪声、畸变,这四个点你花 80% 的精力去控制,后面 20% 的算法调优就能出 100% 的效果。反过来,前面偷懒,后面再怎么折腾也是事倍功半。