整理基于MATLAB边缘检测与提取的几种方法的比较精品资料.docx
《整理基于MATLAB边缘检测与提取的几种方法的比较精品资料.docx》由会员分享,可在线阅读,更多相关《整理基于MATLAB边缘检测与提取的几种方法的比较精品资料.docx(14页珍藏版)》请在冰豆网上搜索。
整理基于MATLAB边缘检测与提取的几种方法的比较精品资料
基于MATLAB边缘检测与提取的几种方法的比较
数字图像边缘检测(DigitalImageProcessing)又称为计算机图像边缘检测,它是指将图像信号转换成数字信号并利用计算机对其进行处理的过程。
由于图像边缘是图像最基本的特征之一,往往携带着一幅图像的大部分信息。
而边缘存在于图像的不规则结构和不平稳现象中,也即存在于信号的突变点处,这些点给出了图像轮廓的位置,这些轮廓常常是我们在图像边缘检测时所需要的非常重要的一些特征条件,这就需要我们对一幅图像检测并提取出它的边缘。
在通常情况下,我们可以将信号中的奇异点和突变点认为是图像中的边缘点,其附近灰度的变化情况可从它相邻像素灰度分布的梯度来反映。
根据这一特点,提出了多种边缘检测算子:
如Robert算子、Sobel算子、Prewitt算子、Laplacian算子,Canny算子等。
这些方法多是以待处理像素为中心的邻域作为进行灰度分析的基础,实现对图像边缘的提取并已经取得了较好的处理效果。
经典的边界提取技术大都基于微分运算。
首先通过平滑来滤除图像中的噪声,然后进行一阶微分或二阶微分运算,求得梯度最大值或二阶导数的过零点,最后选取适当的阈值来提取边界。
本文主要介绍几种经典的边缘提取算法,选取两种用MATLAB语言编程实现,对提取结果进行比较和分析。
图像边缘检测的基本步骤:
(1)滤波。
边缘检测主要基于导数计算,但受噪声影响。
但滤波器在降低噪声的同时也导致边缘强度的损失。
(2)增强。
增强算法将邻域中灰度有显著变化的点突出显示。
一般通过计算梯度幅值完成。
(3)检测。
但在有些图像中梯度幅值较大的并不是边缘点。
最简单的边缘检测是梯度幅值阈值判定。
(4)定位。
精确确定边缘的位置。
几种边缘算子的比较
以柚子的图片为例
1、Roberts算子是一种利用局部差分算子寻找边缘的算子,Roberts算子边缘定位准,但是对噪声敏感。
适用于边缘明显而且噪声较少的图像分割,在应用中经常用Roberts算子来提取道路。
程序如下:
I=imread('D:
\研一\阳建宏信号\作业\柚子.jpg');%读取图像
J=rgb2gray(I);%转化为灰度图像
K=imadjust(J,[40/2551]);%调整灰度值
BW=edge(K,'roberts');%边缘检测
figure
(1);imshow(BW);%显示图像
2、Sobel边缘算子:
图像中的每个像素都用这核做卷积。
这两个核分别对垂直边缘和水平边缘响应最大,两个卷积的最大值作为该点的输出位。
运算结果是一幅边缘幅度图像。
Sobel算子认为邻域的像素对当前像素产生的影响不是等价的,所以距离不同的像素具有不同的权值,对算子结果产生的影响也不同。
一般来说,距离越大,产生的影响越小。
程序如下:
I=imread('D:
\研一\阳建宏信号\作业\柚子.jpg');%读取图像
J=rgb2gray(I);%转化为灰度图像
K=imadjust(J,[40/2551]);%调整灰度值
BW=edge(K,'sobel');%边缘检测
figure
(1);imshow(BW);%显示图像
3、Prewitt算子在一个方向求微分,而在另一个方向求平均,因而对噪声相对不敏感,有抑制噪声作用。
但是像素平均相当于对图像的低通滤波,所以Prewitt算子对边缘的定位不如Roberts算子。
程序如下:
I=imread('D:
\研一\阳建宏信号\作业\柚子.jpg');%读取图像
J=rgb2gray(I);%转化为灰度图像
K=imadjust(J,[40/2551]);%调整灰度值
BW=edge(K,'prewitt');%边缘检测
figure
(2);imshow(BW);%显示图像
这是未经滤波的效果图。
4、Laplacian算子利用二阶导数信息,具有各向同性,即与坐标轴方向无关,坐标轴旋转后梯度结果不变。
使得图像经过二阶微分后,在边缘处产生一个陡峭的零交叉点,根据这个对零交叉点判断边缘。
Laplacian算子对噪声比较敏感,Laplacian算子有一个缺点是它对图像中的某些边缘产生双重响应。
所以图像一般先经过平滑处理,通常把Laplacian算子和平滑算子结合起来生成一个新的模板。
5、Log(LaplacianofGassian)算法:
将高斯滤波和拉普拉斯检测算子结合在一起进行边缘检测的方法。
也称之为拉普拉斯高斯算法。
该算法的主要思路和步骤是:
滤波(滤波函数根据人类视觉特性选为高斯函数)、增强(对平滑图像进行拉普拉斯运算)、检测(边缘检测判据是二阶导数的零交叉点并对应一阶导数的较大峰值)。
这种方法的特点是图像首先与高斯滤波器进行卷积,这样既平滑了图像又降低了噪声,孤立的噪声点和较小的结构组织将被滤除。
但是由于平滑会造成图像边缘的延伸,因此边缘检测器只考虑那些具有局部梯度最大值的点为边缘点。
高斯--拉普拉斯算子把高斯平滑滤波器和拉普拉斯锐化滤波器结合起来,先平化掉噪声,再进行边缘检测,所以效果更好。
程序如下:
I=imread('D:
\研一\阳建宏信号\作业\柚子.jpg');
J=rgb2gray(I);%转化为灰度图像
K=imadjust(J,[40/2551]);%调整灰度值
BW1=edge(K,'log',0.01);figure
(1);
subplot(3,2,1);imshow(BW1);
title('阈值为0.01的LOG算子边缘检测图像');
BW11=edge(K,'log',0.001);
subplot(3,2,5);imshow(BW11);
title('阈值为0.001的LOG算子边缘检测图像');
BW2=edge(K,'log',0.005);
subplot(3,2,4);imshow(BW2);
title('阈值为0.005的LOG算子边缘检测图像');
BW20=edge(K,'log',0.007);
subplot(3,2,3);imshow(BW20);
title('阈值为0.007的LOG算子边缘检测图像');
BW22=edge(K,'log',0.009);
subplot(3,2,2);imshow(BW22);
title('阈值为0.009的LOG算子边缘检测图像');
BW23=edge(K,'log',0.0001);
subplot(3,2,6);imshow(BW23);
title('阈值为0.0001的LOG算子边缘检测图像');
结果分析:
如图所示采用的阈值越小则图像的边缘处理效果越清晰,且边缘点条理显著。
但是当阈值超过0.0001时图像边缘的处理效果越模糊如图5.20所示,但是仍能进行边缘的判断!
6、Canny算子类似与Marr(LOG)边缘检测方法,也属于先平滑后求导数的方法。
采用二维高斯函数的任意方向上的一阶方向导数为噪声滤波器,通过与图像卷积进行滤波;然后对滤波后的图像寻找图像梯度的局部最大值,以此来确定图像边缘。
根据对信噪比与定位乘积进行测度,得到最优化逼近算子。
这就是Canny边缘检测算子。
用双阈值算法检测和连接边缘。
检测方法的优点:
①低误码率,很少把边缘点误认为非边缘点;②高定位精度,即精确地把边缘点定位在灰度变化最大的像素上;③抑制虚假边缘。
程序如下:
I=imread('D:
\研一\阳建宏信号\作业\柚子.jpg');
J=rgb2gray(I);%转化为灰度图像
K=imadjust(J,[40/2551]);%调整灰度值
BW1=edge(K,'canny',0.01);figure
(2);
subplot(3,2,1);imshow(BW1);
title('阈值为0.01的Canny算子边缘检测图像');
BW11=edge(K,'canny',0.009);
subplot(3,2,2);imshow(BW11);
title('阈值为0.009的Canny算子边缘检测图像');
BW2=edge(K,'canny',0.007);
subplot(3,2,3);imshow(BW2);
title('阈值为0.007的Canny算子边缘检测图像');
BW21=edge(K,'canny',0.005);
subplot(3,2,4);imshow(BW21);
title('阈值为0.005的Canny算子边缘检测图像');
BW22=edge(K,'canny',0.0001);
subplot(3,2,5);imshow(BW22);
title('阈值为0.0001的Canny算子边缘检测图像');
结果分析:
如图所示采用的阈值越小则图像的边缘处理效果越模糊不清,且边缘分界点无法判断,变得模糊不清。
且当阈值超过0.0002时图像边缘的边缘有效信息部分丢失,边缘点的判断模糊如图5.19所示,虽仍然能够识别它的边界线,但其清晰边界点已无法识别判断图像的边缘点准确性!
重新选择阈值,程序如下:
I=imread('D:
\研一\阳建宏信号\作业\柚子.jpg');
J=rgb2gray(I);%转化为灰度图像
K=imadjust(J,[40/2551]);%调整灰度值
BW1=edge(K,'canny',0.00);
subplot(3,2,1);imshow(BW1);
title('阈值为0.00的Canny算子边缘检测图像');
BW11=edge(K,'canny',0.05);
subplot(3,2,2);imshow(BW11);
title('阈值为0.05的Canny算子边缘检测图像');
BW2=edge(K,'canny',0.1);
subplot(3,2,3);imshow(BW2);
title('阈值为0.1的Canny算子边缘检测图像');
BW21=edge(K,'canny',0.2);
subplot(3,2,4);imshow(BW21);
title('阈值为0.2的Canny算子边缘检测图像');
BW22=edge(K,'canny',0.3);
subplot(3,2,5);imshow(BW22);
title('阈值为0.3的Canny算子边缘检测图像');
效果明显变好。
7、基于小波包的图像边缘检测
从信号分析的角度看,图像的边缘是图像信号的突变点,描述信号最有意义的特征点是信号的突变点,它包含了信号的大量信息。
边缘在图像中表现为灰度值的突变,表现为高频信号。
因此所以的边缘检测方法都是检测信号的高频分量,但是在实际图像中,由于噪声的存在,边缘检测成为一个难题。
小波包分解后得到的图像序列又近似部分和细节部分组成,近似部分是原图像对高频部分进行滤波所得的近似表示,经滤波后,近似部分去除了高频分量,因此能够检测到原图像中所检测不到的边缘。
I=imread('D:
\研一\阳建宏信号\作业\柚子.jpg');
%加入噪声
I2=imnoise(I,'gaussian',0,0.01);
subplot(221);imagesc=(I2);title('原始图像');axissquare;
[X,map]=rgb2ind(I2,0.1);%转化为灰度图像
X=double(X);
%用小波db10对图像X进行一层小波包分解
T=wpdec2(X,1,'db10');
%重构图像的近似部分
A=wprcoef(T,[10]);
subplot(222);imagesc=(A);title('图像的近似部分');axissquare;
%原图像的边缘检测
BW1=edge(X,'sobel');
subplot(223);imshow(BW1);title('原图像的边缘');axissquare;
%图像近似部分的边缘检测
BW2=edge(A,'sobel');
subplot(224);imshow(BW2);title('图像近似部分的边缘');axissquare;
8、基于膨胀与腐蚀的形态操作——骨架化和边缘检测
(1)骨架化:
某些应用中,针对一副图像,希望对图像中所有对象简化为线条,但不修改图像的基本结构,保留图像基本轮廓,这个过程就是所谓的骨架化。
提供了专门的函数bwmorph,可以实现骨架化操作。
BW1=imread('D:
\研一\阳建宏信号\作业\柚子.jpg');
J=rgb2gray(BW1);%转化为灰度图像
K=imadjust(J,[40/2551]);%调整灰度值
BW2=bwmorph(K,'skel',Inf);
imshow(K);title('转为灰度的图像');
figure,imshow(BW2);title('骨架图');
(2)边缘检测
对于一副灰度二进制图像,如果图像像素值为1,则该像素的状态为ON,如果其像素值为0,则该像素的状态为OFF。
在一副图像中,如果图像某个像素满足以下两个条件:
1.该像素状态为ON,
2.该像素邻域中有一个或多个像素状态为OFF。
则认为该像素为边缘像素。
Matlab中提供了专门的函数bwperim,可以用于判断一副二进制图像中的哪些像素为边缘像素。
以下程序代码示例就是利用bwperim函数,对图像进行边缘检测,其边缘像素检测效果如尾图。
BW1=imread('D:
\研一\阳建宏信号\作业\柚子.jpg');
J=rgb2gray(BW1);%转化为灰度图像
K=imadjust(J,[40/2551]);%调整灰度值
BW2=bwperim(K);
figure,imshow(BW2);title('边缘效果图');
对图片进行滤波后在提取边缘,各种方法对比如下图:
%对原始图像进行前期处理
I=imread('D:
\研一\阳建宏信号\作业\柚子.jpg');
I2=im2double(I);
Ihd=rgb2gray(I2);
[thr,sorh,keepapp]=ddencmp('den','wv',Ihd);
Ixc=wdencmp('gbl',Ihd,'sym4',2,thr,sorh,keepapp);
figure(3),imshow(Ixc),title('消噪后的图像');
k2=medfilt2(Ixc,[77]);
figure(4),imshow(k2),title('中值滤波');
Isuo=imresize(k2,0.25,'bicubic');
%Sobel、Roberts、Prewitt算子检测图像边缘
esobel=edge(Isuo,'sobel');
erob=edge(Isuo,'roberts');
eprew=edge(Isuo,'prewitt');
subplot(3,2,1);
imshow(Isuo);title('前期处理图像');
subplot(3,2,2);
imshow(esobel);title('sobel算子提取');
subplot(3,2,3);
imshow(erob);title('roberts算子提取');
subplot(3,2,4);
imshow(eprew);title('prewitt算子提取');
%调用Log算子、Canny算子检测图像边缘
elog=edge(Isuo,'log');
ecanny=edge(Isuo,'canny');
subplot(3,2,5);
imshow(elog);title('log算子提取');
subplot(3,2,6);
imshow(ecanny);title('canny算子提取');
边缘检测结果比较:
Roberts算子检测方法对具有陡峭的低噪声的图像处理效果较好,但是利用roberts算子提取边缘的结果是边缘比较粗,因此边缘的定位不是很准确。
Sobel算子检测方法对灰度渐变和噪声较多的图像处理效果较好,sobel算子对边缘的定位不是很准,图像的边缘不止一个像素。
Prewitt算子检测方法对灰度渐变和噪声较多的图像处理效果较好。
但边缘较宽,而且间断点多。
Log算子法对噪声比较敏感,所以很少用该算子检测边缘,而是用来判断边缘像素视为与图像的明区还是暗区。
Canny算子同前几个算子得到的测试结果对比可以看出,canny算子提取的边缘最为完整,而且边缘的连续性很好,优于以上其它算子。
这主要是因为它进行了非极大值抑制和形态学连接操作的结果。
用此方法不易受噪声干扰,能够检测到真正的弱边缘。
优点在于,使用两种不同的阈值分别检测强边缘和弱边缘,并且当弱边缘和强边缘相连时,才将弱边缘包含在输出图像中。
从对比图中看效果比较好。
形态学边缘检测算法检测出得边缘较为平滑,保留了更多的边缘细节。
但是本方法在保持良好的边缘的同时,抑制噪声的能力更强,代价是随着噪声强度的增加,边缘的光滑性会有所降低,像素亮度显著降低。
在所用时间上,传统算子高斯函数做卷积运算,计算量大,时间消耗也大,而形态学多尺度边缘检测只做普通的加减运算及求最大最小值运算,时间消耗少。