图像处理算法 | 图像边缘检测

这篇是上一篇的延申,列出了常用的边缘检测算子及测试结果。

一、边缘检测的各种算子

一阶导有以下几种

1. Roberts算子

                                             G_{x} =\begin{bmatrix} 1 & 0 \\ 0 & -1 \end{bmatrix}, G_{y} =\begin{bmatrix} 0 & -1 \\ 1 & 0 \end{bmatrix}

     roberts算子其实就是一阶导定义的对角线方向,它没有噪声抑制能力,它对45°和135°方向的梯度变化更敏感。

2. Prewitt算子

                                 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}

    Prewitt算子是常用的梯度算子,算子里面融合了一个均值降噪,把它分解出来就能看清楚了,以水平方向为例(垂直方向同理):

                                      G_{x} =\begin{bmatrix} -1 & 0 & 1\\ -1 & 0 & 1\\ -1 & 0 & 1 \end{bmatrix}=\begin{bmatrix} 1\\ 1\\ 1 \end{bmatrix} \begin{bmatrix} -1 & 0 & 1 \end{bmatrix}

可以理解为Prewitt在检测边缘的同时做了垂直方向的三均值,好处是有一定的降噪性能,坏处是一些细小的边缘检测不出来。

3. Sobel算子

                                  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}

Sobel算是用的最多的梯度算子了,很多论文也是在Sobel算子的基础上改进的,它里面藏了个高斯,还是以x轴为例(y方向同理):

                                      G_{x} =\begin{bmatrix} -1 & 0 & 1\\ -2 & 0 & 2\\ -1 & 0 & 1 \end{bmatrix}=\begin{bmatrix} 1\\ 2\\ 1 \end{bmatrix} \begin{bmatrix} -1 & 0 & 1 \end{bmatrix}

Sobel可以认为是Prewitt的升级版,均值变高斯了,高斯滤波会给中心点分配更大的权重,有利于保持边缘,所以Sobel也有降噪性能,其保边能力要略高于Prewitt。

  1. Canny算子

Canny在我的理解中它不能被当作一个算子,它应该说成是“Canny算法”更合适,但是很多论文中就是把它叫做“Canny算子”,那就只能这么用下去咯。

Canny算子计算边缘分四步,高斯滤波、计算图像梯度、非最大抑制以及双阈值边缘连接,这里的第二步“计算图像梯度”可以用上面3个一阶导中的任意一个。它的优越性主要体现在以下三点:

第一是抗噪性能,Canny先做了二维的高斯滤波,后面又用双阈值抑制了一部分弱边缘,最大限度降低了噪声的干扰,所以Canny的降噪性能是很优越的。

第二是边缘单值化,通常卷积后得到梯度边缘宽度超过一个像素,Canny利用非最大抑制算法挑出局部梯度变化中最为突出的那个,其它梯度值直接置0,这样就实现了边缘的宽度只有一个像素。

第三是强化弱边缘,也就是边缘连接,上面的两步肯定会误伤一部分真实的边缘,所以Canny又把弱边缘的8连通域搜索了一遍,只要里面有一个强边界,就把这个弱边缘也定义成强边缘。

    这一通操作下来,Canny成功进阶一阶算子的王者,但是计算量也是王者级的。

二阶导有以下几种

1. Laplacian

上面我们给出了二阶导x方向的公式,把y方向也写下来:

                               \frac{\partial^2f(x,y)}{\partial x^{2} }=f(x+1,y)-2f(x,y)+f(x-1,y)\\ \frac{\partial^2f(x,y)}{\partial y^{2} }=f(x,y+1)-2f(x,y)+f(x,y-1)\\

两个二阶导相加得到:

            \frac{\partial^2f(x,y)}{\partial x^{2} }+\frac{\partial^2f(x,y)}{\partial y^{2} }=f(x+1,y)+f(x-1,y)+f(x,y+1)+f(x,y-1)-4f(x,y)

把它写成算子如下所示:

                                                            G=\begin{bmatrix} 0 & 1 & 0\\ 1 & -4 & 1\\ 0 & 1 & 0 \end{bmatrix}\\

上面这个只有水平和垂直两个方向,所以得到了一个4邻域的算子,如果加上两个对角线方向,会得到下面这个8邻域的算子:

                                                            G=\begin{bmatrix} 1 & 1 & 1\\ 1 & -8 & 1\\ 1 & 1 & 1 \end{bmatrix}\\

所以对图像做拉普拉斯卷积等价于对图像求了二阶导,二阶导对精细细节的反应非常大,在孤立点处达到最大值,所以图像二阶导对噪声特别敏感。此外,拉普拉斯还具有各向同性,就是说无论哪个方向,响应都是一样的。

2. Log

Log全称为Laplacian and Gaussian,由于拉普拉斯对噪声敏感,所以要先对图像做一个高斯滤波,然后再应用Laplacian对降噪后的图像进行运算。其实就是对输入图像连续做了两次卷积,第一用高斯算子,第二次用拉普拉斯算子。

3. Dog

Dog全称为Difference of Gaussian,就是两个Gauss做减法,本质上是一个带通滤波器,它的作用是把特别高频的分量给剔除,保留中频部分,当然也具备降噪性能,由于高斯核是可调节大小的,所以通过调整高斯核就可以调整边缘提取的频段。

二、边缘检测效果与对比

还是用Lena图,这幅图既有细节又有平坦区域,很适合用于测试边缘检测,另外,为了测试算子的抗噪性能,给Lena图加了一点儿高斯噪声。 

图1 加高斯噪声的Lena图

先看一阶导的测试图像,一阶导均显示三幅图像,水平和垂直的浮雕图以及梯度幅值图。

图2 Roberts算子效果图
图3 Prewitt算子效果图
图4 Sobel算子效果图

Roberts的细节有一部分都淹没在噪声里面了,即使拿阈值做二值化提取,大概率也不会获得好结果。Prewitt和Sobel的效果差不多,视觉上觉得Sobel更清晰是因为Sobel里面的高斯,它给中心点分配了更大的权重,会让边缘更突出一些。

由于本章要讨论的是各种求导算子对图像的处理效果,而Canny其实是一种算法,对于一个边缘检测算法来说,还需要配合阈值提取清晰的图像边界,但是本章不涉及阈值部分,所以Canny这里直接使用了matlab中的函数,这个函数给边缘检测的结果做了二值化,看看效果就好。Canny在实际使用的时候需要做阈值调试,所以下面的这个效果仅供参考。

图5 Canny算法的二值化图像

然后是二阶算子的处理效果,二阶算子会在图像边缘处产生双像素,所以在显示的时候求了绝对值,正负边缘凑在一起会觉得边缘变粗了,但实际上不是的,下图9从左往右分别是Laplacian、Log和Dog的效果。

图6 二阶算子效果

从效果上来看,Laplacian确实是对噪声很敏感,Log因为做了高斯,检测出来边缘里面少了很多噪声,Dog的效果介于二者中间。本章对二阶导不做进一步分析,因为后面还有图像锐化算法,等介绍图像锐化的时候还要进一步深入分析二阶导及其算子。这里还是要强调一下以上效果仅供参考,实际使用看需求,算法可以根据实际情况做改进。

另外,为了方便查阅和掌握各种求导算子的性能,这里给出一张算子对比的表格,也是仅供参考。

名称

类型

幅值计算方法

降噪性能

边缘响应效果

复杂度

Roberts

一阶

绝对值相加

无噪声抑制能力

单像素边缘和双像素边缘

简单

Prewitt

一阶

绝对值取max

单向均值降噪

单像素边缘和双像素边缘

一般

Sobel

一阶

绝对值取max

单向高斯降噪

单像素边缘和双像素边缘

一般

Canny

一阶

绝对值相加

二维高斯降噪

唯一单边缘

复杂

Laplace

二阶

绝对值

对噪声敏感

孤立点和双像素边缘

一般

Log

二阶

绝对值

二维高斯降噪

双像素边缘

一般

Dog

二阶

绝对值

二维高斯降噪

双像素边缘

一般

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值