3. 图像预处理与增强
工业视觉系统的成像环节往往受光源角度、镜头畸变、工件表面反光、粉尘油污等因素影响,相机采集到的原始图像很少能直接送入检测算法。预处理与增强的目标不是"让图好看",而是把对检测有用的信息放大、把干扰信息压制,使后续的定位、测量、缺陷分割在稳定的输入上工作。本节按"灰度变换 → 直方图均衡 → 滤波去噪 → 形态学操作 → ROI 提取"这条处理链展开,并给出针对典型工业缺陷的预处理策略。
一、灰度变换:先把对比度调到可用区间
灰度变换是逐像素的点运算,输出只取决于输入灰度值,不依赖邻域。最常用的是线性拉伸与 Gamma 校正。线性拉伸把原图中关心的灰度区间 [a, b] 映射到 [0, 255]:
g(x,y) = clip( ( f(x,y) - a ) * 255 / ( b - a ), 0, 255 )
例如某金属件图像中,背景灰度集中在 30~60,缺陷区域在 90~130,其余为高亮反光。取 a=80, b=140 做拉伸,缺陷与背景的灰度差从约 60 扩大到约 200,阈值分割的稳定性显著提升。Gamma 校正 g = 255 * (f/255)^γ 用于非线性调整:γ < 1 提亮暗部,适合暗背景上的弱缺陷;γ > 1 压暗亮部,适合抑制过曝反光。OpenCV 中可用 cv2.convertScaleAbs 做线性变换,Gamma 校正则通过查表 cv2.LUT 实现,避免逐像素幂运算。
二、直方图均衡:全局与局部两种思路
直方图均衡通过累积分布函数把灰度重新分布,使输出直方图接近均匀,从而提升整体对比度。全局均衡 cv2.equalizeHist 计算简单,但当图像中存在大面积均匀背景时,背景会占据大量灰度级,真正关心的缺陷区域反而被压缩。工业场景更常用 CLAHE(限制对比度的自适应直方图均衡):把图像划分为若干网格(如 8×8),对每个网格单独均衡,并用 clipLimit 限制对比度放大倍数,再对块边界做双线性插值消除块效应。
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
enhanced = clahe.apply(gray)
经验上,clipLimit 取 2.0~4.0、网格 8×8 是工业图像的稳妥起点;若缺陷极细小,可减小网格到 4×4 以增强局部细节,但噪声也会同步放大,需配合后续滤波。
三、滤波去噪:按噪声类型选滤波器
工业图像常见三类噪声:高斯噪声(传感器热噪声)、椒盐噪声(传输误码、坏点)、周期性条纹(工频干扰、机械振动)。选择依据是噪声统计特性与边缘保留需求:
- 高斯滤波:对高斯噪声有效,核越大越平滑,但边缘模糊越严重。适合作为通用预平滑。
- 中值滤波:对椒盐噪声几乎是最优选择,3×3 或 5×5 核即可去除孤立亮点/暗点,且对边缘损伤小。
- 双边滤波:同时考虑空间距离与灰度差,能在平滑噪声的同时保留边缘,代价是速度较慢,适合对边缘精度要求高的测量任务。
- 形态学滤波:开运算去亮噪点、闭运算去暗噪点,见下一节。
一个实用的判断方法是先观察噪声的空间尺度:若噪点尺寸为 1~2 像素,中值滤波最直接;若噪声呈细密颗粒状且分布均匀,高斯滤波更合适。滤波核尺寸一般不超过待检缺陷最小尺寸的 1/3,否则缺陷本身会被抹掉。
四、形态学操作:结构元决定效果
形态学操作基于结构元(kernel)在图像上滑动,腐蚀使亮区域收缩、膨胀使亮区域扩张。开运算(先腐蚀后膨胀)去除小于结构元的亮斑,闭运算(先膨胀后腐蚀)填补小于结构元的暗孔。工业中常见用法:
- 用 3×3 矩形核开运算去除焊点图像中的毛刺与孤立亮点;
- 用 5×5 椭圆核闭运算连接断裂的划痕,使其成为连续区域便于测量长度;
- 用形态学梯度(膨胀减腐蚀)提取边缘轮廓,作为粗定位的输入。
结构元的形状要与目标几何匹配:检测圆形缺陷用椭圆核,检测直线划痕用水平或垂直长条核。核尺寸应略大于待去除噪声、略小于待保留目标。
五、ROI 提取:把算力花在刀刃上
工业图像中往往只有一小块区域包含待检目标。ROI 提取既减少计算量,也避免背景干扰。常用方式有三种:固定矩形 ROI(适用于工件位置由夹具保证的场合)、基于模板匹配的动态 ROI(先匹配定位标记,再按偏移量截取)、基于轮廓的 ROI(用 cv2.findContours 找到目标外接矩形或最小外接圆)。ROI 坐标必须与后续测量坐标系一致,若做过旋转校正,需同步记录变换矩阵,否则测量结果会出现系统性偏移。
六、常见缺陷与预处理策略对照
不同缺陷对预处理链的要求差异很大,下表给出典型对应关系(参数为示例起点,需按实际成像调整):
| 缺陷类型 | 成像特征 | 推荐预处理链 | 示例参数 |
|---|---|---|---|
| 表面划痕 | 细长暗线,对比度低 | CLAHE → 中值滤波 → 闭运算 | clipLimit=3.0, 3×3 中值, 5×5 椭圆核 |
| 孔洞/砂眼 | 局部暗斑,边缘模糊 | 高斯滤波 → 线性拉伸 → 开运算 | 5×5 高斯, a=40 b=120, 3×3 矩形核 |
| 反光过曝 | 高亮区域丢失细节 | Gamma 校正(γ>1)→ 双边滤波 | γ=1.8, d=9, sigmaColor=75 |
| 椒盐噪点 | 孤立黑白像素 | 中值滤波 → 形态学开闭 | 3×3 中值, 3×3 核 |
| 周期性条纹 | 等间距明暗带 | 频域陷波或方向滤波 → 均衡 | 按条纹频率设计陷波 |
七、处理链的整体关系
下图把本节各环节按数据流与作用关系组织起来,左侧为输入与灰度变换,中部为增强与去噪,右侧为形态学与 ROI,底部给出缺陷类型到策略的映射方向。图中箭头表示数据流向,虚线表示策略选择关系。
实际工程中,预处理链的参数不应凭经验一次定死,而应结合检测结果反向调优:若缺陷漏检,检查是否被滤波抹掉或对比度不足;若误检增多,检查噪声是否被增强或形态学核过大。建议对同一批样本保存"原图—中间结果—最终掩膜"三张图,便于定位问题出现在链路的哪一环。