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,底部给出缺陷类型到策略的映射方向。图中箭头表示数据流向,虚线表示策略选择关系。

工业图像预处理与增强处理链 原始图像 灰度 / 彩色 灰度变换 线性拉伸 / Gamma 直方图均衡 全局 / CLAHE 滤波去噪 高斯 / 中值 / 双边 形态学操作 开 / 闭 / 梯度 ROI 提取 矩形 / 匹配 / 轮廓 预处理结果 送入检测算法 缺陷类型 → 预处理策略映射 划痕 / 裂纹 孔洞 / 砂眼 反光过曝 椒盐噪点 周期性条纹 CLAHE+闭运算 高斯+拉伸+开 Gamma+双边 中值+形态学 频域陷波+均衡 数据流 策略选择

实际工程中,预处理链的参数不应凭经验一次定死,而应结合检测结果反向调优:若缺陷漏检,检查是否被滤波抹掉或对比度不足;若误检增多,检查噪声是否被增强或形态学核过大。建议对同一批样本保存"原图—中间结果—最终掩膜"三张图,便于定位问题出现在链路的哪一环。

ROI 提取后若对 ROI 单独做直方图均衡,其灰度分布与全图不同,阈值也会随之变化。若后续算法使用固定阈值,必须保证 ROI 的成像条件一致,否则应改用自适应阈值或对全图统一增强后再截取 ROI。