Matlab 边缘检测实现与比较

边缘检测包括三个基本内容:

  • 抽取出反映灰度变化的边缘点
  • 剔除某些边界点或填补边界间断点
  • 将这些边缘连接成完整的线

边缘检测算子

基于一阶导数

梯度:
G ( x , y ) = [ G x G y ] = [ f x f y ] G(x,y)= \begin{bmatrix} G_x\\ G_y \end{bmatrix}= \begin{bmatrix} \dfrac{\partial f}{\partial x}\\ \\ \dfrac{\partial f}{\partial y} \end{bmatrix}

可以用三种范数衡量梯度的幅值:
G ( x , y ) = G x 2 + G y 2 2 |G(x,y)|=\sqrt {G_x^2+G_y^2},2范数梯度

G ( x , y ) = G x + G y 1 |G(x,y)|=|G_x|+|G_y|,1范数梯度

G ( x , y ) m a x ( G x , G y ) |G(x,y)|\approx max(|G_x|,|G_y|),\infty范数梯度

(1)Roberts交叉算子:利用局部差分算子寻找边缘,两个卷积核分别为

G x = [ 1 0 0 1 ] G y = [ 0 1 1 0 ] G_x=\begin{bmatrix}1&0\\0&-1\end{bmatrix},G_y=\begin{bmatrix}0&1\\-1&0\end{bmatrix}

采用1范数衡量梯度的幅度,对具有陡峭的低噪声图像处理效果较好。

(2)Prewitt算子:卷积核:

G x = [ 1 0 1 1 0 1 1 0 1 ] G y = [ 1 1 1 0 0 0 1 1 1 ] G_x=\begin{bmatrix}-1&0&1\\-1&0&1\\-1&0&1\end{bmatrix},G_y=\begin{bmatrix}1&1&1\\0&0&0\\-1&-1&-1\end{bmatrix}

采用第三个范数衡量梯度的幅度,对灰度渐变和噪声较多的图像效果较好。

(3)Sobel算子:卷积核:

G x = [ 1 0 1 2 0 2 1 0 1 ] G y = [ 1 2 1 0 0 0 1 2 1 ] G_x=\begin{bmatrix}-1&0&1\\-2&0&2\\-1&0&1\end{bmatrix},G_y=\begin{bmatrix}1&2&1\\0&0&0\\-1&-2&-1\end{bmatrix}

采用第三个范数衡量梯度的幅度,对灰度渐变和噪声较多的图像效果较好。

(4)Canny算子:使用高斯滤波器的导数计算的,以寻找图像梯度的局部极大值。使用两个阈值分别来检测强边缘与弱边缘,当且仅当强弱边缘相连时,弱边缘才包含在输出中。因此该方法不易受噪声干扰,但其检测边界连续性不如LOG算子。

Canny算法步骤如下:
① 用高斯滤波器平滑图像;
② 计算滤波后图像梯度的幅值和方向;
③ 对梯度幅值应用非极大值抑制,其过程为找出图像梯度中的局部极大值点,把其他非局部极大值点置零以得到细化的边缘;
④ 用双阈值算法检测和连续边缘,使用两个阈值T1和T2(T1>T2),T1用来找到每条线段,T2用来在这些线段的两个方向上延伸寻找边缘的断裂处,并连接这些边缘。

(5)零交叉方法:先用指定滤波器对图像滤波,然后寻找零交叉点作为边缘。

基于二阶导数

图像灰度二阶导数的过零点对应边缘点
在这里插入图片描述
(1)Laplacian算子

2 f = 2 f x 2 + 2 f y 2 \nabla^2f=\frac{\partial^2f}{\partial x^2}+\frac{ \partial^2f}{\partial y^2}

2 f x 2 = [ f ( i , j + 1 ) 2 f ( i , j ) ] + f ( i , j 1 ) \frac{\partial^2f}{\partial x^2}=[f(i,j+1)-2f(i,j)]+f(i,j-1)

2 f y 2 = [ f ( i + 1 , j ) 2 f ( i , j ) ] + f ( i 1 , j ) \frac{ \partial^2f}{\partial y^2}=[f(i+1,j)-2f(i,j)]+f(i-1,j)

表示为卷积模板:

2 = [ 0 1 0 1 4 1 0 1 0 ] \nabla^2=\begin{bmatrix}0&1&0\\1&-4&1\\0&1&0\end{bmatrix}

由于是二阶导数,因此它对于噪声有极高的敏感性,而且对双边缘带不易检测出边缘的方向。

(2)LOG算子:先用高斯函数滤波,然后进行拉普拉斯运算,算得的值等于0的点认为是边界点。

LOG运算:

h ( x , y ) = 2 [ g ( x , y ) ] f ( x , y ) h(x,y)=\nabla^2[g(x,y)]*f(x,y)

根据卷积求导法则:

h ( x , y ) = [ 2 g ( x , y ) ] f ( x , y ) h(x,y)=[\nabla^2g(x,y)]*f(x,y)

其中,f为图像,g为高斯函数,

g ( x , y ) = 1 2 π σ 2 e x p [ x 2 + y 2 2 σ 2 ] g(x,y)=\frac{1}{2\pi\sigma^2}exp\left[-\frac{x^2+y^2}{2\sigma^2}\right]

2 g ( x , y ) = ( x 2 + y 2 2 σ 2 σ 4 ) e x 2 + y 2 2 σ 2 \nabla^2g(x,y)=\left(\frac{x^2+y^2-2\sigma^2}{\sigma^4}\right)e^{-\dfrac{x^2+y^2}{2\sigma^2}}

2 G ( x , y ) x 2 = 1 2 π σ 4 e x p [ x 2 + y 2 2 σ 2 ] ( x 2 σ 2 1 ) \frac{\partial^2 G(x,y)}{\partial x^2}=\frac{1}{2\pi\sigma^4}exp\left[-\frac{x^2+y^2}{2\sigma^2}\right]\left(\frac{x^2}{\sigma^2}-1\right)

2 G ( x , y ) y 2 = 1 2 π σ 4 e x p [ x 2 + y 2 2 σ 2 ] ( y 2 σ 2 1 ) \frac{\partial^2 G(x,y)}{\partial y^2}=\frac{1}{2\pi\sigma^4}exp\left[-\frac{x^2+y^2}{2\sigma^2}\right]\left(\frac{y^2}{\sigma^2}-1\right)

故:

2 G ( x , y ) = 1 2 π σ 4 ( x 2 + y 2 σ 2 2 ) e x p [ x 2 + y 2 2 σ 2 ] \nabla^2G(x,y)=\frac{1}{2\pi\sigma^4}\left(\frac{x^2+y^2}{\sigma^2}-2\right)exp\left[-\frac{x^2+y^2}{2\sigma^2}\right]

用差分高斯函数(DOG)简化代替LOG算子:

D O G ( σ 1 , σ 2 ) = 1 2 π σ 1 e x p [ x 2 + y 2 2 σ 1 2 ] 1 2 π σ 2 e x p [ x 2 + y 2 2 σ 2 2 ] DOG(\sigma_1,\sigma_2)=\frac{1}{\sqrt{2\pi}\sigma_1}exp\left[-\frac{x^2+y^2}{2\sigma_1^2}\right]-\frac{1}{\sqrt{2\pi}\sigma_2}exp\left[-\frac{x^2+y^2}{2\sigma_2^2}\right]

差分高斯算子较好地符合人的视觉特性。根据二阶导数性质,检测边界就是寻找▽^2*f的过零点。有两种等效计算方法:
①图像与高斯函数卷积,再求卷积的Laplace微分;
②求高斯函数的Laplace微分,再与图像卷积。

LOG算子能有效检测边界,但存在两个问题:
①会产生虚假边界;
②定位精度不高。

实际中,应考虑:σ的选择,模板尺寸N的确定,边界强度和方向,提取边界的精度。

Matlab实现

BW=edge(I,'method',thresh,direction)

采用method的方法进行边缘检测,指定阈值thresh,可指定算子的方向direction=‘horizontal’、‘vertical’、‘both’。各详细参数含义参见Matlab官方页面。

算子比较

(1)Roberts算子

边缘定位精度较高,但容易丢失一部分边缘,同时图像未经平滑处理,不能抑制噪声。对具有陡峭边缘且噪声低的图像处理效果较好。

(2)Prewitt和Sobel算子

都是对图像先做加权平滑处理,然后再微分,所拨通的是平滑部分的权值有差异,因此对噪声具有抑制作用,但不能完全排除检测结果中出现的徐家边缘。边缘定位效果不错,但是检测的边缘易出现多像素宽度。

(3)Laplacian算子

是不依赖于边缘方向的二阶微分算子,对图像中的阶跃型边缘点定位准确,对噪声非常敏感,使噪声成分得到加强。因此使得该算子易丢失一部分边缘的方向信息,造成一些不连续的检测边缘,抗噪能力差。

(4)LOG算子

克服了Laplacian算子抗噪能力差的缺点,但在抑制噪声的同时也将原有的尖锐边缘平滑化了,造成尖锐边缘无法被检测出。

(5)Canny算子

虽然是基于最优化思想而推导出来的,但是实际效果并不一定最优。同样采用高斯函数对图像平滑化,因此具有较强的抑制噪声能力,但也会将高频边缘平滑掉,造成边缘丢失。Canny算子采用双阈值算法检测和连接边缘,采用的多尺度检测和方向性搜索比LOG算子好。

Reference
张德丰 数字图像处理(MATLAB版)第二版 2015年

发布了6 篇原创文章 · 获赞 5 · 访问量 351

猜你喜欢

转载自blog.csdn.net/weixin_46422143/article/details/105420729