4. 边缘检测与轮廓分析

在工业视觉中,边缘与轮廓是尺寸测量、定位、缺陷检测的基础。边缘检测负责把灰度突变变成“边缘点”,轮廓分析则把这些点组织成可计算、可拟合、可测量的几何对象。本节围绕 Sobel、Laplacian、Canny 三类算子,以及轮廓提取、拟合、多边形逼近和几何特征计算,最后落到一个零件尺寸测量案例。

一、梯度算子:Sobel 与 Laplacian 的定位差异

Sobel 属于一阶微分算子,通过水平与垂直方向的卷积核近似梯度。以 3×3 核为例,水平方向核为 [[-1,0,1],[-2,0,2],[-1,0,1]],垂直方向核为 [[-1,-2,-1],[0,0,0],[1,2,1]]。对图像 I 分别卷积得到 Gx、Gy,梯度幅值 G = sqrt(Gx² + Gy²),方向 θ = atan2(Gy, Gx)。Sobel 对噪声有一定平滑作用,边缘较粗,适合快速定位和方向估计,但边缘位置精度有限。

Laplacian 是二阶微分算子,常用核为 [[0,1,0],[1,-4,1],[0,1,0]] 或含对角项的 [[1,1,1],[1,-8,1],[1,1,1]]。它检测的是灰度二阶导数的零交叉,对细边缘和孤立点敏感,但噪声放大明显。工业中通常先做高斯平滑再求 Laplacian,即 LoG(高斯拉普拉斯),用 cv2.GaussianBlur 后接 cv2.Laplacian,或直接用 cv2.Canny 内部完成平滑与双阈值处理。

二、Canny:工业边缘检测的主力

Canny 把边缘检测拆成四步:高斯滤波降噪、计算梯度幅值与方向、非极大值抑制(NMS)细化边缘、双阈值滞后连接。双阈值中,高于 highThreshold 的强边缘直接保留,低于 lowThreshold 的丢弃,介于两者之间的弱边缘只有与强边缘连通时才保留。典型比例 low:high = 1:2 或 1:3。在 OpenCV 中调用:

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5,5), 1.4)
edges = cv2.Canny(blur, 50, 150, apertureSize=3, L2gradient=True)

参数选择上,apertureSize 取 3 或 5,L2gradient=True 使用更精确的平方根幅值。若边缘断裂,降低 lowThreshold;若噪声过多,提高 highThreshold 或增大高斯核。Canny 输出为单像素宽的二值边缘图,是后续轮廓提取的理想输入。

边缘检测与轮廓分析处理链 灰度图像 8-bit 单通道 高斯滤波 (5,5), σ=1.4 Sobel 一阶梯度 Gx, Gy → 幅值/方向 Laplacian 二阶 零交叉,噪声敏感 Canny 四步法 NMS + 双阈值滞后 二值边缘图 单像素宽 轮廓提取 findContours 拟合/多边形逼近 直线/圆/approxPolyDP 几何特征计算 面积/周长/角度/尺寸 关键参数与作用 • Canny: low=50, high=150 • Sobel: ksize=3, 方向 Gx/Gy • Laplacian: ksize=3, 先高斯平滑 • approxPolyDP: epsilon=2% 周长 • 轮廓检索: RETR_EXTERNAL 结果判读要点 边缘断裂 → 降低 lowThreshold 或增大高斯核 噪声过多 → 提高 highThreshold 或先中值滤波 轮廓不闭合 → 检查阈值与形态学闭运算

三、轮廓提取与拟合

Canny 得到的是边缘点集合,要变成可测量的几何对象,需要 cv2.findContours。OpenCV 4.x 返回 contours, hierarchy 两个值。常用检索模式:RETR_EXTERNAL 只取最外层轮廓,适合零件外轮廓测量;RETR_LIST 取全部轮廓;RETR_TREE 建立层级关系,适合孔洞分析。轮廓近似方法用 CHAIN_APPROX_SIMPLE 压缩水平、垂直、对角线段,只保留端点,显著减少点数。

得到轮廓后,常用拟合方式有三类:最小外接矩形 cv2.minAreaRect 返回中心、宽高、旋转角,适合矩形零件;最小外接圆 cv2.minEnclosingCircle 返回圆心与半径,适合圆形零件;直线拟合 cv2.fitLine 用最小二乘或 Huber 稳健方法拟合边缘直线,适合直线度评估。多边形逼近 cv2.approxPolyDP 通过 epsilon 控制逼近精度,epsilon 越大,保留顶点越少。经验上取轮廓周长的 1%~3%,例如周长 800 像素时 epsilon ≈ 8~24。

四、几何特征计算

轮廓本身可计算面积 cv2.contourArea、周长 cv2.arcLength、外接矩形 cv2.boundingRect、最小外接矩形、最小外接圆、凸包 cv2.convexHull 与凸性缺陷 cv2.convexityDefects。若已知标定比例,例如 1 像素 = 0.05 mm,则像素尺寸乘以比例即得物理尺寸。角度计算可用三点法:取轮廓上三个点 A、B、C,向量 BA 与 BC 的夹角 θ = arccos((BA·BC)/(|BA||BC|)),再转为角度值。

五、零件尺寸测量案例

假设检测一个矩形金属垫片,视野中标定比例为 0.05 mm/pixel。流程如下:

  1. 采集图像,转灰度,用 cv2.GaussianBlur(gray,(5,5),1.4) 降噪。
  2. 用 cv2.Canny(blur, 50, 150, L2gradient=True) 得到边缘图。
  3. 用 cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 提取外轮廓,按面积排序取最大轮廓。
  4. 用 cv2.minAreaRect 得到旋转矩形,读取宽高像素值,乘以 0.05 得到物理尺寸。
  5. 用 cv2.approxPolyDP 以周长 2% 为 epsilon 逼近,若得到 4 个顶点则判定为矩形;若顶点数偏离,提示形状异常。
  6. 计算面积与周长,与标准值比较,超出公差则判 NG。

示例参数下,若 minAreaRect 返回宽 402 像素、高 198 像素,则物理尺寸约为 20.10 mm × 9.90 mm。若标准为 20.00 mm × 10.00 mm、公差 ±0.10 mm,则宽度超差 0.10 mm,处于临界,需要复检或调整阈值。实际项目中应先用标准件标定比例,再固定 Canny 阈值与 epsilon,保证重复性。

Canny 阈值不要凭感觉固定。建议先用 cv2.threshold 观察灰度直方图,或使用 Otsu 自动阈值作为 highThreshold 的参考,再按 1:2 或 1:3 设置 lowThreshold。对于反光金属件,先做 cv2.medianBlur 或 CLAHE 增强对比度,再进入 Canny。
Laplacian 对噪声非常敏感,工业现场不建议直接对原始灰度图使用。若必须使用,应先做高斯平滑,并检查零交叉点是否形成闭合轮廓。轮廓提取时若边缘断裂,findContours 会得到多个碎片轮廓,导致尺寸测量失败,此时应优先修复边缘连续性,而不是直接拟合碎片。

总结来看,Sobel 适合快速方向估计,Laplacian 适合细边缘与零交叉分析,Canny 是工业边缘检测的首选。轮廓提取把边缘点转为几何对象,拟合与多边形逼近把对象简化为可计算的直线、圆和顶点,几何特征计算则把像素转为物理尺寸。掌握这条链路,才能稳定完成零件尺寸测量与形状判定。