4. 边缘检测与分割:从像素到特征的实战之路

边缘检测和图像分割,说白了就是把一张照片里「哪里是缺陷、哪里是背景」给拎清楚。我做了这么多年材料检验,见过太多人一上来就调参数,结果边缘没找到,噪声倒是一大堆。今天咱们就把 Sobel、Canny、Laplacian 这三个算子,还有阈值分割和形态学操作,一个一个掰开揉碎了讲。

4.1 边缘检测三大算子:原理与实战对比

边缘是什么?就是图像中灰度值发生剧烈变化的地方。比如裂纹的边缘、气孔的边界。检测边缘,本质上就是求图像的梯度。

4.1.1 Sobel 算子:简单高效的梯度检测

Sobel 算子用两个 3×3 的卷积核,分别计算水平方向和垂直方向的梯度。我习惯叫它「一阶导数的近似」。

// 水平方向 Sobel 核
-1  0  1
-2  0  2
-1  0  1

// 垂直方向 Sobel 核
-1 -2 -1
 0  0  0
 1  2  1

最终边缘强度 = sqrt(Gx² + Gy²)。实际项目中,我经常用 Sobel 做预处理,因为它计算快,对噪声有一定抑制。但有个坑——它对斜向边缘的响应不够好。

我的经验:Sobel 适合做粗检,比如先快速定位可能有缺陷的区域,再用更精细的算子去确认。

4.1.2 Laplacian 算子:二阶导数的敏感者

Laplacian 算子是二阶导数算子。它不区分方向,直接检测灰度值的突变点。常用的核是:

 0 -1  0
-1  4 -1
 0 -1  0

Laplacian 对孤立点、细线的响应特别强。但问题也很明显——它对噪声极度敏感。我曾经在一个钢材表面缺陷检测项目里试过 Laplacian,结果把表面纹理全当成了边缘,误检率直接飙到 40%。

避坑指南:用 Laplacian 之前,一定要先做高斯滤波。我一般先做高斯模糊(σ=1.0~1.5),再用 Laplacian,效果会好很多。

4.1.3 Canny 算子:工业界的黄金标准

Canny 算子不是单一操作,而是一个完整的流程:

  1. 高斯滤波——去噪声
  2. 计算梯度幅值和方向——用 Sobel 算
  3. 非极大值抑制——只保留梯度方向上的局部最大值
  4. 双阈值检测——高阈值确定强边缘,低阈值连接弱边缘

Canny 是我在项目中用得最多的算子。它的双阈值机制特别实用——高阈值控制主要边缘,低阈值保证边缘连续性。我一般设高阈值 100~150,低阈值 30~50,具体看图像对比度。

核心对比:
  • Sobel:快,适合粗检,对噪声有一定鲁棒性
  • Laplacian:对细节敏感,但噪声放大严重
  • Canny:效果最好,但参数调起来最麻烦

4.2 阈值分割:把图像变成二值图

边缘检测完了,下一步就是把缺陷区域从背景里「切」出来。阈值分割是最直接的方法。

4.2.1 Otsu 阈值:自动寻找最佳分割点

Otsu 法基于一个简单的想法:让前景和背景的类间方差最大。它自动计算阈值,不需要人工干预。

我记得有一次做陶瓷基板的裂纹检测,光照条件不稳定,手动设阈值根本行不通。换成 Otsu 后,程序自己就能找到合适的阈值,准确率从 60% 提到了 85%。

// Otsu 阈值计算核心思路
1. 统计灰度直方图
2. 遍历所有灰度值(0~255)
3. 计算每个灰度值下的类间方差
4. 取类间方差最大的灰度值作为阈值
适用场景:图像直方图呈现明显的双峰分布时,Otsu 效果最好。如果直方图是单峰或平缓的,Otsu 可能会失效。

4.2.2 自适应阈值:应对光照不均

实际检验中,光照不均太常见了。比如金属表面的反光、曲面上的阴影。这时候全局阈值(包括 Otsu)都会出问题。

自适应阈值的做法是:把图像分成小块,每块单独计算阈值。我常用的参数是块大小 11×11,常数 C 取 2~5。

// 自适应阈值(均值法)
对每个像素 (x, y):
  1. 取周围 block_size × block_size 的邻域
  2. 计算邻域均值(或高斯加权均值)
  3. 阈值 = 均值 - C
  4. 如果像素值 > 阈值,设为 255;否则设为 0
避坑指南:块大小不能太小,否则会把噪声当成特征;也不能太大,否则就退化成全局阈值了。我一般从 11 开始试,根据缺陷尺寸调整。

4.3 形态学操作:让分割结果更干净

阈值分割后的二值图,往往有毛刺、空洞、孤立点。形态学操作就是用来处理这些问题的。

4.3.1 腐蚀与膨胀

操作 效果 典型应用
腐蚀 缩小前景区域,消除细小的连接 去除噪声点、分离粘连的缺陷
膨胀 扩大前景区域,填充小空洞 连接断裂的边缘、填补缺陷内部的空洞

腐蚀和膨胀的核心是结构元素(kernel)。我常用 3×3 的矩形核,偶尔用十字形或椭圆形,看缺陷形状。

4.3.2 开运算与闭运算

开运算 = 先腐蚀后膨胀。闭运算 = 先膨胀后腐蚀。

  • 开运算:去除细小的突出物,断开狭窄的连接。适合去除噪声点。
  • 闭运算:填充细小的空洞,连接邻近的物体。适合填补缺陷内部的断裂。

我处理金属表面气孔时,常用开运算去掉表面的灰尘噪声,再用闭运算把气孔内部的断裂边缘连起来。两步下来,缺陷轮廓就清晰多了。

实战口诀:
  • 去噪声、断粘连 → 开运算
  • 填空洞、连断裂 → 闭运算
  • 先开后闭 → 去噪+填充,最常用

4.4 本章知识体系总览

边缘检测与分割知识体系 边缘检测与分割 边缘检测算子 阈值分割 形态学操作 Sobel 算子 Laplacian 算子 Canny 算子 Otsu 阈值 自适应阈值 腐蚀 膨胀 开运算 / 闭运算 核心流程:原始图像 → 边缘检测 → 阈值分割 → 形态学处理 → 缺陷区域提取 实际项目中,Canny + Otsu + 开闭运算 是最常用的组合

4.5 实战建议与避坑总结

我的推荐组合:
  • 先做高斯滤波(σ=1.0~1.5)
  • 用 Canny 算子做边缘检测(高阈值 100~150,低阈值 30~50)
  • 用 Otsu 做全局阈值分割
  • 用开运算(3×3 矩形核)去噪声
  • 用闭运算(3×3 矩形核)填充空洞
常见坑:
  • 不滤波直接做 Laplacian → 噪声爆炸
  • Canny 双阈值设得太接近 → 边缘断裂严重
  • 自适应阈值块大小选错 → 要么漏检要么过检
  • 形态学操作次数太多 → 缺陷形状失真

嗯,这一章的内容就到这儿。边缘检测和分割是材料缺陷检验的基石,后面所有的特征提取、分类、测量,都建立在这些操作之上。把这一章吃透了,后面的路就好走了。