《图像边缘检测算法_代码程序_及其结果》由会员分享,可在线阅读,更多相关《图像边缘检测算法_代码程序_及其结果(10页珍藏版)》请在金锄头文库上搜索。
1、. . 图像边缘检测算法研究一、边缘检测:边缘是指图像局部亮度变化最显著的部分,边缘主要存在于目标与目标、目标与背景、区域与区域(包括不同色彩)之间,是图像分割、纹理特征提取和形状特征提取等图像分析的重要基础。边缘的检测正是利用物体和背景在某种图像特性上的差异来实现的。这些差异包括灰度、颜色或纹理特征。边缘检测实际上就是检测图像特性发生变化的位置。 二、图像的边缘大致可分为两种:阶跃状和屋顶状;阶跃状的边缘处于图像中两个不同灰度的相邻区域之间,屋顶状的边缘上升和下降都比较缓慢。 阶跃状边缘的位置在一阶导数的峰值点,在二阶导数的过零点;屋顶状边缘(有一定的宽度围)的位置在一阶导数的两峰值之间,在
2、二阶导数的两个过零点之间。 三、基于一阶导数法的边缘检测 3.1 梯度算子 求梯度的运算可近似为微分模板与图像的卷积。常用一阶边缘检测算子有简单梯度算子、Roberts 算子、priwitt 算子、sobel 算子。梯度算子包含着微分运算,对噪声比较敏感。以上各算子都只包含x,y 两个方向的模板,每种模板只对相应的方向敏感,而对其他方向的变化响应不大。 Roberts 算子 Roberts 算子是一种利用局部差分算子寻找边缘的算子 ,它由下式给出: + +- = 它是由两个2 2 模板作用的结果(标注的是当前像素的位置): (1)用卷积函数conv2 处理的Matlab 程序代码: a=imr
3、ead(lena,tif); b=0 1;-1 0/126;c=1 0;0 -1/126; %参数126 是实验时为增强图像对比度试验出来的 d=conv2(a,b,same);d=abs(d); %处理水平方向算子的结果,参数same使得得到的图像与原图大小相等。 e=conv2(a,c,same);e=abs(e); %处理垂直方向算子的结果 f=max(d,e); %取水平及垂直方向上的大值 subplot(1,3,1),imshow(d), title( roberts 水平) subplot(1,3,2),imshow(e), title( roberts 垂直)subplot(1,
4、3,3),imshow(f), title( roberts 综合) 由图可知,用单个方向的算子则对该方向比较敏感。 (2)用edge函数处理的Matlab程序代码: a = imread(tuxing,tif); %读取图像 a = imnoise(a, salt & pepper,0.005); %对图像加椒盐噪声 b = edge(a,roberts,0.02); %以阈值为0.02进行roberts边缘检测 c = edge(a,roberts,0.07); %阈值为0.07 d,e = edge(a,roberts); %该处可得阈值的默认值e subplot(2,2,1),imsh
5、ow(a),axis on; title(原图) subplot(2,2,2),imshow(b) ,axis on; title(roberts 阈值=0.02) subplot(2,2,3),imshow(c) ,axis on;title(roberts 阈值=0.07) subplot(2,2,4),imshow(d) ,axis on; title(默认) 运行结果: Prewitt算子 为了在边缘检测中减少噪声的影响,1970年Prewitt和Sobel分别提出Prewitt算子和Sobel算子。Prewitt算子加大了边缘检测算子的模板,扩大到3x3来计算差分算子。Prewitt
6、 边缘检测算子使用两个有向算子(一个水平的,一个是垂直的,一般称为模板),每一个逼近一个偏导数: 如果我们用 Prewitt 算子检测图像M 的边缘的话,我们可以先分别用水平算子和垂直算子对图像进行卷积,得到的是两个矩阵,在不考虑边界的情形下也是和原图像同样大小的 M1, M2,他们分别表示图像M 中相同位置处的两个偏导数。然后把M1,M2 对应位置的两个数平方后相加得到一个新的矩阵G,G 表示M 中各个像素的灰度的梯度值(一个逼近)。然后就可以通过阀值处理得到边缘图像。 (1)用卷积函数conv2 处理的Matlab 程序代码: a=imread(lena,tif); b=-1 -1 -1;
7、0 0 0;1 1 1/256;c=-1 0 1; -1 0 1; -1 0 1/256; %参数256 是实验时为增强图像对比度试验出来的 d=conv2(a,b,same);d=abs(d); %处理水平方向算子的结果 e=conv2(a,c,same);e=abs(e); %处理垂直方向算子的结果 f=max(d,e); %取水平及垂直方向上的大值 subplot(1,3,1),imshow(d), title( prewitt 水平) subplot(1,3,2),imshow(e), title( prewitt 垂直) subplot(1,3,3),imshow(f), title
8、( prewitt 综合) 由图可知,用单个方向的算子则对该方向比较敏感。 (2)用edge 函数处理的Matlab 程序代码: a = imread(tuxing,tif);%读取图像 a = imnoise(a, salt & pepper,0.005); b = edge(a,prewitt,0.02); c = edge(a,prewitt,0.07); d,e = edge(a,prewitt); %该处可得阈值的默认值e subplot(2,2,1),imshow(a),axis on; title(原图) subplot(2,2,2),imshow(b) ,axis on; ti
9、tle(prewitt 阈值=0.02) subplot(2,2,3),imshow(c) ,axis on;title(prewitt 阈值=0.07) subplot(2,2,4),imshow(d) ,axis on; title(默认) sobel 算子Sobel 算子和 Prewitt 算子的不同就在于使用的模板不一样: (1)用卷积函数conv2 处理的Matlab 程序代码: a=imread(lena,tif); b=-1 -2 -1;0 0 0;1 2 1/256;c=-1 0 1; -2 0 2; -1 0 1/256; %参数256 是实验时为增强图像对比度试验出来的 d
10、=conv2(a,b,same);d=abs(d); %处理水平方向算子的结果 e=conv2(a,c,same);e=abs(e); %处理垂直方向算子的结果 f=max(d,e); %取水平及垂直方向上的大值 subplot(1,3,1),imshow(d), title( sobel 水平) subplot(1,3,2),imshow(e), title( sobel 垂直) subplot(1,3,3),imshow(f), title( sobel 综合) 由图可知,用单个方向的算子则对该方向比较敏感。用sobel 算子得到的图像边缘较宽。 (2)用edge 函数处理的Matlab
11、程序代码: a = imread(tuxing,tif);%读取图像 a = imnoise(a, salt & pepper,0.005); b = edge(a,sobel,0.02);c = edge(a,sobel,0.07); d,e = edge(a,sobel); %该处可得阈值的默认值e subplot(2,2,1),imshow(a),axis on; title(原图) subplot(2,2,2),imshow(b) ,axis on; title(sobel 阈值=0.02) subplot(2,2,3),imshow(c) ,axis on;title(sobel 阈
12、值=0.07) subplot(2,2,4),imshow(d) ,axis on; title(默认阈值) 实验结果: 由Roberts算子、priwitt算子、sobel算子处理的图像结果可以看出,三者处理效果差不多。由于梯度算子包含着微分运算,因此对图像的噪声有一定的放大作用。阈值的大小决定了像素点赋值为1的点的多少。阈值越大,留下的1点越少。 3.2 canny算子 Canny算子具体实现的步骤是:、用高斯滤波器平滑图像;、用一阶偏导的有限差分来计算梯度的幅值和方向;、对梯度幅值进行非极大值抑制;、用双阈值算法检测和连接边缘。(双阈值检测原理:两个阈值可得两个边缘图像,首先由大阈值把边
13、缘连接成轮廓,当到达轮廓的端点时,就从小阈值图像中寻找可以连接到轮廓上的边缘。) Matlab程序代码: a = imread(tuxing,tif);%读取图像 a = imnoise(a, salt & pepper,0.005); b = edge(a,canny,0.03,0.06);% edge(I,canny,thresh,sigma),sigma默认为1 c = edge(a,canny,0.05,0.1); % =3 d = edge(a,canny,0.05,0.1,2); subplot(2,2,1),imshow(a); subplot(2,2,2),imshow(b);
14、title(canny 双阈值=0.03,0.06 =1) subplot(2,2,3),imshow(c);title(canny 双阈值=0.05,0.1 =1) subplot(2,2,4),imshow(d);title(canny 双阈值=0.05,0.1 =2) 实验结果:Canny算子由于进行了高斯滤波,因此可以滤除噪声。而且Canny算子是双阈值检测,所以图像连续性较好。高斯滤波器标准差的大小决定了滤除噪声的能力;阈值的大小决定了像素点赋值为1的点的多少。 3.3方向算子 Roberts算子、priwitt算子、sobel算子都只包含两个方向的模板,每种模板只对相应的方向敏感,
15、对该方向上的变化有明显的输出,而对其他方向的变化响应不大。为了检测各个方向的边缘,需要有各个方向的微分模板。8个方向的kirsch模板较为常用,这8个方向依次成45夹角,其3*3的模板为-5 3 3;-5 0 3;-5 3 3, 3 3 3;-5 0 3;-5 -5 3, 3 3 3;3 0 3;-5 -5 -5, 3 3 3;3 0 -5; 3 -5 -5, 3 3 -5;3 0 -5;3 3 -5, 3 -5 -5;3 0 -5;3 3 3, -5 -5 -5;3 0 3;3 3 3, -5 -5 3;-5 0 3;3 3 3 用卷积函数conv2处理的Matlab程序代码: a=imread(lena,tif); b=-5 3 3;-5 0 3;-5 3 3/1