几种边缘算子的程序仿真和比较结果
2015-11-10 15:12
190 查看
1 常用的边缘检测算法简介
边缘是指图像中周围像素灰度有阶跃变化或屋顶变化的那些像素的集合。在图理过程中,边缘能大大地减少要处理的图像信息而又可以保留图像中物体的形状信息。边缘检测的目的是为了标识数字图像中亮度变化明显的点。边缘检测可以划分为两类:基于查找和基于零穿越的边缘检测。基于查找的方法通过寻找图像一阶导数中的最大和最小值来检测边界,通常是将边界定位在梯度最大的方向。基于零穿越的方法通常采用 Laplace 过零点或者非线性差分表示的过零点来进行边缘检测。对常用的几种边缘检测算法简介如下:Roberts 算子采用对角线方向相邻两像素之差近似的梯度幅值来检测边缘。算子定位比较精确,但由于不包括平滑,所以对于噪声比较敏感,检测水平和垂直边缘的效果好于斜向边缘,定位精度高,对噪声敏感。
Sobel 算子根据图像的像素点上下、左右邻点灰度加权差在边缘处达到极值这一现象来检测边缘。算子对噪声具有平滑作用,能提供较为精确的边缘方向信息,边缘定位精度不够高。当对精度要求不是很高时,是一种较为常用的图像边缘检测方法。
Prewitt 算子边缘检测的思路与 Sobel 微分算子的思路类似,是在一个奇数大小的模板中定义其微分运算。算子对噪声具有平滑作用,定位精度也不够高。
Laplace 算子是二阶微分算子,利用边缘点处二阶导函数出现零交叉原理来检测图像的边缘。算子不具方向性,对灰度突变比较敏感,定位精度高,同时对噪声比较敏感,且不能获得边缘方向等信息。
Canny 方法则是以一阶导数为基础来判断图像的边缘点。它是一阶传统微分中检测阶跃型边缘效果最好的算子之一。它比 Roberts 算子、Sobel 算子和 Prewitt 算子极小值算法的去噪能力都要强,并能产生较细的边缘,但它也容易平滑掉一些边缘信息。
1.1 Roberts边缘算子
Roberts边缘检测算子是一种利用局部差分算子寻找边缘的算子, 所采用的是对角方向相邻的两个像之差,算子由式(1)给出。其幅值为:
其中 G(x,y)表示处理后 (x,y)点的灰度值, f(x,y)表示处理前各点的灰度值。
该算子对应的两个2*2 模板为:
1.2 Sobel边缘算子
Sobel边缘检测算子是先做成加权平均,再微分,然后求梯度"算子的计算方法如式(2)(2)
其幅值为: |
以下两个卷积核形成了Sobel边缘检测算子,前者对水平边缘影响最大,后者则对垂直边缘影响最大。实际应用中,图像中的每个像素取两个卷积核的最大值作为该像素点的输出值。运算结果是一幅边缘幅度图像。 由于Sobel算子对于像素的位置的影响做了加权,加权平均边宽 像素,因此效果更好。
1.3 Prewitt边缘检测算子
Prewitt边缘检测算子是一种利用局部差分平均方法寻找边缘的算子, 它体现了三对像素点像素值之差的平均概念。以下两个卷积核形成了Prewitt 边缘检测算子。同使用Sobel算子的方法一样,图像中的每个点都用这两个核进行卷积,取最大值作为输出。Prewitt算子也产生一幅边缘幅度图像。
1.4 Laplace边缘检测算子
Laplace算子是二阶微分算子,它是一个标量,不是向量,也进行各向同性的运算。它对灰度突变敏感。在数字图像中,可用差分来近似, 的Lpalace运算为公式(3):(3)
由于Laplace是二阶差分运算,因此,在灰度阶跃边缘的两侧均有响应。其值一边为正,一边为负,而对斜坡形边缘响应为零,即值为零,并且在此零值点的两侧也有一正一负两个峰值。不论是阶跃边缘还是斜坡边缘,这一正一负两峰值的大小及走向,反映了边缘的强弱及走向。
1.5 Canny边缘检测算子
Canny算子是一种既能抗噪又能保持弱边缘的算子,对于阶跃型边缘!如果能通过平滑算子去除噪声,这样会增加边缘定位的不确定性。 如果提高边缘检测算子对边缘的敏感性,则会增强对噪声的敏感性。因此,边缘检测算子的抗干扰能力和边缘定位能力便成为一对不可统一的矛盾,所以只能取适当的阈值进行必要的折衷!才能得到较好的效果。Canny算子是高期函数的一阶导数:
与边缘方向垂直,其估计值为:
边缘的位置就是Gn 取极值的点也就是满足:
2 实验结果与分析比较
本次实验的边缘检测程序由matlab语言编写,运行结果如下图1:图1 几种边缘算子仿真结果
通过实验结果与分析,以及参考文献,我们可以得出如下结论:
Roberts 算子简单直观,Laplace算子利用二阶导数零交叉特性检测边缘。Roberts算子和 Laplace算子定位精度较高,但对噪声较为敏感。Laplace 算子只能获得边缘位置信息,不能得到边缘的方向等信息。
Prewitt 算子和 Sobel 算子都是一阶的微分算子,而前者是平均滤波,后者是加权平均滤波且检测到的图像边缘可能大于两个像素。这两者对灰度渐变低噪声的图像有较好的检测效果,但是对于混合多复杂噪声的图像,处理效果就不理想了。Prewitt 算子和 Sobel 算子对噪声具有较好的平滑作用,能滤除一些噪声,去掉部分伪边缘,但同时也平滑了真正的边缘;定位精度不高。Sobel 算子可提供最精确的边缘方向估计。
Sobel 算子、Prewitt 算子检测斜向阶跃边缘效果较好,Roberts 算子检测水平和垂直边缘效果较好。Roberts 算子检测垂直和水平方向的阶跃边缘、线的效果比检测斜向阶跃边缘、线的效果好,保留住了矩形的角点,而 Sobel 和 Prewitt 算子则不及,尤其是 Prewitt 算子基本丢失了角点信息。而 Sobel 和 Prewitt 算子检测斜向阶跃边缘、线的效果较好,保留住了三角形的角点。
Canny 算子对各种噪声图像最敏感。
Sobel、Prewitt、Roberts 边缘检测算子检测图像边缘时易出现“削顶”现象,即对图像顶部检测困难。
表1边缘检测算子的特点和适用范围比较
算子 特点 适用范围 |
Sobel 采用加权滤波,边缘较宽,间断点较多 灰度渐变、低噪声图像
Prewitt 采用平均滤波,边缘较宽,间断点较多 灰度渐变、低噪声图像
Laplace 各向同性、线性、位移不变的;对细线和 屋顶型边缘的检测
孤立点效果较好但对噪声较敏感
Canny 以一阶导数确定边缘点,高定位精度、低 高噪声图像
误判率、可以抑制虚假边缘
I1=imread('1.jpg');
subplot(2,3,1);
imshow(I1);
title('原始图像');
axis([50,250,50,200]);
grid on;
axis on;
I2=im2bw(I1);
subplot(2,3,2);
imshow(I2);
title('二值图像');
axis([50,250,50,200]);
grid on;
axis on;
I3=edge(I2,'roberts');
subplot(2,3,3);
imshow(I3);
title('roberts算子分割结果');
axis([50,250,50,200]);
grid on;
axis on;
I4=edge(I2,'sobel');
subplot(2,3,4);
imshow(I4);
title('sobel算子分割结果');
axis([50,250,50,200]);
grid on;
axis on;
I5=edge(I2,'Prewitt');
subplot(2,3,5);
imshow(I5);
title('Prewitt算子分割结果');
axis([50,250,50,200]);
grid on;
axis on;
I6=edge(I2,'canny');
subplot(2,3,6);
imshow(I6);
title('canny算子分割结果');
axis([50,250,50,200]);
grid on;
axis on;
相关文章推荐
- Android 判断网络状态,并且在没有网络的时候,打开网络设置对话框
- Android快速SDK(3)数据库Sqlite
- 蓝牙相关
- junit类找不到的问题解决
- 关于drools的简单笔记
- 二、根据向导创建ObjectARX 程序
- C# 获取一定区间的随即数 0、1两个值除随机数以外的取值方法(0、1两个值被取值的概率相等)
- linux系统环境下,对文件进行加密
- OC-点语法
- C# 获取一定区间的随即数 0、1两个值除随机数以外的取值方法(0、1两个值被取值的概率相等)
- Nova中的系统状态分析
- PHP 实现Session入库/存入redis
- Web版百度地图加载离线瓦片
- JSON对象长度和遍历方法
- 详解 UIView 的 Tint Color 属性
- 获取微信版本号 user agent
- libvma状态机代码阅读
- shader LOD快速生成具体是种怎样的技术?
- VS2008 根据文件的命名不同,选择不同的编译模式
- 网格部件如何实现列内容的自动换行