边缘检测算子

来源:互联网 发布:java接口自动化 编辑:程序博客网 时间:2024/04/28 03:22


 

一阶: Roberts Cross算子, Prewitt算子, Sobel算子, Canny算子, 罗盘算子
二阶: Marr-Hildreth, 在梯度方向的二阶导数过零点。


Roberts算子

     Roberts算子是一种利用局部差分算子寻找边缘的算子,它有下式给出:


    Roberts算子是2X2算子模板。图1所示的2个卷积核形成了Roberts算子。图象中的每一个点都用这2个核做卷积。


Sobel 算子

索贝尔算子(Sobel operator)是图像处理中的算子之一,主要用作边缘检测。在技术上,它是一离散性差分算子,用来运算图像亮度函数的梯度之近似值。在图像的任何一点使用此算子,将会产生对应的梯度矢量或是其法矢量。

公式

该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。如果以\mathbf{A}代表原始图像,\mathbf{G_x}\mathbf{G_y}分别代表经横向及纵向边缘检测的图像,其公式如下:

\mathbf{G_x} = \begin{bmatrix} -1 & 0 & +1 \\-2 & 0 & +2 \\-1 & 0 & +1 \end{bmatrix} * \mathbf{A}\quad \mbox{and} \quad \mathbf{G_y} = \begin{bmatrix} +1 & +2 & +1 \\0 & 0 & 0 \\-1 & -2 & -1 \end{bmatrix} * \mathbf{A}

图像的每一个像素的横向及纵向梯度近似值可用以下的公式结合,来计算梯度的大小。

\mathbf{G} = \sqrt{ \mathbf{G_x}^2 + \mathbf{G_y}^2 }

然后可用以下公式计算梯度方向。

\mathbf{\Theta} = \operatorname{arctan}\left({ \mathbf{G_y} \over \mathbf{G_x} }\right)

在以上例子中,如果以上的角度\Theta等于零,即代表图像该处拥有纵向边缘,左方较右方暗。


Candy 算子

Canny 算法的发展

Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是:

  • 好的检测 - 算法能够尽可能多地标识出图像中的实际边缘。
  • 好的定位 - 标识出的边缘要尽可能与实际图像中的实际边缘尽可能接近。
  • 最小响应 - 图像中的边缘只能标识一次,并且可能存在的图像噪声不应标识为边缘。

为了满足这些要求 Canny 使用了变分法,这是一种寻找满足特定功能的函数的方法。最优检测使用四个指数函数项的和表示,但是它非常近似于高斯函数的一阶导数。


Canny 算法的步骤

去噪声

任何边缘检测算法都不可能在未经处理的原始数据上很好地处理,所以第一步是对原始数据与高斯平滑模板作卷积,得到的图像与原始图像相比有些轻微的模糊(blurred)。这样,单独的一个像素噪声在经过高斯平滑的图像上变得几乎没有影响。

寻找图像中的亮度梯度

图像中的边缘可能会指向不同的方向,所以 Canny 算法使用 4 个 mask 检测水平、垂直以及对角线方向的边缘。原始图像与每个 mask 所作的卷积都存储起来。对于每个点我们都标识在这个点上的最大值以及生成的边缘的方向。这样我们就从原始图像生成了图像中每个点亮度梯度图以及亮度梯度的方向。

在图像中跟踪边缘

较高的亮度梯度比较有可能是边缘,但是没有一个确切的值来限定多大的亮度梯度是边缘多大又不是,所以 Canny 使用了滞后阈值。

滞后阈值需要两个阈值——高阈值与低阈值。假设图像中的重要边缘都是连续的曲线,这样我们就可以跟踪给定曲线中模糊的部分,并且避免将没有组成曲线的噪声像素当成边缘。所以我们从一个较大的阈值开始,这将标识出我们比较确信的真实边缘,使用前面导出的方向信息,我们从这些真正的边缘开始在图像中跟踪整个的边缘。在跟踪的时候,我们使用一个较小的阈值,这样就可以跟踪曲线的模糊部分直到我们回到起点。

一旦这个过程完成,我们就得到了一个二值图像,每点表示是否是一个边缘点。

一个获得亚像素精度边缘的改进实现是在梯度方向检测二阶方向导数的过零点

L_x^2 \, L_{xx} + 2 \, L_x \,  L_y \, L_{xy} + L_y^2 \, L_{yy} = 0,

它在梯度方向的三阶方向导数满足符号条件

L_x^3 \, L_{xxx} + 3 \, L_x^2 \, L_y \, L_{xxy} + 3 \, L_x \, L_y^2 \, L_{xyy} + L_y^3 \, L_{yyy} < 0

其中 L_x,L_y ...L_{yyy} 表示用高斯核平滑原始图像得到的尺度空间表示L 计算得到的偏导数。用这种方法得到的边缘片断是连续曲线,这样就不需要另外的边缘跟踪改进。滞后阈值也可以用于亚像素边缘检测。

参数

Canny 算法包含许多可以调整的参数,它们将影响到算法的计算的时间与实效。

  • 高斯滤波器的大小:第一步所用的平滑滤波器将会直接影响 Canny 算法的结果。较小的滤波器产生的模糊效果也较少,这样就可以检测较小、变化明显的细线。较大的滤波器产生的模糊效果也较多,将较大的一块图像区域涂成一个特定点的颜色值。这样带来的结果就是对于检测较大、平滑的边缘更加有用,例如彩虹的边缘。
  • 阈值:使用两个阈值比使用一个阈值更加灵活,但是它还是有阈值存在的共性问题。设置的阈值过高,可能会漏掉重要信息;阈值过低,将会把枝节信息看得很重要。很难给出一个适用于所有图像的通用阈值。目前还没有一个经过验证的实现方法。

如果想要试验 Canny 算法中的参数,http://matlabserver.cs.rug.nl 的在线 Canny 程序会很有帮助。

结论

Canny 算法适用于不同的场合。它的参数允许根据不同实现的特定要求进行调整以识别不同的边缘特性。对于PC上的实时图像处理来说可能慢得无法使用,尤其是在使用大的高斯滤波器的情况下。但是,我们讨论计算能力的时候,也要考虑到随着处理器速度不断提升,有望在未来几年使得这不再成为一个问题。


LOG滤波器原理

设I(x,y)代表灰度变化,灰度变化剧烈的地方就是阶跃点,而阶跃点的一次微商为极大值,二次微商为零。因此二次微商为零的地方就是图像的边缘所在。

LOG滤波器是高斯(GAUSS)滤波和拉普拉斯(LAPLACIAN)滤波的结合,即先用高斯滤波器进行平滑滤波,以过虑调噪声,再提取边缘,所以效果较好。



Laplacian 算子











原创粉丝点击