3. 图像采集与预处理:从相机参数到增强图像

图像采集这一步,说白了就是给应力双折射检测系统装上一双「眼睛」。我见过不少项目,算法再牛,前面图像没拍好,后面全是白费功夫。今天咱们就把这双「眼睛」怎么调、怎么洗、怎么聚焦,一次说透。

3.1 相机参数设置——别让硬件拖后腿

相机参数不是随便设的。应力双折射检测里,我们拍的是偏振光干涉条纹,对亮度、对比度、均匀性要求极高。我个人习惯,拿到相机第一件事,先关掉自动增益(AGC)和自动白平衡(AWB)。

⚠️ 重要提醒: 自动参数在静态场景下会引入帧间波动。你今天标定好的阈值,明天可能就因为光线变化全废了。

下面这张表,是我在多个项目里总结出来的推荐参数范围:

参数项 推荐值/范围 说明
曝光时间 10~50 ms 太长会模糊运动条纹,太短信噪比不够
增益 0~6 dB 超过6 dB,噪声会明显抬头
Gamma 1.0(关闭) 非线性校正会扭曲干涉条纹的灰度关系
分辨率 全分辨率或2×2 binning binning可提信噪比,但会降空间分辨率
帧率 与曝光时间匹配 确保每帧充分曝光,不丢帧

嗯,这里要注意:如果你用的是USB相机,别忘了检查带宽。我曾经在一个产线上遇到过,相机设了高帧率,结果USB带宽不够,图像出现撕裂——排查了整整两天才发现是线缆问题。

3.2 图像去噪——把底子擦干净

相机拍出来的原始图像,多少都有噪声。应力双折射检测里,噪声会直接干扰条纹的相位提取。我常用的去噪策略分三步:

  1. 时域平均:连续拍5~10帧取平均,消除随机噪声。适合静态样品。
  2. 中值滤波:核大小3×3或5×5,去除椒盐噪声,同时保留边缘。
  3. 高斯滤波:σ取0.8~1.5,平滑背景纹理,不破坏条纹结构。
💡 个人经验: 别一上来就用大核滤波。我见过有人用7×7高斯核,条纹边缘全糊了,相位解包直接失败。从3×3开始,不够再加。

代码实现也很简单,OpenCV里几行就搞定:

import cv2
import numpy as np

# 时域平均
frames = []
for i in range(10):
    ret, frame = cap.read()
    frames.append(frame.astype(np.float32))
img_avg = np.mean(frames, axis=0).astype(np.uint8)

# 中值滤波
img_median = cv2.medianBlur(img_avg, 3)

# 高斯滤波
img_gaussian = cv2.GaussianBlur(img_median, (3, 3), 0.8)

3.3 背景校正——消除系统误差

这一步很关键,但很多人会忽略。背景校正是为了消除照明不均匀、镜头渐晕、传感器暗电流等系统误差。

我常用的方法是「暗场-明场校正」:

  • 暗场图像:遮挡镜头,拍一张全黑图像,记录暗电流和固定模式噪声。
  • 明场图像:不放样品,拍一张均匀照明图像,记录照明分布和渐晕。

校正公式很简单:

I_corrected = (I_raw - I_dark) / (I_bright - I_dark) * 255

你想想看,如果照明不均匀,左边亮右边暗,那提取出来的应力分布肯定偏掉。我曾经在一个玻璃检测项目里,没做背景校正,结果应力分布图看起来像「阴阳脸」,后来加上这步,数据才正常。

✅ 关键点: 明场和暗场图像最好在每次检测前重新采集。环境温度变化、光源老化都会影响校正效果。

3.4 ROI提取——只关注该看的地方

整张图像里,真正有用的区域可能只占一小部分。ROI(感兴趣区域)提取能减少计算量,也能避免边缘伪影干扰。

我一般这样确定ROI:

  1. 自动定位:用边缘检测或模板匹配找到样品边界。
  2. 手动微调:在界面里留一个可拖拽的矩形框,方便操作员调整。
  3. 固定偏移:对于批量检测,样品位置固定后,ROI可以复用。

举个例子,如果样品是圆形玻璃片,我会先做霍夫圆检测,然后取内切矩形作为ROI:

# 霍夫圆检测
circles = cv2.HoughCircles(img_gaussian, cv2.HOUGH_GRADIENT, 1, 100)
if circles is not None:
    x, y, r = circles[0][0]
    roi = img_gaussian[int(y-r):int(y+r), int(x-r):int(x+r)]
⚠️ 避坑指南: 我曾经在ROI边界上吃过亏——样品边缘有倒角,倒角区域的应力分布和内部完全不同。如果ROI包含倒角,统计结果会失真。建议ROI向内收缩5~10个像素。

3.5 图像增强——让条纹更清晰

最后一步,图像增强。目的是让干涉条纹的对比度更高,边缘更锐利,方便后续的相位提取和应力计算。

我常用的增强手段:

方法 适用场景 参数建议
直方图均衡化 整体对比度低 限制对比度自适应直方图均衡化(CLAHE),clip limit=2.0
拉普拉斯锐化 条纹边缘模糊 核大小3×3,叠加系数0.5~1.0
同态滤波 照明不均匀残留 高通截止频率0.3~0.5
形态学操作 去除孤立噪点 开运算,核大小3×3

我个人最推荐CLAHE。它不会像普通直方图均衡化那样过度放大噪声,又能有效提升局部对比度。你看条纹检测里,暗区和亮区的细节都很重要,CLAHE刚好能兼顾。

# CLAHE增强
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
img_enhanced = clahe.apply(img_roi)

3.6 全流程知识图谱

下面这张图,把整个图像采集与预处理的流程串起来了。你可以把它贴在工位上,每次调试时对照着走一遍。

图像采集与预处理全流程 相机参数设置 图像去噪 背景校正 ROI提取 图像增强 预处理完成图像 关键参数 曝光:10~50 ms 增益:0~6 dB Gamma:1.0(关闭) 常用方法 去噪:中值+高斯 校正:暗场-明场 增强:CLAHE 避坑提醒 ROI向内收缩5~10像素 避免边缘倒角干扰
💡 我的习惯: 每次换光源或换样品批次,我都会重新走一遍这个流程。别嫌麻烦,前面省的时间,后面调试算法会加倍还回来。

好了,图像采集与预处理这部分就聊到这儿。记住一句话:好图像是检测成功的一半。参数调好了,噪声去干净了,背景校平了,ROI选准了,增强做对了——后面的相位提取和应力计算,就是水到渠成的事。