sobel、laplace、canny边缘检测算法概述

本文参考《opencv3编程入门》,作者:毛星云

  • 相关概念介绍

图像的线性平滑:主要用于抑制灰度跳变的部分,通过对图像邻域的积分运算(由于图像是离散信号,因此积分运算退化为加权求和)来实现。

图像的锐化:主要用于增强图像灰度跳变的部分,通过微分运算(由于图像是离散信号,因此微分运算退化为有限差分)来实现。

  • 基于一阶导数的边缘检测算子

Sobel(索贝尔)是主要用于边缘检测的离散差分算子,图像中的某一个像素及其邻域表示如下:

                                             I=\begin{bmatrix} f(x-1,y-1) &f(x,y-1) &f(x+1,y-1) \\ f(x-1,y) &f(x,y) &f(x+1,y) \\ f(x-1,y+1) &f(x,y+1) &f(x+1,y+1) \end{bmatrix}

1、对于xy两个方向分别求导

1)水平变化Gx:将I与一个奇数大小的内核进行卷积得到Gx。比如内核大小为3时,Gx计算结果为:

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

进一步计算得出:

                  \tiny G_{x}=f(x+1,y-1)-f(x-1,y-1)+2f(x+1,y)-2f(x-1,y)+f(x+1,y+1)-f(x-1,y+1)

扫描二维码关注公众号,回复: 6794969 查看本文章

            2)  垂直变化Gy:将I与一个奇数大小的内核进行卷积得到Gy。比如内核大小为3时,Gy计算结果为:

                                                                             G_{y}=\begin{bmatrix} -1 &-2 &-1 \\ 0 &0 &0\\+1 &+2 &+1 \end{bmatrix}*I

进一步计算得出:

                  \tiny G_{y}=f(x-1,y+1)-f(x-1,y-1)+2f(x,y+1)-2f(x,y-1)+f(x+1,y+1)-f(x+1,y-1)

2、对于图像上的每一个像素,结合以上两个结果求出近似梯度:

                                                                           G=\sqrt{G_{x}^{2}+G_{y}^{2}}

有时也可用下面更简洁的公式代替:

                                                                           G=\left | G_{x} \right |+\left | G_{y} \right |

注意事项:第一步中的卷积操作并不需要对卷积核进行180度的翻转,因为sobel算子的卷积核绕中心翻转180度后计算得到的结果相同。

  • 基于二阶导数的边缘检测算子

一维一阶差分公式为:

                                       \frac{\partial f}{\partial x}=f(x+1)-f(x)

一维二阶差分公式为:

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

二维x方向的二阶差分公式为:

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

二维y方向的二阶差分公式为:

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

分别对Laplace算子x,y两个方向的二阶导数进行差分就得到了离散函数的Laplace算子。Laplace算子的差分形式如下:

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

将其变换为掩模的形式如下:

注意该掩模的特点:该掩模在上下左右四个90度的方向上结果相同,也就是说在90度方向上无方向性。为了让该掩模在45度的方向上也具有该性质,对该掩模进行扩展定义为:

有时我们也会见到不同于上述结果的Laplace算子的掩模,如下所示:

其原因是:在定义二阶导数的时候采用了相反的定义,这个无关紧要,但是要注意,当用Laplace算子滤波后的图像与原图叠加时,混合操作是加还是减因上述的定义而异。

因为Laplace算子是二阶导数操作,其在强调图像中灰度值不连续部分的同时也不在强调灰度值连续的部分。这样会产生一个具有很明显的灰度边界,但是没有足够特征的黑色背景。背景特征可以通过原图像与Laplace算子操作后的图像混合恢复。用公式:

                                                             \tiny g(x,y)=f(x,y)+c(\bigtriangledown ^{2}f(x,y))

其中的参数c的取值和上面的两种mask定义有关,当mask中心的数值取正时c=-1,相反c=1。

  • Canny算子

1、使用高斯滤波器对图像进行平滑降噪

2、使用sobel滤波器计算每个像素的梯度幅值和方向

                                                                      G=\sqrt{G_{x}^{2}+G_{y}^{2}}

                                                                      \theta =arctan(\frac{G_{y}}{G_{x}})

梯度方向一般取这四个可能的角度之一:0度、45度、90度、135度。

3、非极大值抑制

非极大值抑制是一种边缘细化方法,在0、45、90、135四个梯度方向上进行。如果当前点的梯度强度和同方向的其他点的梯度强度相比较是最大,保留其值。否则抑制,即设为0。

4、滞后阈值(推荐高低阈值比值在2:1到3:1之间)

1)若某一像素位置的幅值大于高阈值,该像素被保留为边缘像素。

2)若某一像素位置的幅值小于低阈值,该像素被排除。

3)若某一像素位置的幅值在两个阈值之间,该像素仅仅在连接到一个大于高阈值的像素时被保留。

猜你喜欢

转载自blog.csdn.net/jgj123321/article/details/94437524