边缘检测算子

来源:互联网 发布:联想m7400扫描软件 编辑:程序博客网 时间:2024/04/28 20:20

1、LoG边缘检测算子

LoG(高斯拉普拉斯函数)边缘检测算子是DavidCourtnay Marr和Ellen Hildreth(1980)共同提出的[1] 。因此,也称为边缘检测算法或Marr & Hildreth算子。该算法首先对图像做高斯滤波,然后再求其拉普拉斯(Laplacian)二阶导数。即图像与Laplacian of the Gaussian function 进行滤波运算。最后,通过检测滤波结果的零交叉(Zero crossings)可以获得图像或物体的边缘。因而,也被业界简称为Laplacian-of-Gaussian(LoG)算子。

MarrHildreth论证过,满足这些条件最令人满意得到算子是滤波器,是拉普拉斯算子,

G是标准差为(有时也称为空间常数)的二维高斯函数:

.

经过计算

称为高斯拉普拉斯(LoG.

LoG的零交叉出现在处,它定义了一个中心位于原点,

半径为的圆

LoG函数有时也称为墨西哥草帽算子。一个正的中心项由紧邻的负区域包围着,中心项的值以距原点的距离为函数而增大,

而外层区域的值零。系数之和必须为零,从而模板的响应在恒定灰度区域为零。

 

2Prewitt算子

Prewitt算子是一种一阶微分算子边缘检测,利用像素点上下、左右邻点的灰度差,在边缘处达到极值检测边缘,去掉部分伪边缘,对噪声具有平滑作用。其原理是在图像空间利用两个方向模板与图像进行邻域卷积来完成的,这两个方向模板一个检测水平边缘,一个检测垂直边缘。

对数字图像f(xy)Prewitt算子的定义如下:

G(i)=|[f(i-1,j-1)+f(i-1,j)+f(i-1j+1)]-[f(i+1,j-1)+f(i+1j)+f(i+1j+1)]|

G(j)=|[f(i-1,j+1)+f(i,j+1)+f(i+1j+1)]-[f(i-1,j-1)+f(i,j-1)+f(i+1j-1)]|

P(i,j)=max[G(i),G(j)]P(i,j)=G(i)+G(j)

经典Prewitt算子认为:凡灰度新值大于或等于阈值的像素点都是边缘点。即选择适当的阈值T,若P(i,j)≥T,则(i,j)为边缘点,P(i,j)为边缘图像。这种判定是欠合理的,会造成边缘点的误判,因为许多噪声点的灰度值也很大,而且对于幅值较小的边缘点,其边缘反而丢失了。

 

在一个较大区域中,用两点的偏导数值来求梯度幅度值,受噪声干扰很大。若对两个点的各自一定领域内的灰度值求和,并根据两个灰度值和的差来计算x,y的偏导数,则会在很大程度上降低噪声干扰。源于这种思想,Prewitt1970年提出了提取边缘的Prewitt算子

 

3Roberts算子

罗伯茨算子、Roberts算子是一种最简单的算子,是一种利用局部差分算子寻找边缘的算子。

他采用对角线方向相邻两象素之差近似梯度幅值检测边缘。检测垂直边缘的效果好于斜向边缘,定位精度高,对噪声敏感,无法抑制噪声的影响。

1963年,Roberts提出了这种寻找边缘的算子。Roberts边缘算子是一个2x2的模板,采用的是对角方向相邻的两个像素之差。从图像处理的实际效果来看,边缘定位较准,对噪声敏感。

Roberts算子的推导:

4、Canny算子

Canny边缘检测算子是John F.Canny于 1986 年开发出来的一个多级边缘检测算法。更为重要的是 Canny 创立了边缘检测计算理论(Computational theory of edge detection)解释这项技术如何工作。

Canny算子必须满足两个步骤

    1)有效的抑制噪声,使用高斯算子对图像进行平滑;

    2)尽量精确的确定边缘的位置;

Canny算子的边缘检测可以分为三个步骤:

Step 1:  高斯平滑函数。目的是为了平滑以消除噪声;

Step 2:一阶差分卷积模板。目的是为了达到边缘增强。

  该步骤有点类似于与两个方向模板进行卷积运算。这两个方向模板为(a)和(b)所示:左图体现的是在X方向上的差异,右图体现的是在y方向上的差异。同时获得梯度幅值的大小以及方向角。通过该步,获得在边缘位置处特征被加强的图像。

 

Step 3:非极大值抑制(NMS)。目的是保留梯度方向上的最大值。

这一步是比较关键的一点:

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

 

5Sobel算子

计算机视觉领域的一种重要处理方法。主要用于获得数字图像的一阶梯度,常见的应用和物理意义是边缘检测。在技术上,它是一个离散的一阶差分算子,用来计算图像亮度函数的一阶梯度之近似值。在图像的任何一点使用此算子,将会产生该点对应的梯度矢量或是其法矢量。

这个著名的Sobel边缘算子,是在一次博士生课题讨论会(1968)上提出("A 3x3 Isotropic Gradient Operator forImage Processing")提出。

图2 灰度图像sobel算子处理效果图

核心公式

该算子包含两组3x3矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。如果以A代表原始图像,GxGy分别代表经横向及纵向边缘检测的图像,其公式如下:

以上为x和y两个方向的sobel算子模板

图像的每一个像素的横向及纵向梯度近似值可用以下的公式结合,来计算梯度的大小。

然后可用以下公式计算梯度方向。

在以上例子中,如果以上的角度Θ等于零,即代表图像该处拥有纵向边缘,左方较右方暗。

具体计算如下:

 

算子描述

在边缘检测中,常用的一种模板是Sobel算子。Sobel 算子有两个,一个是检测水平边缘的;另一个是检测垂直边缘的。与Prewitt算子相比,Sobel算子对于像素的位置的影响做了加权,可以降低边缘模糊程度,因此效果更好。

Sobel算子另一种形式是各向同性Sobel(Isotropic Sobel)算子,也有两个,一个是检测水平边缘的,另一个是检测垂直边缘的。各向同性Sobel算子和普通Sobel算子相比,它的位置加权系数更为准确,在检测不同方向的边沿时梯度的幅度一致。将Sobel算子矩阵中的所有2改为根号2,就能得到各向同性Sobel的矩阵。

由于Sobel算子是滤波算子的形式,用于提取边缘,可以利用快速卷积函数,简单有效,因此应用广泛。美中不足的是,Sobel算子并没有将图像的主体与背景严格地区分开来,换言之就是Sobel算子没有基于图像灰度进行处理,由于Sobel算子没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意。在观测一幅图像的时候,我们往往首先注意的是图像与背景不同的部分,正是这个部分将主体突出显示,基于该理论,我们给出了下面阈值化轮廓提取算法,该算法已在数学上证明当像素点满足正态分布时所求解是最优的。

C代码

/* Sobel template
a00 a01 a02
a10 a11 a12
a20 a21 a22
*/
unsigned char a00, a01, a02;
unsigned char a10, a11, a12;
unsigned char a20, a21, a22;
void MySobel(IplImage* gray, IplImage* gradient)
{
CvScalar color ;
for (int i=1; i<gray->height-1; ++i)
{
for (int j=1; j<gray->width-1; ++j)
{
a00 = cvGet2D(gray, i-1, j-1).val[0];
a01 = cvGet2D(gray, i-1, j).val[0];
a02 = cvGet2D(gray, i-1, j+1).val[0];
a10 = cvGet2D(gray, i, j-1).val[0];
a11 = cvGet2D(gray, i, j).val[0];
a12 = cvGet2D(gray, i, j+1).val[0];
a20 = cvGet2D(gray, i+1, j-1).val[0];
a21 = cvGet2D(gray, i+1, j).val[0];
a22 = cvGet2D(gray, i+1, j+1).val[0];
// x方向上的近似导数
double ux = a20 * (1) + a21 * (2) + a22 * (1)
+ (a00 * (-1) + a01 * (-2) + a02 * (-1));
// y方向上的近似导数
double uy = a02 * (1) + a12 * (2) + a22 * (1)
+ a00 * (-1) + a10 * (-2) + a20 * (-1);
color.val[0] = sqrt(ux*ux + uy*uy);
cvSet2D(gradient, i, j, color);
}
}
}
//注释:该程序需要在安装Opencv软件下运行。
Matlab
ps=imread('D:\14.jpg'); %读取图像
subplot(1,3,1)
imshow(ps);
title('原图像');
ps=rgb2gray(ps);
[m,n]=size(ps); %用Sobel微分算子进行边缘检测
pa = edge(ps,'sobel');
subplot(1,3,2);
imshow(pa);
title('Sobel边缘检测得到的图像');

 

6Laplacian算子

Laplacian 算子是n维欧几里德空间中的一个二阶微分算子,定义为梯度grad()的散度div()。

定义

编辑

如果f是二阶可微的实函数,则f的拉普拉斯算子定义为:

(1) f的拉普拉斯算子也是笛卡儿坐标系xi中的所有非混合二阶偏导数求和:

(2) 作为一个二阶微分算子,拉普拉斯算子把C函数映射到C函数,对于k≥ 2。表达式(1)(或(2))定义了一个算子Δ : C(R) → C(R),或更一般地,定义了一个算子Δ : C(Ω) → C(Ω),对于任何开集Ω

对于阶跃状边缘,导数在边缘点出现零交叉,即边缘点两旁二阶导数取异号。据此,对数字图像{fij}的每个像素,取它关于x轴方向和y轴方向的二阶差分之和,表示为

运算模板

函数的拉普拉斯算子也是该函数的黑塞矩阵的迹,可以证明,它具有各向同性,即与坐标轴方向无关,坐标轴旋转后梯度结果不变。如果邻域系统是4邻域,Laplacian算子的模板为:

0

1

0

1

-4

1

0

1

0

如果邻域系统是8 邻域,Laplacian 算子的模板为:

1

1

1

1

-8

1

1

1

1

前面提过,Laplacian 算子对噪声比较敏感,所以图像一般先经过平滑处理,因为平滑处理也是用模板进行的,所以,通常的分割算法都是把Laplacian算子和平滑算子结合起来生成一个新的模板。

 

 

 

7、Kirsch算子

Kirsch算子是R.Kirsch提出来一种边缘检测新算法,它采用8个模板对图像上的每一个像素点进行卷积求导数,这8个模板代表8个方向,对图像上的8个特定边缘方向作出最大响应,运算中取最大值作为图像的边缘输出(上述算法中用到的8个模板在下面的实现代码中给出)。为了便于读者理解该算法的实现,这里我们给出实现该算法的函数代码,读者可以稍加改动应用到自己的项目中去。[1] 

intntemplate[8][9]={{5,5,5,-3,0,-3,-3,-3,-3},
{-3,5,5,-3,0,5,-3,-3,-3},
{-3,-3,5,-3,0,5,-3,-3,5},
{-3,-3,-3,-3,0,5,-3,5,5},
{-3,-3,-3,-3,0,-3,5,5,5},
{-3,-3,-3,5,0,-3,5,5,-3},
{5,-3,-3,5,0,-3,5,-3,-3},
{5,5,-3,5,0,-3,-3,-3,-3}};//3×3

用这个8个模版来计算每个边缘方向的最大响应值作为边缘特征值-边缘强度。

对数字图象的第一个象素考察它的八个邻点灰度变化,以其中的三个相邻的点的加权减去剩下五个邻点的加权和。令三个邻点环绕不断移位,取
其差值的最大值作为Kirsch算子值。通常Kirsch算子由 

8个模板组成,分别记为K0、K1、K2、K3、K4、K5、K6和K7。图象上的每个象素都用这8个模板运算后,选择其中最大值作为该象素的边缘强度。

0 0
原创粉丝点击