MATLAB中的边缘检测比较

来源:互联网 发布:ubuntu sudo无法使用 编辑:程序博客网 时间:2024/05/04 05:02
边缘(edge)是指图像局部亮度变化显著的部分。边缘主要存在与目标与目标、目标与背景、区域与区域之间,是图像分割、纹理特征提取和形状特征提取等图像分析的重要基础。图像分析和理解的第一步常常是边缘检测(edge detection)。

在讨论边缘算子之前,首先给出下列几个术语的定义:

边缘点: 图像中亮度显著变化的点
边缘段:边缘点坐标[i,j]及其方向θ的总和,边缘的方向可以是梯度角
轮廓:边缘列表,或是一条边缘列表的曲线模型
边缘连接:从无序边缘表形成有序边缘表的过程。习惯上边缘的表示采用顺时针方向来排序
边缘跟踪:一个用来确定轮廓图像(指滤波后的图像)的搜索过程
边缘检测器:从图像中抽出边缘集合的算法

边缘连接和边缘跟踪之间的区别在于:前者是把边缘检测器产生的无序边缘集合作为输入,输出是一个有序边缘集;后者则是将一幅图像作为输入,输出一个有序边缘集。

另外边缘检测使用局部信息来决定边缘,而边缘跟踪使用整个图像信息来决定一个像素点是不是边缘。


1.边缘检测梯度算法——参见2#
(1)Roberts算子
(2)Sobel算子
(3)Prewitt算子

2.Laplacian算子——参见3#

3.Laplacian-Guass算子——参见4#
(1)LoG算子

4.Canny算子——参见5#

边缘检测梯度算法

1.边缘梯度检测的基本步骤

(1)滤波:
边缘检测算法主要是基于图像强度的一阶和二阶导数,但导数的计算对噪声敏感,因此必须使用滤波器来改善与噪声有关的边缘检测器的性能,需要指出,大多数滤波器在降低噪声的同时也导致边缘强度的损失,因此,增强边缘和降低噪声之间需要折中。

(2)增强:增强边缘的基础是确定图像各点邻域强度的变化值。增强算法可以将邻域强度值有显著变化的点突出显示出来。边缘增强一般是通过计算梯度幅值来完成的。

(3)检测:在图像中有许多点的梯度幅值比较大,而这些点在特定的应用领域中并不是边缘,所有应该用某种方法确定哪些点是边缘。最简单的边缘检测判断是梯度幅值阀值判断。

(4)定位:如果某一应用场合要求确定边缘位置,则边缘的位置在子像素分辨率上来估计,边缘的方位也可以被估计出来。

2.Roberts算子

Roberts交叉算子为梯度幅值计算提供了一种简单的近似方法:

Eqn12.gif
2009-2-17 20:07:11 上传
下载附件(2 KB)


用卷积模板表示方法,上式变成:

Eqn11.gif
2009-2-17 20:07:11 上传
下载附件(1.17 KB)


其中Gx和Gy有下面的模板计算:


Eqn19.gif
2009-2-17 20:57:37 上传
下载附(2.2 KB)


在计算梯度时,计算空间同一位置处(x,y)的真实偏导数非常重要。采用2×2领域模板计算的梯度近似值Gx和Gy并不位于同一位置,Gx实际上是内差点(i,j+0.5)处的近似梯度,Gy实际上是内差点(i+0.5,j)出的近似梯度。因此,Roberts算子是该点连续梯度的近似子,而不是所预期点(i,j)处的近似值,所以通常用3×3邻域计算梯度值。

3.Sobel算子

采用3×3邻域可以避免在像素之间内差点上计算梯度。考虑下图中所示的点(i,j)周围点的排列

Eqn20.gif
2009-2-17 21:12:38 上传
下载附件(1.93 KB)


Sobel算子也是一种梯度幅值:

Eqn21.gif
2009-2-17 21:12:38 上传
下载附件(1.02 KB)


其中的偏导数使用下面的公式计算:

Eqn24.gif
2009-2-17 21:13:09 上传
下载附件(2.58 KB)


其中常系数c=2。

和其他梯度算子一样,sx和sy可以分别使用卷积模板表示为:

Eqn25.gif
2009-2-17 21:16:54 上传
下载附件(2.88 KB)


该算子把重点放在接近与模板中心的像素点,故Sobel算子是边缘检测器中最常用的算子之一。

4.Prewitt算子

Prewitt算子与Sobel算子的方程一样,只是常系数c=1。sx和sy可以分别使用卷积模板表示为:

Eqn26.gif
2009-2-17 21:27:16 上传
下载附件(2.86 KB)


5.边缘检测函数

Matlab图像处理工具箱提供了edge函数来检测边界。edge函数提供了许多微分算子模板,对某些模板可以指定水平边缘还是垂直边缘(或者两者都有)敏感(即主要检测是水平边缘还是垂直边缘)。edge函数在检测边缘时可以指定一个灰度阀值,只有满足这个阀值的点才视为边界点。
  1. I=imread('circuit.tif');
  2. bw=edge(I,'prewitt',0.04);
  3. subplot(121)
  4. imshow(I)
  5. subplot(122)
  6. imshow(bw)
复制代码

untitled.jpg


2009-2-17 21:27:16 上传
下载附件(25.27 KB)

Laplacian算子

计算一阶导数的边缘检测器,如果所求的一阶导数高于某个阀值,则认为该店是边缘点,这样做会导致检测的边缘点多出一些。

一种更好的方法就是求梯度局部最大值对应的点,并认为他们是边缘点。通过这样的去除一阶导数中的非局部最大值的点,可以检测出更加精确的边缘。

一阶导数的局部最大值对应二阶导数的零交叉点(zero crossing),于是通过找出图像强度的二阶导数的零交叉点就能找到精确的边缘点。Laplacian算子是常用的二阶导数算子。

拉普拉斯算子是二阶导数的二维等效,函数f(x,y)的拉普拉斯算子公式为:

Eqn12.gif
2009-2-17 20:49:37 上传
下载附件(2 KB)


使用差分方程对x和y方向上的二阶偏导数近似如下:

Eqn15.gif
2009-2-17 20:49:37 上传
下载附件(3.95 KB)


上式是以点(i,j+1)为中心点的,以点(i,j)为中心点的近似式为:

Eqn16.gif
2009-2-17 20:55:54 上传
下载附件(1.76 KB)


同理有:

Eqn17.gif
2009-2-17 20:55:54 上传
下载附件(1.77 KB)


将上面两式合并为一个算子,用近似的拉普拉斯算子模板表示为:

Eqn18.gif
2009-2-17 20:55:54 上传
下载附件(1.47 KB)


当拉普拉斯算子输出出现过零点时,就表明有边缘存在,但是要去除无意义的零点(灰度值为0的区域)

原创粉丝点击