目录
一阶边缘检测
基本一阶差分算子
Robert算子
Prewitt算子
Sobel算子
Canny算子
二阶边缘检测
拉普拉斯算子
LoG算子
各种边缘检测算子的比较
低层次的特征是不需要任何形状信息(空间关系的信息)就可以从图像中自动提取的特征,所有低层次方法都可以作为高层次特征提取的预处理,从而在图像中找到形状(边缘)。
边缘是一组相连的像素集合,边缘周围像素的灰度值存在强烈的反差。边缘是图像的最基本特征,是图像局部特性不连续的结果,广泛存在于物体与背景之间、物体与物体之间、基元与基元之间,既是图像分割所依赖的重要特征,也是纹理特征的重要信息源和形状特征的基础。边缘检测在计算机视觉、图像分析等应用中起着重要的作用,是图像分析与识别的重要环节。
常见的边缘类型主要有:屋顶状边缘(它位于灰度值从增加到减少的变化转折点)、阶跃型边缘(两边的像素的灰度值有着显著的不同)、斜坡边缘、脉冲型边缘等几种,如下图所示。
经典的边缘检测算法利用空间域滤波方法考察图像中每个像素在其邻域内的灰度变化,利用轮廓处图像灰度值局部不连续性和邻域相似性的特点,求取图像局部梯度来判断图像变化的剧烈程度。
边缘检测包括一阶边缘检测和二阶边缘检测。
图像边界发生亮度级的阶梯变化,边缘是阶梯变化的位置,一阶微分可以使阶梯变化增强,而当信号没有变化时,一阶微分不响应。
一阶边缘检测算子是具有方向依赖性的,即水平边缘检测算子在水平方向上的差分(差分模拟微分)为0,形成水平相邻像素的插值,可以用于检测垂直边缘而不能检测水平边缘。
水平边缘检测算子用于检测垂直边缘:
(1)
注意,水平边缘检测算子检测到的是垂直方向上的边缘,垂直边缘算子检测到的是水平方向上的边缘。
垂直边缘检测算子:
(2)
将两个算子相结合,即可得到同时检测水平边缘和垂直边缘的算子:
(3)
卷积核如下图所示:
利用这个算子的边缘检测实现很简单,伪代码如下:
edge(pix)
newpic = zeros(pic)
for x : 0...rows(pic)-2
for y : 0...cols(pic)-2
newpic(x,y) = |2*pic(x,y) - pic(x,y+1) - pic(x+1,y)|
return newpic
边缘检测完成后,经常会使用阈值方法选取最亮点,得到优化的边缘。阈值的选取决定最亮点的数量,阈值越大选取得到的点越少,阈值的选取可以凭经验,也可以由边缘数据自动的选取。
在实际的图像处理中,为了降低计算量,微分运算都用差分来近似,两个相邻点的灰度差分可近似表示为微分运算。
由泰勒展开式可得以下两式:
(4)
由此可得,相邻两点的差值是一阶导数的估算值,决定了估算误差,减小误差的一个办法是:在相邻的像素间插入一个新的像素来实现。
的情况下,差分模拟微分的误差大大减小,一阶差分模板就如下所示:
Robert交叉算子(Robert,1965)是最早期的边缘检测算子,利用两个模板,计算对角线上的差值,这两个模板如下图所示。
实现过程中,利用这些模板卷积得到的最大值作为边缘存储值,边缘点Ex,y是在图像点Px,y对这两个模板进行卷积得到的两个值中的较大者。
(7)
Robert交叉算子检测到的边缘结果如图所示。
Prewitt边缘检测算子,是在基本差分算子上扩展得到的,由于它检测的是变化,必然对噪声及图像亮度的阶梯式变化有所响应(功能上相当于频域中的高通滤波器)。
Prewitt算子如下图所示。
Prewitt算子给出两个结果,沿x、y两个坐标轴的亮度变化率,两个向量的和就是该点的边缘向量,向量包括强度和方向。
图像的局部梯度可以用来判断图像变化的剧烈程度,对一个连续图像函数f(x,y)它在位置(x,y)的梯度可表示为一个矢量:
上式中Gx和Gy分别沿x方向和y方向的偏导数,这个矢量的幅度(∇f)和方向角φ(x,y)分别为:
方向角可以用于确定边缘方向。
在实际的图像处理中,为了降低计算量,微分运算都用差分来近似,两个相邻点的灰度差分可近似表示为微分运算:
即∇xf近似∂f/∂x,∇yf近似∂f/ ∂y 。将式(11)代入式(9)得梯度
以Prewitt水平算子为例,边缘检测的实现伪代码如下:
我们把Pewitt算子应用于正方形图像[参见图(a),就可以得到边缘强度和方向,分别如图(b)和图(d)所示,其中(d)中没有包括边界点,只有执行点的边缘方向。图(d)所示的边缘方向显示的是度数,其中0°和360°表示水平方向,朝右方向,而90°表示垂直方向,朝上方向。
由于该算子的均值处理特性,虽然边缘点的区域较宽,但边缘数据比前面介绍的一阶算子更清晰,使亮度变化明显的区域得到加强。边缘方向以图像方式表示显得不太清晰,利用的向量方式表示更好,如图(c)所示。利用向量方式,正方形角点处的边缘方向数据显然无法很好表示(由于一阶导数在这些点不连续)。
Sobel边缘检测算子是Prewitt检测算子的扩展,在中心像素位置取权重2,由向量方式确定边缘的两个掩码mask组成的,Sobel算子曾长期是最受欢迎的边缘检测算子,比Prewitt算子的检测性能好(最明显的优点是抑制噪声的性能)。
如图所示,Sobel 边缘检测算子也是分两个方向的,分别计算偏x方向的梯度分量Gx,偏y方向的梯度分量Gy,求绝对值,压缩到 [0, 255]区间,然后合并梯度G(x, y) = Gx + Gy,就是sobel边缘检测后的图像了。 将Sobel算子的边缘检测实现划分为五个步骤:
(1) 计算Gx与Gy与模板每行的卷积。
(2) 两个3x3矩阵的卷积即将每一行每一列对应相乘然后相加。
(3) 求得3*3模板运算后的Gx、Gy。
(4) 求Gx^2 + Gy^2的平方根或者直接对Gx和Gy取绝对值后求和。
(5)设置一个阈值,运算后的像素值大于该阈值输出为全1,小于该阈值输出为全0。
顺便提一下5阶Sobel模板(不常用):
基于Sobel算子的边缘检测效果:
Canny算子是在Sobel算子的基础上进行优化的,Canny在考察了边缘检测算子在边缘检测中的应用后,提出了边缘检测的三个原则:
(1) 准确性,无附加响应的最优检测(减少噪声响应),即对轮廓的误检率要尽可能低,主要包括两方面,一方面在原始图像中边缘出现的位置应该都能在检测结果中有对应的边缘点;另一方面轮廓检测结果也没有虚假的边缘。
通过最优化平滑处理来实现,最常用的是高斯滤波(Canny认为),高斯滤波可能会将边缘放大(区域变宽)。
(2) 精确性,即对边缘的定位要精确,检测到的边缘位置要和原始图像上对应边缘的中心位置充分接近,尽量保证检测到的轮廓线的中心就是原始图像轮廓的中心;
可以通过非极大值抑制(相当于峰值检测)来实现,非极大值抑制只返回项脊处的点,其他的点会被抑制掉。这其实是一种细化处理:返回的是正确位置上的边缘点连成的更细的边缘线,尽量使边缘的宽度变成1个像素,这个像素在梯度方向上的梯度值是最大的。如果一个点两侧的梯度小于该点上的梯度,那么它就是极大值,所以我们需要先得到边缘法线上的梯度值。
(3) 单边响应,即对同一边缘要有低的响应次数,理想状态是原始图像上只有一个边缘点时,检测出来的边缘也只保持一个点。
Canny算子的计算步骤如下:
Prewitt梯度算子利用一阶差分:f '(x) = f(x) - f(x - 1)得到内核模板,对于二阶差分,有
f '(x) = (f(x + 1) - f(x)) - (f(x) - f(x - 1))
化简后:f '(x) = f(x - 1) - 2 f(x)) + f(x + 1)。
提取前面的系数:[1, -2, 1],二维的情况下,同理可得f '(x, y) = -4 f(x, y) + f(x-1, y) + f(x+1, y) + f(x, y-1) + f(x, y+1)提取各个系数,得到模板的形式
图像函数的拉普拉斯变换定义为:
计算公式:
考虑写对角线上像素的情况下的改进型拉普拉斯算子模板为:
梯度计算公式:
与原图卷积运算即可求出边缘。
拉普拉斯算子作为一个二阶算子,它的优点是:
跟Sobel梯度算子相比,它的缺点是:
边缘检测关注的是像素变化明显的边缘而非细节,而且某些边缘检测算子对噪声敏感,所以,在进行边缘检测之前,一般都通过选定的空间滤波器进行平滑去噪,在保持图像边缘信息的前提下,减少图像的细节和噪声。
试想一种科学的边缘提取方案:
1)高斯滤波对图像进行平滑去噪
2)利用拉普拉斯算子进行滤波
进而进化出了另外一种提取边缘的算法:对高斯滤波函数进行二阶求导,拿高斯二阶导数生成的模板再去进行图像滤波。这种方式就是拉普拉斯算子与高斯平滑过程一起利用零交叉找边缘。
已知高斯函数模型:
计算得到高斯函数的拉普拉斯算子为:
上式称为高斯型拉普拉斯算子LoG。
近似的5✖5阶LoG模板:
高斯型函数的目的是对图像进行平滑处理,平滑处理减少了噪声的影响,拉普拉斯算子的目的是提供一幅用零交叉确定边缘位置的图像。
缺点
优点
尽管LoG的诸多优点,但是Sobel算子依然是被更多应用的边缘检测算子。
选取特定的边缘检测算子取决于应用本身,许多应用并不要求复杂的高级算子。
通过对比一阶微分算子和二阶微分算子的处理效果发现:一阶微分处理通常会产生较宽的边缘,二阶微分处理对细节有较强的响应,如细线和孤立点,一阶微分处理一般对灰度阶跃有较强的响应,而二阶微分处理对灰度级阶梯变化产生双响应,二阶微分在图像灰度值变化相似时,对线的响应要比对灰度阶梯变化强,而且对点的响应比线响应强。因此,在图像中应用二阶微分处理比一阶微分处理形成增强细节的能力更好,而一阶微分处理主要应用于图像的边缘增强和提取。