图像边缘检测算法_代码程序_及其结果
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图像边缘检测算法研究
一、边缘检测:边缘是指图像局部亮度变化最显著的部分,边缘主要存在于目标与目标、目标与背景、区域与区域(包括不同色彩)之间,是图像分割、纹理特征提取和形状特征提取等图像分析的重要基础。边缘的检测正是利用物体和背景在某种图像特性上的差异来实现的。这些差异包括灰度、颜色或纹理特征。边缘检测实际上就是检测图像特性发生变化的位置。
二、图像的边缘大致可分为两种:阶跃状和屋顶状;阶跃状的边缘处于图像中两个不同灰度的相邻区域之间,屋顶状的边缘上升和下降都比较缓慢。
阶跃状边缘的位置在一阶导数的峰值点,在二阶导数的过零点;屋顶状边缘(有一定的宽度范围)的位置在一阶导数的两峰值之间,在二阶导数的两个过零点之间。
三、基于一阶导数法的边缘检测
梯度算子
求梯度的运算可近似为微分模板与图像的卷积。常用一阶边缘检测算子有简单梯度算子、
Roberts 算子、priwitt 算子、sobel 算子。梯度算子包含着微分运算,对噪声比较敏感。以上各算子都只包含x,y 两个方向的模板,每种模板只对相应的方向敏感,而对其他方向的变化响应不大。
①Roberts 算子
Roberts 算子是一种利用局部差分算子寻找边缘的算子 ,它由下式给出:
它是由两个2 ×2 模板作用的结果(标注•的是当前像素的位置):
(1)用卷积函数conv2 处理的Matlab 程序代码:
a=imread('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,3,3),imshow(f), title(' roberts 综合')
由图可知,用单个方向的算子则对该方向比较敏感。
(2)用edge函数处理的Matlab程序代码:
a = imread('tuxing','tif'); %读取图像
a = imnoise(a, 'salt & pepper',; %对图像加椒盐噪声
b = edge(a,'roberts',; %以阈值为进行roberts边缘检测
c = edge(a,'roberts',; %阈值为
[d,e] = edge(a,'roberts'); %该处可得阈值的默认值e
subplot(2,2,1),imshow(a),axis on; title('原图')
subplot(2,2,2),imshow(b) ,axis on; title('roberts 阈值=') subplot(2,2,3),imshow(c) ,axis on;title('roberts 阈值=') subplot(2,2,4),imshow(d) ,axis on; title('默认')
运行结果:
②Prewitt算子
为了在边缘检测中减少噪声的影响,1970年Prewitt和Sobel分别提出Prewitt算子和Sobel 算子。Prewitt算子加大了边缘检测算子的模板,扩大到3x3来计算差分算子。Prewitt 边缘检测算子使用两个有向算子(一个水平的,一个是垂直的,一般称为模板),每一个逼近一个偏导数:
如果我们用 Prewitt 算子检测图像M 的边缘的话,我们可以先分别用水平算子和垂直算子对图像进行卷积,得到的是两个矩阵,在不考虑边界的情形下也是和原图像同样大小的
M1, M2,他们分别表示图像M 中相同位置处的两个偏导数。然后把M1,M2 对应位置的两个数平方后相加得到一个新的矩阵G,G 表示M 中各个像素的灰度的梯度值(一个逼近)。然后就可以通过阀值处理得到边缘图像。
(1)用卷积函数conv2 处理的Matlab 程序代码:
a=imread('lena','tif');
b=[-1 -1 -1;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(' prewitt 综合')
由图可知,用单个方向的算子则对该方向比较敏感。
(2)用edge 函数处理的Matlab 程序代码:
a = imread('tuxing','tif');%读取图像
a = imnoise(a, 'salt & pepper',;
b = edge(a,'prewitt',;
c = edge(a,'prewitt',;
[d,e] = edge(a,'prewitt'); %该处可得阈值的默认值e
subplot(2,2,1),imshow(a),axis on; title('原图')
subplot(2,2,2),imshow(b) ,axis on; title('prewitt 阈值=')
subplot(2,2,3),imshow(c) ,axis on;title('prewitt 阈值=')
subplot(2,2,4),imshow(d) ,axis on; title('默认')