传统图像边缘检测方法

引言

图像轮廓边缘指的是图像中目标对象和背景之间的区分明显的交界线。对于数字图像来说,图像边缘是数字图像中灰度变化比较大的点,它是物体最基本的特征之一。基于图像边缘灰度剧烈变化的特征,传统的边缘检测方法往往根据灰度变化的情况进行边缘提取。

本文主要介绍传统边缘检测方法的基本思路以及实现方法,主要对 Sobel 边缘检测方法,Canny 边缘检测方法进行具体分析,讨论了其优缺点,最后指出了对传统边缘检测方法的一些改进措施。

传统边缘检测方法的基本思路

由于物体边缘处的灰度变化剧烈,因此传统的边缘检测方法大多利用这个特点,通过计算像素的梯度判断当前像素点是否为边缘像素点。首先通过滤波器进行平滑处理,以减小噪声对边缘检测产生的影响;其次计算梯度,寻找梯度变化最大的像素点,得到边缘像素点;最后进行阈值处理,通过设定合适的阈值确定真正的边缘,排除非边缘点。Sobel 算子与 Canny 算子边缘检测结果如下图所示:

Sobel算子与Canny算子边缘检测结果

Sobel 边缘检测算法

Sobel 算子是由美国计算机科学家 Irwin Sobel 和 Gary Feldman 于 1968 年首次提出的,他充分利用一阶微分进行边缘检测。Sobel 算子通过两个 3×3 的模板 sx,sy 进行水平和垂直两个方向的检测,它充分考虑了像素的位置特征,将当前像素上下,左右邻域内的像素充分考虑,寻找图像灰度变化最大的像素点。

sx=[101202101]sy=[121000121]s_x=\left[ \begin{matrix} -1& 0& 1\\ -2& 0& 2\\ -1& 0& 1\\ \end{matrix} \right] \text{,}s_y=\left[ \begin{matrix} -1& -2& 1\\ 0& 0& 0\\ 1& 2& 1\\ \end{matrix} \right]

Sobel 边缘检测算法的基本步骤

传统 Sobel 边缘检测方法如下:

  1. 计算梯度值

    通过两个 3×3 的模板 sx,sy 对原始图像 f(x,y) 进行卷积处理,计算出水平和垂直方向的梯度 Gx,Gy 之后,再计算每个像素的梯度 G。

Gx=f(x,y)sxG_x = f(x, y) \cdot s_x

Gy=f(x,y)syG_y = f(x, y) \cdot s_y

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

  1. 确定边缘点。

    手动设置一个阈值 T,如果某个像素的梯度 G 大于这个阈值 T,那么就认为这个像素点是边缘像素,否则舍弃。

Sobel 边缘检测算法的优缺点

Sobel 算子通过两个 3×3 的模板对于每个像素位置的影响做了加权处理,用于进行边缘提取,对噪声具有平滑作用,简单有效。但是由于噪声的影响以及 Sobel 边缘检测方法自身的局限性,往往会检测到非边缘像素点,检测精度不高。

Canny 边缘检测算法

Canny 边缘检测算法是由 John F. Canny 于 1986 年发明的边缘检测算法,作为一种广泛使用的边缘检测算法,它对边缘检测领域的发展产生了深远的影响。Canny 边缘检测方法在提取边缘的同时对噪声做到了很好的抑制,在传统边缘检测方法之中,Canny 算子也凭借其良好的检测效果,简单的实现过程,成为最经典的边缘检测算法之一。其基本过程如下图所示。

Canny算子的一般步骤

基本步骤

传统 Canny 边缘检测方法如下:

(1)通过高斯滤波函数对图像进行平滑处理

首先通过对图像进行高斯滤波处理,平滑图像,避免将噪声视为图像边缘,从而可以尽可能地减少噪声对边缘检测产生的影响。它的原理是对整个图像进行加权平均,每个像素的值通过自身和邻域内像素的加权平均获得,高斯滤波函数:

G(x,y,σ)=12πσ2exp(x2+y22σ2)G(x,y,\sigma) = \frac{1}{2 \pi \sigma^2} \exp \left( -\frac{x^2+y^2}{2\sigma ^2} \right)

其中 σ 为高斯滤波参数。

(2)通过一阶差分算子求滤波后图像的梯度幅值和方向

传统边缘检测算法通常通过计算梯度信息的变化来预测图像的边缘,因此 Canny 算子通过 2×2 的一阶差分算子计算水平和垂直方向的一阶导数,分别记为 GxG_xGyG_y,然后通过水平和垂直方向的梯度信息计算每个像素的梯度 G 和梯度方向 θ:

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

θ=arctan(GyGx)\theta =\arctan \left( \frac{G_y}{G_x} \right)

(3)对梯度幅值进行非极大值抑制

在第二步中 Canny 边缘检测算法计算了每个像素的梯度信息,但是算法最后进行边缘检测的时候仅需要一个边缘信息。非极大值抑制通过搜索局部极大值,抑制非极大值元素,其目的是为了保证边缘精细,将非极大值的点置为 0,剔除一大部分非边缘的点,只保留局部梯度最大的点,将其作为边缘确定。

(4)双阈值法检测边缘

在对图像进行非极大值抑制之后,可以得到图像的边缘,但这时得到的边缘往往不尽人意,由于噪声和图像色彩变化造成的影响,导致一些边缘像素的产生,但这些边缘像素可能并不是真正的边缘。Canny 边缘检测算法通过设置高阈值 TmaxT_{max} 和低阈值 TminT_{min} 两个阈值进行边缘的检测和连接,具体来说:遍历所有像素,如果像素的梯度值高于高阈值 TmaxT_{max},则保留,将其作为确定的边缘;如果像素的梯度值低于低阈值 TminT_{min},则判断其不是边缘像素,舍弃; 如果像素的梯度值介于高低阈值之间,若该像素的邻域中有“确定边缘”(梯度值高于高阈值 TmaxT_{max} 的那些像素),则判断该像素也是边缘像素,否则舍弃。

优缺点

相较于其他边缘检测方法如 Sobel 算子、Roberts 算子等,Canny 算子的边缘检测效果相对较好,在一定程度上减轻了噪声的影响,但也有很多不足之处,比如容易将噪声视为边缘而出错,同时 Canny 算子的检测效果很大程度上取决于高低阈值,而高低阈值通常都是人为设置的经验值,过低或者过高都将直接影响边缘检测的效果,因此该方法的鲁棒性也较弱,容易得到错误的边缘检测结果。

传统优化过的 Canny 边缘检测算法

针对传统 Canny 边缘检测方法的不足之处,许多研究者纷纷提出了改进办法,进一步提高 Canny 边缘检测算法的性能。例如,虽然高斯滤波能够很好的平滑图像,尽可能消除噪声的影响,但不可避免地导致图像细节信息的损失,因此提出了用双边滤波替代高斯滤波;另一方面,由于高斯滤波的参数方差 σ 需要手动设定,因此提出了使用自适应平滑滤波替代高斯滤波;针对 Canny 算子高低阈值需要手动设定的问题提出了使用 Otsu 算法,根据图像自身特点选择最合适的阈值。

参考文献

  1. CANNY J. A Computational Approach to Edge Detection[J]. IEEE Transactions on Pattern Analysis and Machine Intelligence, 1986, PAMI-8(6): 679–698.
  2. 段红燕, 邵豪, 张淑珍等. 一种基于 Canny 算子的图像边缘检测改进算法[J]. 上海交通大学学报, 2016, 50(12): 1861–1865.
  3. 许宏科, 秦严严, 陈会茹. 一种基于改进 Canny 的边缘检测算法[J]. 红外技术, 2014, 36(3): 210–214.