4.2 边缘检测


4.2 边缘检测

本节摘要:SOURCE 4.2:Sobel/Prewitt/Roberts 梯度法与 Canny 四步(高斯、梯度、NMS、双阈值)。本节动手调 Canny threshold1/2 与 Sobel 对比。

你能学到什么

  1. 实现 Canny 完整流程理解各步
  2. 对比 Sobel 与 Canny 边缘厚度
  3. 解释非极大值抑制作用

一、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)

梯度幅值大 = 灰度突变 = 潜在边缘。

二、Canny(SOURCE 四步)

blur = cv2.GaussianBlur(img, (5,5), 1.4) edges = cv2.Canny(blur, 50, 150)
  1. 高斯平滑去噪
  2. Sobel 算梯度幅值与方向
  3. 非极大值抑制 细化边缘
  4. 双阈值滞后:>high 强边缘,between 且连 strong 才保留

Canny 四步流水线

Canny 四步流水线

Canny 四步流水线

三、参数 A/B

low high 现象
30 90 边多、噪点多
100 200 边断、漏检

经验:high ≈ 2–3× low。

四、实验

  1. 固定 high=150,low=20/50/80 对比
  2. 无 NMS 的 Sobel threshold vs Canny 目视
  3. 圆检测 HoughCircles 前置 Canny

⚠️ 常见坑:原图未高斯 — Canny 满屏碎边。

💡 关键直觉:Canny 是多阶段决策 — 工业常用默认参数起点。

本章回顾

  • Sobel 快但边粗
  • Canny = 平滑 + 梯度 + NMS + 滞后
  • 双阈值控制连通弱边
  • 边缘常作轮廓输入

下一节区域生长。

从梯度到边缘:一阶与二阶方法

边缘是灰度发生突变的位置,数学上对应梯度幅值较大的点。一阶方法(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 为什么是四步

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 找边缘,再霍夫提取直线或圆,最后用几何约束筛选目标,可解释、可调参、无数据依赖。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U