边缘检测

边缘检测:

         在视觉计算理论框架中,抽取二维图像上的边缘、角点、纹理等基本特征,是整个系统框架中的第一步。这些特征所组成的图称为基元图。
         在不同“尺度”意义下的边缘点,在一定条件下包含了原图像的全部信息。
定义:
目前,具有对边缘的描述性定义,即两个具有不同灰度的均匀图像区域的边界,即边界反映局部的灰度变化。
局部边缘是图像中局部灰度级以简单(即单调)的方式作极快变换的小区域。这种局部变化可用一定窗口运算的边缘检测算子来检测。

边缘的描述:
1) 边缘法线方向——在某点灰度变化最剧烈的方向,与边缘方向垂直;
2) 边缘方向——与边缘法线方向垂直,是目标边界的切线方向;
3) 边缘强度——沿边缘法线方向图像局部的变化强度的量度。
 


        边缘检测的基本思想是通过检测每个像素和其邻域的状态,以决定该像素是否位于一个物体的边界上。如果一个像素位于一个物体的边界上,则其邻域像素的灰度值的变化就比较大。假如可以应用某种算法检测出这种变化并进行量化表示,那么就可以确定物体的边界。

 边缘检测算法有如下四个步骤:

滤波:边缘检测算法主要是基于图像强度的一阶和二阶导数,但导数的计算对噪声很敏感,因此必须使用滤波器来改善与噪声有关的边缘检测器的性能.需要指出,大多数滤波器在降低噪声的同时也导致了边缘强度的损失,因此,增强边缘和降低噪声之间需要折衷.

增强:增强边缘的基础是确定图像各点邻域强度的变化值.增强算法可以将邻域(或局部)强度值有显著变化的点突显出来.边缘增强一般是通过计算梯度幅值来完成的.

检测:在图像中有许多点的梯度幅值比较大,而这些点在特定的应用领域中并不都是边缘,所以应该用某种方法来确定哪些点是边缘点.最简单的边缘检测判据是梯度幅值阈值判据.

定位:如果某一应用场合要求确定边缘位置,则边缘的位置可在子像素分辨率上来估计,边缘的方位也可以被估计出来.

    在边缘检测算法中,前三个步骤用得十分普遍。这是因为大多数场合下,仅仅需要边缘检测器指出边缘出现在图像某一像素点的附近,而没有必要指出边缘的精确位置或方向.边缘检测误差通常是指边缘误分类误差,即把假边缘判别成边缘而保留,而把真边缘判别成假边缘而去掉.边缘估计误差是用概率统计模型来描述边缘的位置和方向误差的.我们将边缘检测误差和边缘估计误差区分开,是因为它们的计算方法完全不同,其误差模型也完全不同.


边缘检测的三个共性准则:
•好的检测结果,或者说对边缘的误测率尽可能低,就是在图像边缘出现的地方检测结果中不应该没有;另一方面不要出现虚假的边缘;
•对边缘的定位要准确,也就是我们标记出的边缘位置要和图像上真正边缘的中心位置充分接近;
•对同一边缘要有尽可能低的响应次数,也就是检测响应最好是单像素的。

几种常用的边缘检测算子主要有Roberts边缘检测算子,Sobel算子、Prewitt算子、Krisch边缘算子,高斯-拉普拉斯算子。
边缘大致可以分为两种,一种是阶跃状边缘,边缘两边像素的灰度值明显不同;另一种为屋顶状边缘,边缘处于灰度值由小到大再到小的变化转折点处。
边缘检测的主要工具是边缘检测模板。我们以一个一维模板为例来考察边缘检测模板是如何作用的。假设有一个模板基于Roberts算子的边缘检测 和一幅图象基于Roberts算子的边缘检测

可以看出,图象中左边暗,右边亮,中间存在着一条明显的边缘,是一个典型阶跃状边缘。使用模板基于Roberts算子的边缘检测 进行模板操作后,结果如下

基于Roberts算子的边缘检测

可以看出,边缘检测后的图象在原图象暗亮边缘处的灰度值高很多。观察时,就能发现一条很明显的亮边,其他区域都很暗,这样就起到了边缘检测的作用。
模板的作用是将右邻点的灰度值减去左邻点的灰度值作为该点的灰度值。在灰度相近的区域内,这么做的结果使得该点的灰度值接近于0;而在边缘附近,灰度值有明显的跳变,这么做的结果使得该点的灰度值很大,这样就出现了上面的结果。这种模板就是一种边缘检测器,它在数学上的涵义是一种基于梯度的滤波器,习惯上又称边缘算子。我们知道,梯度是有方向的,和边缘的方向总是垂直的。模板是水平方向的,而上面那幅图象的边缘恰好是垂直方向的,使用模板就可以将它检测出来。如果图象的边缘是水平方向的,我们可以用梯度是垂直
方向的模板基于Roberts算子的边缘检测 检测它的边缘。如果图象的边缘是45。方向的,我们可以用模板基于Roberts算子的边缘检测 检测它的边缘。

常用的边缘检测模板有Laplacian算子、Roberts算子、Sobel算子、log(Laplacian-Gauss)算子、Kirsch算子和Prewitt算子等。

 

二.Roberts算子

 

如果我们沿如下图方向角度求其交叉方向的偏导数,则得到Roberts于1963年提出的交叉算子边缘检测方法。该方法最大优点是计算量小,速度快。但该方法由于是采用偶数模板,如下图所示,所求的(x,y)点处梯度幅度值,其实是图中交叉点处的值,从而导致在图像(x,y)点所求的梯度幅度值偏移了半个像素(见下图)。

 边缘检测

边缘检测 

Roberts算子的推导:

 
Sobel算子

Sobel算子也有两个,一个是检测水平边缘的模板基于Sobel算子的边缘检测 ,另一个是检测水平边缘的模板基于Sobel算子的边缘检测 。与Prewitt算子相比,Sobel算子对于象素位置的影响作了加权,因此效果更好。

sobel算子的另一种形式是各向同性Sobel算子,也有两个模板组成,一个是检测水平边缘的基于Sobel算子的边缘检测 ,另一个是检测垂直边缘的 基于Sobel算子的边缘检测。各向同性Sobel算子和普通Sobel算子相比,位置加权系数更为准确,在检测不同方向的边缘时梯度的幅度一致。

Sobel算子的推导:

Prewitt算子

Prewitt算子由两部分组成,检测水平边缘的模板

基于prewitt算子的边缘检测 和基于prewitt算子的边缘检测检测垂直边缘的模板

prewitt算子一个方向求微分,一个方向求平均,所以对噪声相对不敏感。

 

laplacian算子

Laplacian算子定义为

基于Laplacian算子的边缘检测

它的差分形式为
基于Laplacian算子的边缘检测


表示成模板的形式就是 基于Laplacian算子的边缘检测。Laplacian算子另外一种形式是 基于Laplacian算子的边缘检测,也经常使用。Laplace算子是一种各向同性算子,在只关心边缘的位置而不考虑其周围的象素灰度差值时比较合适。Laplace算子对孤立象素的响应要比对边缘或线的响应要更强烈,因此只适用于无噪声图象。存在噪声情况下,使用Laplacian算子检测边缘之前需要先进行低通滤波。
canny算子????

1. Canny边缘检测基本原理

     (1)图象边缘检测必须满足两个条件:一能有效地抑制噪声;二必须尽量精确确定边缘的位置。

     (2)根据对信噪比与定位乘积进行测度,得到最优化逼近算子。这就是Canny边缘检测算子。

     (3)类似与MarrLoG)边缘检测方法,也属于先平滑后求导数的方法。

2. Canny边缘检测算法

     step1:用高斯滤波器平滑图象

     step2:用一阶偏导的有限差分来计算梯度的幅值和方向

     step3:对梯度幅值进行非极大值抑制

     step4:用双阈值算法检测和连接边缘

step1:高斯平滑函数

边缘检测

Step2:一阶微分卷积模板

边缘检测

step3:非极大值抑制

      仅仅得到全局的梯度并不足以确定边缘,因此为确定边缘,必须保留局部梯度最大的点,而抑制非极大值。(non-maxima suppression,NMS

解决方法:利用梯度的方向。

边缘检测

 

1非极大值抑制

四个扇区的标号为03,对应3*3邻域的四种可能组合。在每一点上,邻域的中心象素M与沿着梯度线的两个象素相比????。如果M的梯度值不比沿梯度线的两个相邻象素梯度值大,则令M=0

即: 边缘检测

 Step4:阈值化

       减少假边缘段数量的典型方法是对N[ij]使用一个阈值。将低于阈值的所有值赋零值。但问题是如何选取阈值?

       解决方法:双阈值算法。双阈值算法对非极大值抑制图象作用两个阈值τ1τ2,且2τ1≈τ2,从而可以得到两个阈值边缘图象N1i,j]和N2ij]。由于N2ij]使用高阈值得到,因而含有很少的假边缘,但有间断(不闭合)。双阈值法要在N2ij]中把边缘连接成轮廓,当到达轮廓的端点时,该算法就在N1i,j]的8邻点位置寻找可以连接到轮廓上的边缘,这样,算法不断地在      N1i,j]中收集边缘,直到将N2i,j]连接起来为止。

3. canny算法程序实现

   Canny算法程序中将上述的4个步骤再加以细分,分成以下7步:

生成高斯滤波系数;

用生成的高斯滤波系数对原图像进行平滑;

求滤波后图像的梯度;

进行非最大抑制;

统计图像的直方图,对阈值进行判定;

利用函数寻找边界起点;

根据6执行的结果,从一个像素点开始搜索,搜索以该像素点为边界起点的一条边界的一条边界的所有边界点

同图像灰度不同,边界处一般会有明显的边缘,利用此特征可以分割图像。需要说明的是:边缘和物体间的边界并不等同,边缘指的是图像中像素的值有突变的地方,而物体间的边界指的是现实场景中的存在于物体之间的边界。有可能有边缘的地方并非边界,也有可能边界的地方并无边缘,因为现实世界中的物体是三维的,而图像只具有二维信息,从三维到二维的投影成像不可避免的会丢失一部分信息;另外,成像过程中的光照和噪声也是不可避免的重要因素。正是因为这些原因,基于边缘的图像分割仍然是当前图像研究中的世界级难题,目前研究者正在试图在边缘提取中加入高层的语义信息。

在实际的图像分割中,往往只用到一阶和二阶导数,虽然,原理上,可以用更高阶的导数,但是,因为噪声的影响,在纯粹二阶的导数操作中就会出现对噪声的敏感现象,三阶以上的导数信息往往失去了应用价值。二阶导数还可以说明灰度突变的类型。在有些情况下,如灰度变化均匀的图像,只利用一阶导数可能找不到边界,此时二阶导数就能提供很有用的信息。二阶导数对噪声也比较敏感,解决的方法是先对图像进行平滑滤波,消除部分噪声,再进行边缘检测。不过,利用二阶导数信息的算法是基于过零检测的,因此得到的边缘点数比较少,有利于后继的处理和识别工作。

各种算子的存在就是对这种导数分割原理进行的实例化计算,是为了在计算过程中直接使用的一种计算单位;

 

Roberts算子:边缘定位准,但是对噪声敏感。适用于边缘明显且噪声较少的图像分割。Roberts边缘检测算子是一种利用局部差分算子寻找边缘的算子,Robert算子图像处理后结果边缘不是很平滑。经分析,由于Robert算子通常会在图像边缘附近的区域内产生较宽的响应,故采用上述算子检测的边缘图像常需做细化处理,边缘定位的精度不是很高

Prewitt算子:对噪声有抑制作用,抑制噪声的原理是通过像素平均,但是像素平均相当于对图像的低通滤波所以Prewitt算子对边缘的定位不如Roberts算子。

Sobel算子Sobel算子和Prewitt算子都是加权平均,但是Sobel算子认为,邻域的像素对当前像素产生的影响不是等价的,所以距离不同的像素具有不同的权值,对算子结果产生的影响也不同。一般来说,距离越远,产生的影响越小。

Isotropic Sobel算子:加权平均算子,权值反比于邻点与中心点的距离,当沿不同方向检测边缘时梯度幅度一致,就是通常所说的各向同性。

在边沿检测中,常用的一种模板是Sobel 算子。Sobel 算子有两个,一个是检测水平边沿的;另一个是检测垂直平边沿的 。Sobel算子另一种形式是各向同性Sobel(Isotropic Sobel)算子,也有两个,一个是检测水平边沿的 ,另一个是检测垂直平边沿的 。各向同性Sobel算子和普通Sobel算子相比,它的位置加权系数更为准确,在检测不同方向的边沿时梯度的幅度一致。由于建筑物图像的特殊性,我们可以发现,处理该类型图像轮廓时,并不需要对梯度方向进行运算,所以程序并没有给出各向同性Sobel算子的处理方法。
   
 由于Sobel算子是滤波算子的形式,用于提取边缘,可以利用快速卷积函数,简单有效,因此应用广泛。美中不足的是,Sobel算子并没有将图像的主体与背景严格地区分开来,换言之就是Sobel算子没有基于图像灰度进行处理,由于Sobel算子没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意。  在观测一幅图像的时候,我们往往首先注意的是图像与背景不同的部分,正是这个部分将主体突出显示,基于该理论,我们可以给出阈值化轮廓提取算法,该算法已在数学上证明当像素点满足正态分布时所求解是最优的。

上面的算子是利用一阶导数的信息,属于梯度算子范畴。

Laplacian算子:这是二阶微分算子。其具有各向同性,即与座标轴方向无关,座标轴旋转后梯度结果不变。但是,其对噪声比较敏感,所以,图像一般先经过平滑处理,因为平滑处理也是用模板进行的,所以,通常的分割算法都是把Laplacian算子和平滑算子结合起来生成一个新的模板。

Laplacian算子一般不以其原始形式用于边缘检测,因为其作为一个二阶导数,Laplacian算子对噪声具有无法接受的敏感性;同时其幅值产生算边缘,这是复杂的分割不希望有的结果;最后Laplacian算子不能检测边缘的方向;所以Laplacian在分割中所起的作用包括:(1)利用它的零交叉性质进行边缘定位;(2)确定一个像素是在一条边缘暗的一面还是亮的一面;一般使用的是高斯型拉普拉斯算子(Laplacian of a Gaussian,LoG),由于二阶导数是线性运算,利用LoG卷积一幅图像与首先使用高斯型平滑函数卷积改图像,然后计算所得结果的拉普拉斯是一样的。所以在LoG公式中使用高斯函数的目的就是对图像进行平滑处理,使用Laplacian算子的目的是提供一幅用零交叉确定边缘位置的图像;图像的平滑处理减少了噪声的影响并且它的主要作用还是抵消由Laplacian算子的二阶导数引起的逐渐增加的噪声影响。

 

微分算子在图像处理中扮演重要的角色,其算法实现简单,而且边缘检测的效果又较好,因此这些基本的微分算子是学习图像处理过程中的必备方法,下面着重讨论几种常见的微分算子。

1.Sobel

 其主要用于边缘检测,在技术上它是以离散型的差分算子,用来运算图像亮度函数的梯度的近似值,缺点是Sobel算子并没有将图像的主题与背景严格地区分开来,换言之就是Sobel算子并没有基于图像灰度进行处理,由于Sobel算子并没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意,算法具体实现很简单,就是3*3的两个不同方向上的模板运算,这里不再写出。

2.Robert算子

根据任一相互垂直方向上的差分都用来估计梯度,Robert算子采用对角方向相邻像素只差

3.Prewitt算子

   该算子与Sobel算子类似,只是权值有所变化,但两者实现起来功能还是有差距的,据经验得知Sobel要比Prewitt更能准确检测图像边缘。

4.Laplacian算子

   拉普拉斯算子是一种二阶微分算子,若只考虑边缘点的位置而不考虑周围的灰度差时可用该算子进行检测。对于阶跃状边缘,其二阶导数在边缘点出现零交叉,并且边缘点两旁的像素的二阶导数异号。

5.Canny算子

该算子功能比前面几种都要好,但是它实现起来较为麻烦,Canny算子是一个具有滤波,增强,检测的多阶段的优化算子,在进行处理前,Canny算子先利用高斯平滑滤波器来平滑图像以除去噪声,Canny分割算法采用一阶偏导的有限差分来计算梯度幅值和方向,在处理过程中,Canny算子还将经过一个非极大值抑制的过程,最后Canny算子还采用两个阈值来连接边缘。

下面算法是基于的算法不可能直接运行,只是我把Canny的具体实现步骤写了出来,若需用还要自己写。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章