边缘检测:从 Sobel 到 Canny

核心01-图像与基础处理预计 25 分钟边缘梯度CannySobel

前置知识点

kp-002 滤波与卷积

一句话定义

边缘是图像亮度发生剧烈变化的位置,边缘检测用梯度算子定位这些位置,Canny 算法再通过非极大值抑制与双阈值滞后把梯度图变成干净的细边缘。

为什么重要

边缘是物体轮廓、纹理边界与深度突变在图像上最直接的投影;它既是传统视觉(角点检测、霍夫变换、分割)的输入,也是理解「深度网络到底在低层学到什么」的参照系——CNN 第一层卷积核可视化出来就是各种方向的边缘滤波器。

直观类比

沿着一条道路走(扫描图像),亮度像台阶一样突然跳变的位置就是边缘;Sobel 负责发现「这里有个台阶、朝哪个方向」,Canny 负责把同一级台阶重复报警的邻居只留一个,再用两道门槛判断这级台阶值不值得记下来。

前置知识

kp-002(卷积与核)。

核心概念

原理与机制

梯度由两个方向的差分核卷积得到;理想阶跃边缘的导数是冲激,因此「找导数极大值」等价于「找边缘」。直接差分对噪声敏感,Canny 在推导中把「好检测、好定位、单响应」三个准则形式化为一个最优化问题,结论是先用高斯平滑再求导,近似等价于高斯一阶导数算子。非极大值抑制把每个像素的梯度方向量化到 0/45/90/135 度四个扇区,只在同方向邻域内比较幅值;双阈值后从强边缘点出发、沿 8 邻域把相连的弱边缘点并入。

公式与模型

Gx = Sobel_x * I Gy = Sobel_y * I M(x, y) = √(Gx² + Gy²) θ(x, y) = atan2(Gy, Gx)

Sobel_x 核:[[-1, 0, +1], [-2, 0, +2], [-1, 0, +1]];Sobel_y 为其转置。幅值 M 越大越像边缘,方向 θ 垂直于边缘走向。

图示

高斯平滑 梯度计算 非极大值抑制 双阈值滞后 亮度阶跃 → 梯度向量垂直于边缘、指向变亮方向

实例与案例

工业零件尺寸测量:打光后零件与背景形成强边缘,Canny 边缘 + 轮廓拟合即可亚像素级测宽。文档扫描 App 的自动裁边同样是 Canny 找到纸张四条直线边后求交点。深度学习时代边缘检测(如 HED 网络)在多尺度上学习边缘概率图,但 Canny 仍是零成本、可解释的基线。

import cv2
blur = cv2.GaussianBlur(gray, (3, 3), 0)
edges = cv2.Canny(blur, threshold1=60, threshold2=150)   # 低/高阈值约 1:2 到 1:3

常见误区

与其他知识点的关系

边缘梯度是 kp-006 Harris 角点的原材料(角点 = 两方向梯度都大);kp-022 光流方程里的 Ix、Iy 同样来自梯度估计。

自测题

  1. Canny 中低阈值过高或过低分别会怎样?

答案要点:过高则边缘断裂;过低则把噪声弱边缘接进来,边缘变毛。

  1. 为什么 Sobel 核比简单差分更常用?

答案要点:它内置中心行/列加权,相当于先做一次平滑再差分,抗噪更好。

  1. 非极大值抑制沿什么方向比较?

答案要点:沿梯度方向(垂直于边缘走向),保留幅值局部最大的点以获得单像素宽边缘。

延伸阅读

相关知识点

kp-006 角点检测:Harris 与 Shi-Tomasikp-022 光流与视频运动分析