Canny 非最大抑制介绍

信息处理 图像处理 精明边缘检测器
2022-02-04 02:50:54

我有丰富的信号处理经验,但自从我快乐的大学时代以来就没有接触过图像处理......所以:

在一个辅助项目上工作,我需要增强 2D 灰度图像中的脊(连续线)。使用 Matlab,我处于 ​​Canny 边缘检测做得很好的地步,但由于许多线条很粗,我得到每个脊的 2 个边缘。一些问题:

  • Canny 是适合这项任务的工具吗?
  • 如果是这样,我如何调整 Canny 算法来增强脊而不是边缘?
  • 我在哪里可以找到 Canny 边缘检测的良好介绍(谷歌搜索,没有发现任何真正有用的东西)?
1个回答

Canny 的原始论文解决了除了台阶边缘之外的脊边缘和屋顶边缘的问题,但我不知道有任何“Canny”边缘检测的实现可以检测除台阶边缘以外的任何东西。Canny 的论文很容易阅读,但不幸的是,它是收费的。J. Canny,“边缘检测的计算方法”,IEEE Trans。模式分析和机器智能,8:679-714,1986。

Canny 的论文实际上是关于如何使用变分法推导出对每种类型的边缘都具有最佳响应的一维滤波器。事实证明,脊边缘滤波器不是尺度不变的(你必须知道你的脊有多宽)。这是 Canny 论文中关于最佳山脊和屋顶检测算子的图片(第 683 页,© IEEE,1986,这是“合理使用”):

在此处输入图像描述

通常称为“Canny 边缘检测”的内容如下:

  1. 对 X 和 Y 中的高斯函数的导数进行逼近。(这通常是通过高斯模糊后跟 Sobel 算子来完成的。)(高斯的导数实际上不是最优步长边缘检测算子,而是最优步长-边缘检测算子“有点像”高斯的导数。)
  2. 转换自Δx,Δy在每个像素处形成幅度,“角度”. (其中“角度”是一个 2 位近似值,它告诉您边缘是否更接近水平、垂直或两个 45 度对角线之一。)
  3. “细化”:对于每个像素,在“角度”方向查看其两个相邻像素,仅当它是其自身及其两个相邻像素的最大值时才保留该像素。(否则将幅度设置为 0。)
  4. “阈值”:对于幅度小于某个“弱阈值”的每个像素,将像素抑制为 0。对于幅度大于某个“强阈值”的每个像素,将像素设置为意味着“绝对是边缘”的任何值。对于两个阈值之间的像素,将像素设置为“可能是边缘”的值。
  5. 滞后:对于每个“可能是边缘”像素,如果其水平、垂直或对角方向的 8 个相邻像素中的任何一个“绝对是边缘”,则将其更改为“绝对边缘”。

从理论上讲,您应该能够通过仅更改步骤 1 将 Canny 边缘检测器变成脊边缘检测器,但我从未尝试过。