您的位置:首页 > 编程语言 > MATLAB

Matlab图像处理笔记---边缘检测

2020-04-01 18:44 1611 查看

边缘检测最通用的方法是检测灰度值的不连续性,这种不连续性使用一阶和二阶导数来检测。

图像处理中的二阶导数通常使用拉普拉斯算子来计算,二维函数f(x,y)的拉普拉斯算子由二阶微分构成:

拉普拉斯算子很少直接用于边缘检测,因为作为二阶导数,他对噪声有令人无法接受的敏感性,其幅度会产生双边缘,且不能检测边缘的方向,然而当与其他边缘检测技术组合使用时,拉普拉斯算子是一种强有力的补充方法,产生双边缘这个性质可用于寻找双边缘间的零交叉为边缘定位。

边缘检测的基本思想是使用以下两个准则之一来找到图像中灰度快速变化的位置:

  1. 寻找灰度的一阶导数的幅度大于某个指定阈值的位置
  2. 寻找灰度的二阶导数有零交叉的位置

图像处理工具箱函数edge提供了基于上述规则的边缘估计器,对于一些估计器能否作为边缘检测器取决于对水平、垂直是否敏感,还是对两者都敏感,该函数的通用语法为:

[code][g,t]=edge(f,'method',parameters)

其中f是输入图像,method表示使用的边缘检测器,parameters是其他参数。在输出中,g是一个逻辑数组,在f中检测到边缘点的位置,数组元素为1,在其他位置,数组元素为0。参数t是可选的,他给出edge用于确定哪些梯度值强到足以称为边缘点的阈值。

边缘检测器

  1. Sobel边缘检测器

Sobel边缘检测器使用一个3x3邻域的行和列之间的离散差来计算梯度,其中,每行或每列的中心像素用2来加权,以提供平滑效果:

z项是灰度,如果在(x,y)处 (T是一个指定的阈值),那么该位置的像素是边缘像素。

Sobel边缘检测的实现方法如下:

使用函数imfilter和图中的模板图像f滤波,然后再使用另一个模板对f滤波,对每幅滤波后的图像的像素值取平方,将两个像素相加,并计算他们的平方根。

图像邻域
z1 z2 z3
z4 z5 z6
z7 z8 z9

 

gx=(z7+2z8+z9)-(z1+2z2+z3)
-1 -2 -1
0 0 0
1 2 1

 

gy=(z3+2z6+z9)-(z1+2z4+z7)
-1 0 1
-2 0 2
-1 0 1

 

sobel检测器的通用语法是

[code][g,t]=edge(f,'sobel',T,dir)

其中f是输入图像,T是一个指定的阈值,dir指定所检测边缘的首选方向:‘horizontal'、'vertical'或‘both'(默认值)。

g是一幅逻辑图像,检测到边缘的位置其值为1,其他位置其值为0。输出的参数t是可选的,他是被edge使用的阈值,若指定了T值,则t=T;若未指定T值(或其为空,[]),则edge令t等于其自动决定的一个阈值,然后用于边缘检测。在输出参数中包含t的一个主要原因是得到一个可被修改并在后续调用中传递到该函数的初始阈值。若使用语法g=edge(f)或[g,t]=edge(f),则函数edge默认为使用Sobel检测器。 

    2. Prewitt边缘检测器

gx=(z7+z8+z9)-(z1+z2+z3)
-1 -1 -1
0 0 0
1 1 1

 

gy=(z3+z6+z9)-(z1+z4+z7)
-1 0 1
-1 0 1
-1 0 1

Prewitt边缘检测器于Sobel检测器相比,计算上要简单一些,但产生的结果中的噪声可能会稍微大一点。

    3. Roberts边缘检测

gx=z9-z5
-1 0
0 1

 

gy=z8-z6
0 -1
1 0

Roberts检测器是数字图像处理中最古老且最简单的边缘检测器之一,因其功能有限(他是非对称的,不能检测多种45°倍数的边缘),造成这种检测器很少用,但在简单和速度是其主导因素的情况下,他还是经常用在硬件实现方面。

    4.LoG检测器

高斯函数

式中, 是标准差。这是一个平滑函数,如果他和一幅图像卷积,将会使图像变模糊。模糊的程度由  决定。该函数的拉普拉斯算子是

该函数成为高斯拉普拉斯算子,因为二阶导数是线性操作,所以使用 与一幅图像卷积(滤波),与先用平滑函数与该图像卷积,在计算卷积结果的拉普拉斯算子,结果都是相同的。

使用 卷积图像有两种效果:他平滑了图像(因而降低了噪声),并计算拉普拉斯算子,进而产生一幅双边缘图像。然后通过查找双边缘之间的零交叉来定位边缘。

LoG检测器的通用调用语法是

[code][g,t]=edge(f,'log',T,sigma)

sigma是标准差,默认值是2,将T设为0会产生封闭的轮廓,这是LoG方法的熟知特征。

    4.零交叉检测器

这种检测器基于与LoG方法相同的概念,但卷积是使用一个特定的滤波器函数H来完成的,其调用语法为

[code][g,t]=edge(f,'zerocross',T,H)

   5.Canny边缘检测器

Canny边缘检测器是函数edge中最强大的边缘检测器,方法总结如下:

1.使用具有指定标准差 的一个高斯滤波器来平滑图像,以减少噪声。

2.在每个点处计算局部梯度 和边缘方向 ,边缘点定义为梯度方向强度局部最大的点。

3.步骤2中确定的边缘点产生梯度中的脊线。然后,算法沿这些脊线的顶部进行追踪,并将实际上不在脊线顶部的像素设置为零,从而在输出中给出一条细线,该过程称为非最大值抑制。然后使用称为滞后阈值处理的方法对这些脊线像素进行阈值处理,这一处理方法使用两个阈值T1和T2,其中T1<T2。其值大于T2的脊线像素称为“强”边缘像素,值在T1和T2之间的脊线像素称为"弱“边缘像素。

4.最后,算法通过将8连接的弱像素执行到强像素来执行边缘连接。

检测语法为:

[code][g,t]=edge(f,'canny',T,sigma)

其中T是一个向量,T=[T1,T2],它包含前述过程的步骤3中解释过的两个阈值;sigma是平滑滤波器的标准差。如果t包含该算法所用的两个阈值的二元向量。sigma的默认值是1。

  • 点赞
  • 收藏
  • 分享
  • 文章举报
菜渣已上线 发布了3 篇原创文章 · 获赞 0 · 访问量 198 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: