3. 图像采集与预处理:从相机参数到增强图像
图像采集这一步,说白了就是给应力双折射检测系统装上一双「眼睛」。我见过不少项目,算法再牛,前面图像没拍好,后面全是白费功夫。今天咱们就把这双「眼睛」怎么调、怎么洗、怎么聚焦,一次说透。
3.1 相机参数设置——别让硬件拖后腿
相机参数不是随便设的。应力双折射检测里,我们拍的是偏振光干涉条纹,对亮度、对比度、均匀性要求极高。我个人习惯,拿到相机第一件事,先关掉自动增益(AGC)和自动白平衡(AWB)。
下面这张表,是我在多个项目里总结出来的推荐参数范围:
| 参数项 | 推荐值/范围 | 说明 |
|---|---|---|
| 曝光时间 | 10~50 ms | 太长会模糊运动条纹,太短信噪比不够 |
| 增益 | 0~6 dB | 超过6 dB,噪声会明显抬头 |
| Gamma | 1.0(关闭) | 非线性校正会扭曲干涉条纹的灰度关系 |
| 分辨率 | 全分辨率或2×2 binning | binning可提信噪比,但会降空间分辨率 |
| 帧率 | 与曝光时间匹配 | 确保每帧充分曝光,不丢帧 |
嗯,这里要注意:如果你用的是USB相机,别忘了检查带宽。我曾经在一个产线上遇到过,相机设了高帧率,结果USB带宽不够,图像出现撕裂——排查了整整两天才发现是线缆问题。
3.2 图像去噪——把底子擦干净
相机拍出来的原始图像,多少都有噪声。应力双折射检测里,噪声会直接干扰条纹的相位提取。我常用的去噪策略分三步:
- 时域平均:连续拍5~10帧取平均,消除随机噪声。适合静态样品。
- 中值滤波:核大小3×3或5×5,去除椒盐噪声,同时保留边缘。
- 高斯滤波:σ取0.8~1.5,平滑背景纹理,不破坏条纹结构。
代码实现也很简单,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:
- 自动定位:用边缘检测或模板匹配找到样品边界。
- 手动微调:在界面里留一个可拖拽的矩形框,方便操作员调整。
- 固定偏移:对于批量检测,样品位置固定后,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)]
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选准了,增强做对了——后面的相位提取和应力计算,就是水到渠成的事。