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 做预处理,因为它计算快,对噪声有一定抑制。但有个坑——它对斜向边缘的响应不够好。
4.1.2 Laplacian 算子:二阶导数的敏感者
Laplacian 算子是二阶导数算子。它不区分方向,直接检测灰度值的突变点。常用的核是:
0 -1 0
-1 4 -1
0 -1 0
Laplacian 对孤立点、细线的响应特别强。但问题也很明显——它对噪声极度敏感。我曾经在一个钢材表面缺陷检测项目里试过 Laplacian,结果把表面纹理全当成了边缘,误检率直接飙到 40%。
4.1.3 Canny 算子:工业界的黄金标准
Canny 算子不是单一操作,而是一个完整的流程:
- 高斯滤波——去噪声
- 计算梯度幅值和方向——用 Sobel 算
- 非极大值抑制——只保留梯度方向上的局部最大值
- 双阈值检测——高阈值确定强边缘,低阈值连接弱边缘
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. 取类间方差最大的灰度值作为阈值
4.2.2 自适应阈值:应对光照不均
实际检验中,光照不均太常见了。比如金属表面的反光、曲面上的阴影。这时候全局阈值(包括 Otsu)都会出问题。
自适应阈值的做法是:把图像分成小块,每块单独计算阈值。我常用的参数是块大小 11×11,常数 C 取 2~5。
// 自适应阈值(均值法)
对每个像素 (x, y):
1. 取周围 block_size × block_size 的邻域
2. 计算邻域均值(或高斯加权均值)
3. 阈值 = 均值 - C
4. 如果像素值 > 阈值,设为 255;否则设为 0
4.3 形态学操作:让分割结果更干净
阈值分割后的二值图,往往有毛刺、空洞、孤立点。形态学操作就是用来处理这些问题的。
4.3.1 腐蚀与膨胀
| 操作 | 效果 | 典型应用 |
|---|---|---|
| 腐蚀 | 缩小前景区域,消除细小的连接 | 去除噪声点、分离粘连的缺陷 |
| 膨胀 | 扩大前景区域,填充小空洞 | 连接断裂的边缘、填补缺陷内部的空洞 |
腐蚀和膨胀的核心是结构元素(kernel)。我常用 3×3 的矩形核,偶尔用十字形或椭圆形,看缺陷形状。
4.3.2 开运算与闭运算
开运算 = 先腐蚀后膨胀。闭运算 = 先膨胀后腐蚀。
- 开运算:去除细小的突出物,断开狭窄的连接。适合去除噪声点。
- 闭运算:填充细小的空洞,连接邻近的物体。适合填补缺陷内部的断裂。
我处理金属表面气孔时,常用开运算去掉表面的灰尘噪声,再用闭运算把气孔内部的断裂边缘连起来。两步下来,缺陷轮廓就清晰多了。
- 去噪声、断粘连 → 开运算
- 填空洞、连断裂 → 闭运算
- 先开后闭 → 去噪+填充,最常用
4.4 本章知识体系总览
4.5 实战建议与避坑总结
- 先做高斯滤波(σ=1.0~1.5)
- 用 Canny 算子做边缘检测(高阈值 100~150,低阈值 30~50)
- 用 Otsu 做全局阈值分割
- 用开运算(3×3 矩形核)去噪声
- 用闭运算(3×3 矩形核)填充空洞
- 不滤波直接做 Laplacian → 噪声爆炸
- Canny 双阈值设得太接近 → 边缘断裂严重
- 自适应阈值块大小选错 → 要么漏检要么过检
- 形态学操作次数太多 → 缺陷形状失真
嗯,这一章的内容就到这儿。边缘检测和分割是材料缺陷检验的基石,后面所有的特征提取、分类、测量,都建立在这些操作之上。把这一章吃透了,后面的路就好走了。