Canny 边缘检测算法是由 John F. Canny 于 1986 年提出的一种多阶段边缘检测算法,被广泛认为是 “最优边缘检测算法”(满足低错误率、高定位精度、单边缘响应三大准则)。其核心原理是通过多步骤处理,从图像中精准提取边缘,同时有效抑制噪声。
Canny 算法的核心步骤(分 4 阶段)
1. 高斯滤波(去噪预处理)
边缘检测对噪声非常敏感(噪声会被误判为边缘),因此第一步需要通过高斯滤波平滑图像,减少高频噪声干扰。
原理:使用高斯核(二维高斯函数)与原始图像进行卷积。高斯核的本质是对图像中每个像素的邻域像素进行加权平均,距离中心越近的像素权重越高,从而 “模糊” 图像、抑制噪声。
高斯核公式:
其中,是高斯核的标准差(控制模糊程度,
越大,图像越模糊,去噪能力越强,但可能丢失细节边缘)。
操作:根据需求选择合适大小的高斯核(如 3×3、5×5),与图像卷积后得到平滑图像。
2. 计算梯度幅值与方向
边缘的本质是图像中灰度值突变的区域(梯度较大的位置)。这一步通过计算像素的梯度幅值(强度)和方向,定位潜在边缘。
梯度计算:使用一阶差分算子(常用 Sobel 算子)分别计算图像在水平(\(x\) 方向)和垂直(\(y\) 方向)的梯度。
Sobel 算子(3×3):
(检测垂直边缘,对水平变化敏感)
(检测水平边缘,对垂直变化敏感)
与平滑后的图像卷积,得到 x方向梯度 gx和 y方向梯度 gy。
梯度幅值:综合 gx和 gy的强度,公式为:
幅值越大,该像素越可能是边缘。
梯度方向:表示灰度变化的方向(垂直于边缘方向),公式为:
为简化计算,通常将方向量化为 4 个主方向(0°、45°、90°、135°),即分别对应水平、对角线、垂直、反对角线方向。
3. 非极大值抑制(细化边缘)
经过步骤 2 得到的梯度幅值可能对应 “宽边缘”(多个相邻像素都有较高梯度),而非极大值抑制的作用是 “细化边缘”—— 只保留梯度方向上的局部最大值,将宽边缘压缩为 1 个像素宽度的细边缘。
操作逻辑:
对每个像素,根据其梯度方向,判断其是否为该方向上相邻两个像素中的最大值:
若当前像素的梯度幅值是邻域内的最大值,则保留(可能为边缘);
若不是,则抑制(设为 0,排除)。
示例:若梯度方向为 90°(垂直方向),则比较当前像素与上下相邻像素的梯度幅值;若方向为 45°,则比较当前像素与左上、右下相邻像素的幅值。
4. 双阈值检测与边缘连接
经过非极大值抑制后,仍可能存在由噪声或纹理导致的 “假边缘”。双阈值检测通过设置两个阈值(高阈值 H和低阈值 L,筛选出 “确定边缘” 和 “潜在边缘”,并通过连接规则保留真实边缘。
阈值设置:通常 H:L 为 2:1 或 3:1(如 H=0.3,L=0.1,基于梯度幅值的归一化范围)。
筛选规则:
梯度幅值 > H:强边缘(确定为真实边缘,直接保留);
梯度幅值 < L:弱边缘(判定为噪声,直接抑制);
L ≤梯度幅值 ≤H:候选边缘(需进一步判断是否与强边缘连通,连通则保留,否则抑制)。
边缘连接:通过 8 邻域搜索,将与强边缘连通的候选边缘标记为边缘,最终形成完整的边缘轮廓。
Canny 算法的优势
低错误率:能有效检测真实边缘,减少假阳性(误判噪声为边缘)和假阴性(漏检真实边缘);
高定位性:检测到的边缘与真实边缘位置偏差小;
单边缘响应:每个真实边缘仅被标记一次(通过非极大值抑制避免重复标记)。
综上,Canny 算法通过 “去噪→梯度计算→边缘细化→阈值筛选” 四步,实现了对图像边缘的精准提取,是计算机视觉中边缘检测的经典方法。