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%。

对焦质量评估方法

  1. MTF 测试:使用西门子星图或斜边卡,测量 10 lp/mm 和 30 lp/mm 处的 MTF 值。理想值 > 0.5。
  2. 边缘响应宽度:测量黑白过渡带的 10%-90% 宽度。理想值 < 2 个像素。
  3. 对比度检测:计算 ROI 内的拉普拉斯方差。数值越大,对焦越准。
避坑指南:我曾经见过有人用「图像看起来清晰」来评判对焦。这是大忌。人眼对高频细节不敏感,尤其是 30 岁以后。一定要用客观指标,比如 MTF 或 SFR(空间频率响应)。相信我,你的眼睛会骗你,但数据不会。

4.3 传感器噪声:隐藏在暗处的敌人

噪声这东西,你平时可能注意不到。但只要一放大、一调色、一压缩,它就全冒出来了。传感器噪声主要分三类:

噪声类型 来源 特征 抑制手段
散粒噪声 光子到达的随机性 与信号强度平方根成正比 增加曝光时间 / 多帧叠加
读出噪声 传感器电路热运动 与增益成正比 降低模拟增益 / 使用低噪声 ADC
固定模式噪声 像素间响应不一致 空间位置固定,帧间不变 暗场校正 / 平场校正

我个人最头疼的是固定模式噪声(FPN)。因为它不是随机噪点,而是像网格一样固定在那里。人眼对这种规律性噪声特别敏感,一旦出现,画面就像蒙了一层纱。

我的习惯:每次拿到新传感器,第一件事就是拍一张全黑帧(盖上镜头盖,最短曝光),然后拍一张均匀白场。用这两帧做暗场和平场校正。这步做完,FPN 基本能压到 1 LSB 以下。

4.4 镜头畸变:几何世界的扭曲

畸变是镜头天生的物理缺陷。广角镜头尤其明显。你拍一条直线,它变成了一条弧线。这在人脸识别、文档扫描、测量类应用中,是致命的。

畸变主要分两种:

  • 桶形畸变:画面中心向外膨胀,常见于广角端。
  • 枕形畸变:画面四角向内收缩,常见于长焦端。

我记得有一次调试车载环视系统,四个鱼眼镜头拼接出来的地面标线全是弯的。查了半天,发现每个镜头的畸变参数都不一样,但固件里只写了一套参数。说白了,量产镜头之间的个体差异被忽略了。

畸变校正流程

  1. 标定:用棋盘格拍摄 10-20 张不同角度的图像。
  2. 提取角点:使用 OpenCV 的 findChessboardCorners。
  3. 计算内参和畸变系数:调用 calibrateCamera,得到 k1, k2, p1, p2, k3。
  4. 生成校正映射:使用 initUndistortRectifyMap 生成 x/y 映射表。
  5. 重映射:用 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 知识体系总览

下面这张图把这四个维度的关系串起来了。你可以把它当作采集质量检查的路线图。

图像采集质量四维控制体系 图像采集质量四维控制体系 光照条件 对焦精度 传感器噪声 镜头畸变 关键控制逻辑: 1. 光照不足 → 传感器被迫提高增益 → 噪声放大 2. 光照不均匀 → 自动对焦被误导 → 对焦精度下降 3. 畸变未校正 → 图像几何失真 → 后续测量/识别失败 4. 噪声未抑制 → 压缩后码率浪费 → 画质劣化不可逆 调优顺序:光照 → 对焦 → 噪声 → 畸变。前一个没做好,后一个就别想了。

4.6 采集质量检查清单

每次搭建采集环境,我都会过一遍这个清单。你可以直接拿去用:

  • 光照:照度是否在 100-1000 Lux?色温是否稳定?有无频闪?
  • 对焦:MTF 是否 > 0.5?边缘响应宽度是否 < 2 像素?
  • 噪声:暗场噪声是否 < 2 LSB?FPN 是否已做校正?
  • 畸变:是否做过标定?畸变系数是否针对单个镜头?
一句话总结:采集质量决定了调优的天花板。光照、对焦、噪声、畸变,这四个点你花 80% 的精力去控制,后面 20% 的算法调优就能出 100% 的效果。反过来,前面偷懒,后面再怎么折腾也是事倍功半。