3. 边缘检测基础:经典边缘检测算子(Sobel、Canny)、边缘定位的像素级精度局限
边缘检测,说白了就是找到图像中灰度变化最剧烈的地方。你想想看,我们做视觉测量,最终要测的是尺寸、是距离,而这些都离不开边缘。没有准确的边缘,后面的亚像素精度就是空中楼阁。
我个人习惯把边缘检测比作「找边界」。就像你画一幅画,先得把轮廓勾出来,对吧?在图像里,边缘就是物体和背景的分界线。今天咱们就聊聊两个最经典的算子:Sobel 和 Canny,顺便聊聊为什么像素级精度不够用。
核心观点:边缘检测是视觉测量的第一步,也是决定测量精度上限的关键。像素级定位只是起点,不是终点。
3.1 Sobel 算子:简单但够用
Sobel 算子是最基础的边缘检测方法之一。它通过计算图像在 x 和 y 方向上的梯度,来找到边缘的位置。
我记得刚入行那会儿,第一个项目就是做 PCB 板上的焊盘定位。当时用的就是 Sobel,效果还不错。它的原理其实很简单:用一个 3x3 的卷积核,分别对图像做水平和垂直方向的卷积。
水平方向的 Sobel 核长这样:
Gx = [[-1, 0, 1],
[-2, 0, 2],
[-1, 0, 1]]
垂直方向的 Sobel 核:
Gy = [[-1, -2, -1],
[ 0, 0, 0],
[ 1, 2, 1]]
然后,每个像素的梯度幅值就是:
G = sqrt(Gx^2 + Gy^2)
嗯,这里要注意:Sobel 算子的优点是计算快、实现简单。但缺点也很明显——它对噪声比较敏感,而且边缘定位精度只能到像素级。
我的经验:在光照稳定的场景下,Sobel 完全够用。但如果现场有反光或者阴影,我建议你先做一下高斯滤波,否则边缘会「毛刺」很多。
3.2 Canny 算子:更精细的选择
Canny 算子可以说是边缘检测里的「扛把子」。它比 Sobel 复杂,但效果也更好。Canny 的核心思想是:不仅要找到边缘,还要找到「真正的」边缘。
Canny 的流程大致分四步:
- 高斯滤波:先平滑图像,去除噪声
- 计算梯度:用 Sobel 或其他算子算梯度幅值和方向
- 非极大值抑制:只保留梯度方向上的局部最大值
- 双阈值检测:用高低两个阈值,筛选出真正的边缘
我曾经在一个精密零件测量项目中,试过 Sobel 和 Canny 的对比。Sobel 出来的边缘断断续续,而 Canny 的结果就干净很多。为什么?因为 Canny 的双阈值机制能有效过滤掉噪声引起的假边缘。
避坑指南:我曾经因为 Canny 的阈值设得太低,导致边缘检测结果里全是噪点。后来我总结了一个经验:高阈值一般设为低阈值的 2-3 倍,具体数值要根据图像对比度来调。
3.3 像素级精度的局限
好了,现在问题来了。不管是 Sobel 还是 Canny,它们找到的边缘位置,精度都只能到像素级。什么意思?就是边缘坐标只能是整数,比如 (100, 200) 或者 (101, 200)。
你想想看,一个像素在物理世界可能对应 0.1mm 甚至更小。如果边缘定位只能到像素级,那测量精度也就被锁死在 0.1mm 了。对于很多工业测量场景,这远远不够。
为什么会这样?因为经典边缘检测算子本质上是在离散的像素网格上做运算。每个像素的坐标都是整数,梯度计算也是基于整数位置的像素值。所以最终找到的边缘位置,自然也只能是整数。
我举个例子:假设一个物体的真实边缘在 100.3 像素的位置,但 Sobel 或 Canny 只能告诉你「边缘在第 100 个像素附近」。这个 0.3 像素的误差,在精密测量中可能就是致命的。
| 检测方法 | 定位精度 | 适用场景 |
|---|---|---|
| Sobel | 像素级 | 粗定位、快速检测 |
| Canny | 像素级 | 精细边缘提取 |
| 亚像素方法 | 0.1~0.01 像素 | 高精度测量 |
所以,如果你做的是视觉测量,像素级边缘检测只是第一步。后面我们还需要用亚像素方法,把边缘定位精度提升到 0.1 甚至 0.01 像素。这也是为什么我在这门课里,把边缘检测放在前面讲——它是基础,但不是终点。
一句话总结:Sobel 和 Canny 能帮你找到边缘,但精度不够。想要高精度测量,必须上亚像素方法。
3.4 本章知识体系
下面这张图,是我自己画的本章知识结构。你可以看到,边缘检测从 Sobel 到 Canny,再到像素级局限,是一条清晰的逻辑链。
从这张图你可以看到,Sobel 和 Canny 各有优劣,但最终都指向同一个问题:像素级精度不够。这也是为什么我们后面要花大量篇幅讲亚像素方法。
我的建议:在实际项目中,我通常先用 Canny 做粗定位,再用亚像素方法做精定位。这样既保证了边缘的连续性,又提升了测量精度。
公众号:蓝海资料掘金营,微信deep3321