本节摘要:SOURCE 4.2:Sobel/Prewitt/Roberts 梯度法与 Canny 四步(高斯、梯度、NMS、双阈值)。本节动手调 Canny
threshold1/2与 Sobel 对比。
import cv2 import numpy as np img = cv2.imread('shape.png', 0) sobel = cv2.Sobel(img, cv2.CV_64F, 1, 1, ksize=3) sobel = cv2.convertScaleAbs(sobel)
梯度幅值大 = 灰度突变 = 潜在边缘。
blur = cv2.GaussianBlur(img, (5,5), 1.4) edges = cv2.Canny(blur, 50, 150)

| low | high | 现象 |
|---|---|---|
| 30 | 90 | 边多、噪点多 |
| 100 | 200 | 边断、漏检 |
经验:high ≈ 2–3× low。
HoughCircles 前置 Canny⚠️ 常见坑:原图未高斯 — Canny 满屏碎边。
💡 关键直觉:Canny 是多阶段决策 — 工业常用默认参数起点。
下一节区域生长。
边缘是灰度发生突变的位置,数学上对应梯度幅值较大的点。一阶方法(Sobel、Prewitt、Scharr)计算梯度幅值,超过阈值即为边缘;二阶方法(拉普拉斯)找灰度二阶导的过零点。Sobel 核的特点是中间行(列)权重更大,对噪声更稳健;Scharr 是增强版 Sobel,对小角度边缘响应更稳定,通常更推荐。梯度类方法的问题:梯度幅值对边缘粗细不敏感,直接阈值会得到"宽边缘带",需要非极大值抑制细化。
import cv2, numpy as np # 分方向计算梯度,再合成幅值(比单次 1,1 更准确) gx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3) gy = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3) mag = cv2.magnitude(gx, gy) angle = cv2.phase(gx, gy, angleInDegrees=True) # 边缘方向
Canny 的成功在于它不是单一算子,而是把"去噪、求梯度、细化、连通决策"串成完整流水线。第一步高斯平滑抑制噪声(噪声会让梯度响应混乱);第二步 Sobel 求梯度幅值和方向;第三步非极大值抑制(NMS)沿梯度方向只保留局部最大值,把宽边缘带细化成单像素线;第四步双阈值滞后:高于高阈值的必为强边缘,低于低阈值的丢弃,介于两者之间的只在与强边缘相连时才保留。双阈值解决"单阈值要么漏断边要么多碎边"的矛盾——用高阈值抓确定边缘,用低阈值补连它的弱边缘。
low/high 的经验比例是 1:2 到 1:3,起点可用 (50, 150)。high 太高会漏边(边缘断裂),太低会引入大量纹理响应;low 决定弱边缘的敏感度,影响碎边和噪声边缘的数量。输入图像若是彩色要先转灰度;边缘检测前过度平滑会丢失细小目标边缘,平滑不足则碎边遍地——Canny 内部已有高斯,外层不必再额外模糊,直接调内部参数即可。检测完的边缘常作为轮廓提取(findContours)和霍夫变换(HoughLines/HoughCircles)的输入,注意边缘是像素线、轮廓是闭合区域,两者概念不同。
NMS 的直观理解值得展开:梯度方向垂直于边缘,所以"沿梯度方向"即"横跨边缘"的方向。在此方向上取局部最大,意味着只保留"最像边缘的那条脊线"上的点,两侧响应较大的邻居被压掉,边缘就细下来了。这也是 Sobel 直接阈值输出粗边而 Canny 输出细边的原因。
实验建议:固定 high=150,把 low 依次设为 20、50、80,观察边缘从"多而碎"到"少而断"的变化;再把一张噪声图直接跑 Canny(不预平滑)和先平滑再 Canny 对比。这组实验能帮你直观理解 Canny 每个阶段的价值。
边缘检测在工业视觉中地位特殊:它是很多测量任务的前置——边缘定位到像素级,再结合亚像素细分可做高精度尺寸测量。理解边缘的"位置精度"与"连续完整性"这对矛盾,是后续调参的核心。最后记住:没有完美的边缘检测器,只有"适合当前图像的参数"。调参前先看图像特点(噪声水平、边缘类型、是否需要亚像素),再决定用 Sobel、Scharr 还是 Canny,以及各参数的初始值。本节要点:梯度求边缘、NMS 细化、双阈值连通决策,这是边缘检测的三层认知,也是理解一切边缘类算法的骨架。
补一个从边缘到几何的应用:边缘图本身是散点,工业上常把边缘作为霍夫变换的输入,把"找线"变成"找直线的参数"——HoughLines 用极坐标参数空间累加投票,能鲁棒地提取直线;HoughCircles 检测圆,用于定位螺丝孔、硬币等圆形目标。霍夫变换对边缘断裂和噪声容忍度高(多条断裂边可以投票出同一条直线),这是它比直接拟合鲁棒的原因。而边缘检测加霍夫变换,正是很多传统定位系统的核心链路:先 Canny 找边缘,再霍夫提取直线或圆,最后用几何约束筛选目标,可解释、可调参、无数据依赖。