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 输出为单像素宽的二值边缘图,是后续轮廓提取的理想输入。
三、轮廓提取与拟合
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。流程如下:
- 采集图像,转灰度,用
cv2.GaussianBlur(gray,(5,5),1.4)降噪。 - 用
cv2.Canny(blur, 50, 150, L2gradient=True)得到边缘图。 - 用
cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)提取外轮廓,按面积排序取最大轮廓。 - 用
cv2.minAreaRect得到旋转矩形,读取宽高像素值,乘以 0.05 得到物理尺寸。 - 用
cv2.approxPolyDP以周长 2% 为 epsilon 逼近,若得到 4 个顶点则判定为矩形;若顶点数偏离,提示形状异常。 - 计算面积与周长,与标准值比较,超出公差则判 NG。
示例参数下,若 minAreaRect 返回宽 402 像素、高 198 像素,则物理尺寸约为 20.10 mm × 9.90 mm。若标准为 20.00 mm × 10.00 mm、公差 ±0.10 mm,则宽度超差 0.10 mm,处于临界,需要复检或调整阈值。实际项目中应先用标准件标定比例,再固定 Canny 阈值与 epsilon,保证重复性。
cv2.threshold 观察灰度直方图,或使用 Otsu 自动阈值作为 highThreshold 的参考,再按 1:2 或 1:3 设置 lowThreshold。对于反光金属件,先做 cv2.medianBlur 或 CLAHE 增强对比度,再进入 Canny。findContours 会得到多个碎片轮廓,导致尺寸测量失败,此时应优先修复边缘连续性,而不是直接拟合碎片。总结来看,Sobel 适合快速方向估计,Laplacian 适合细边缘与零交叉分析,Canny 是工业边缘检测的首选。轮廓提取把边缘点转为几何对象,拟合与多边形逼近把对象简化为可计算的直线、圆和顶点,几何特征计算则把像素转为物理尺寸。掌握这条链路,才能稳定完成零件尺寸测量与形状判定。