当前位置:文档之家› 数字图像处理实验报告--边缘检测

数字图像处理实验报告--边缘检测

数字图像处理实验报告实验名称:边缘检测姓名:班级:学号:09045433专业:电子信息工程(2+2)指导教师:陈华华实验日期:2012年5月17日边缘检测一,原理本实验主要是对图像的边缘进行提取,通过对边缘的分析来分析图像的特征。

首先,了解一些术语的定义:边缘点:图像中具有坐标[i,j]且处在强度显著变化的位置上的点。

边缘段:对应于边缘点坐标[i,j]及其方位 ,边缘的方位可能是梯度角。

边缘检测器:从图像中提取边缘(边缘点和边缘段)集合的算法。

轮廓:边缘列表,或者是一条表示边缘列表的拟合曲线。

边缘连接:从无序边缘表形成有序边缘表的过程,习惯上,边缘表的表示采用顺时针方向来排序。

边缘跟踪:一个用来确定轮廓的图像(指滤波后的图像)搜索过程。

边缘就是图像中包含的对象的边界所对应的位置。

物体的边缘以图像局部特性的不连续性的形式出现的,例如,灰度值的突变,颜色的突变,纹理结构的突变等。

从本质上说,边缘就意味着一个区域的终结和另外一个区域的开始。

图像边缘信息在图像分析和人的视觉中十分重要,是图像识别中提取图像特征的一个重要属性。

边缘检测(edge detection)在图像处理和对象识别领域中都是一个重要的基本问题。

由于边缘的灰度不连续性,可以使用求导数的方法检测到。

最早的边缘检测方法都是基于像素的数值导数的运算。

本实验主要是对图像依次进行Sobel算子,Prewitt算子,Roberts算子,Laplace算子和Canny算子运算,比较处理结果。

边缘检测有三个共性准则,1,好的检测结果,或者说对边缘的误测率尽可能低,就是在图像边缘出现的地方检测结果中不应该没有;另一方面不要出现虚假的边缘。

2,对边缘的定位要准确,也就是我们标记出的边缘位置要和图像上真正边缘的中心位置充分接近。

3,对同一边缘要有尽可能低的响应次数,也就是检测响应最好是单像素的。

二,对图像进行各种算子运算本实验中主要是对图像依次进行Sobel算子,Prewitt算子,Roberts算子,Laplace 算子和Canny算子运算。

Matlab代码:clear all;close all;warning off all;I=imread('cameraman.tif');%%没有噪声时的检测结果BW_sobel=edge(I,'sobel');BW_prewitt=edge(I,'prewitt');BW_roberts=edge(I,'roberts');BW_laplace=edge(I,'log');BW_canny=edge(I,'canny');figure(1);subplot(2,3,1),imshow(I),xlabel('原始图像');subplot(2,3,2),imshow(BW_sobel),xlabel('sobel检测');subplot(2,3,3),imshow(BW_prewitt),xlabel('prewitt检测');subplot(2,3,4),imshow(BW_roberts),xlabel('roberts检测');subplot(2,3,5),imshow(BW_laplace),xlabel('laplace检测');subplot(2,3,6),imshow(BW_canny),xlabel('canny检测');%%加入高斯噪声(μ=0,σ^2=0.01)检测结果I_g1=imnoise(I,'gaussian',0,0.01);BW_sobel=edge(I_g1,'sobel');BW_prewitt=edge(I_g1,'prewitt');BW_roberts=edge(I_g1,'roberts');BW_laplace=edge(I_g1,'log');BW_canny=edge(I_g1,'canny');figure(2);subplot(2,3,1),imshow(I_g1),xlabel('加入高斯噪声(μ=0,σ^2=0.01)图像'); subplot(2,3,2),imshow(BW_sobel),xlabel('sobel检测');subplot(2,3,3),imshow(BW_prewitt),xlabel('prewitt检测');subplot(2,3,4),imshow(BW_roberts),xlabel('roberts检测');subplot(2,3,5),imshow(BW_laplace),xlabel('laplace检测');subplot(2,3,6),imshow(BW_canny),xlabel('canny检测');%%加入高斯噪声(μ=0,σ^2=0.02)检测结果I_g2=imnoise(I,'gaussian',0,0.02);BW_sobel=edge(I_g2,'sobel');BW_prewitt=edge(I_g2,'prewitt');BW_roberts=edge(I_g2,'roberts');BW_laplace=edge(I_g2,'log');BW_canny=edge(I_g2,'canny');figure(3);subplot(2,3,1),imshow(I_g2),xlabel('加入高斯噪声(μ=0,σ^2=0.02)图像'); subplot(2,3,2),imshow(BW_sobel),xlabel('sobel检测');subplot(2,3,3),imshow(BW_prewitt),xlabel('prewitt检测');subplot(2,3,4),imshow(BW_roberts),xlabel('roberts检测');subplot(2,3,5),imshow(BW_laplace),xlabel('laplace检测');subplot(2,3,6),imshow(BW_canny),xlabel('canny检测');实验结果:原始图像sobel检测prewitt检测roberts检测laplace检测canny检测加入高斯噪声(μ=0,σ2=0.01)图像sobel检测prewitt检测roberts检测laplace检测canny检测加入高斯噪声(μ=0,σ2=0.02)图像sobel检测prewitt检测roberts检测laplace检测canny检测实验分析:通过对上述几种算子的研究,我们可以发现,Prewit t算子和Sobel算子都是对图像进行差分和滤波运算,仅在平滑部分的权值选择上有些差异,但是图像产生了一定的模糊,而且有些边缘还检测不出来,所以检测精度比较低,该类算子比较适用于图像边缘灰度值比较明显的情况。

Robert s算子检测精度比较高,但容易丢失一部分边缘,使检测的结果不完整,同时图像没经过平滑处理,不能抑制噪声,所以该算子对具有陡峭的低噪声图像响应最好。

Laplace算子通过高斯函数对图像进行了平滑处理,对噪声的抑制作用比较明显,但处理的同时也可能将原有的边缘平滑,造成某些边缘无法检测到。

此外,噪声对其影响也较大,检测到的图细节很丰富,同时就可能出现伪边缘。

但是,如果要降低伪边缘的话,又可能使检测精度下降,丢失很多真边缘。

因此,对于不同图像应选择不同参数。

Canny算子也采用高斯函数对图像进行平滑处理,也具有较强的去噪能力,但同样可能会丢失一些边缘信息,但是,从图中可以看出,Canny算子比Laplace算子的检测边缘的精度要高些。

通过实验结果可以看出,该算子在上述几种边缘检测算子当中效果最好。

通过上述实验结果我们可以发现,在加入高斯噪声以后,canny算子的去噪能力减弱,对边缘检测的效果不太明显。

相反,从图中可以发现sobel算子和prewitt算子对噪声的过滤作用较为明显。

基本上能够检测出较为完整的边缘信号。

自编代码:clc;close all%图读取显示c=imread('cameraman.tif');subplot(1,3,1);imshow(c)[M,N]=size(c);%得到一个M+2*N+2的矩阵,为模板卷积做准备cc=zeros(M+2,N+2);%初始化矩阵for i=1:Mfor j=1:Ncc(i+1,j+1)=c(i,j);endendcc(1,1)=c(1,1);%四个角的赋值cc(1,M+2)=c(1,M);cc(M+2,1)=c(M,1);cc(M+2,N+2)=c(M,N);for i=1:M%四边的赋值cc(i+1,1)=c(i,1);endfor i=1:Ncc(1,i+1)=c(1,i);endfor i=1:Ncc(M+2,i+1)=c(M,i);endfor i=1:Mcc(i+1,N+2)=c(i,N);endc1=zeros(M,N);%初始化一个新矩阵,用来存放水平模板卷积后的值c2=zeros(M,N);%初始化一个新矩阵,用来存放垂直模板卷积后的值c3=zeros(M,N);%初始化一个新矩阵,用来存放以2为范数(欧式距离)计算的值c4=zeros(M,N);%初始化一个新矩阵,用来存放以1为范数(城区距离)计算的值%差分模板d1=[-1,0,1;-1,0,1;-1,0,1];%水平模板d2=[1,1,1;0,0,0;-1,-1,-1];%垂直模板%水平方向for m=2:M+1for n=2:N+1c1(m-1,n-1)=(d1(1,1)*cc(m-1,n-1)+d1(1,2)*cc(m-1,n)+d1(1,3)*cc(m-1,n+1)...+d1(2,1)*cc(m,n-1)+d1(2,2)*cc(m,n)+d1(2,3)*cc(m,n+1)+...d1(3,1)*cc(m+1,n-1)+d1(3,2)*cc(m+1,n)+d1(3,3)*cc(m+1,n+1))/9;endend%垂直方向for m=2:M+1for n=2:N+1 c2(m-1,n-1)=(d2(1,1)*cc(m-1,n-1)+d2(1,2)*cc(m-1,n)+d2(1,3)*cc(m-1,n+1)+...d2(2,1)*cc(m,n-1)+d2(2,2)*cc(m,n)+d2(2,3)*cc(m,n+1)+d2(3,1)*cc(m+1,n-1)+d2(3,2)*cc(m+1,n) +d2(3,3)*cc(m+1,n+1))/9;endend%以2为范数(欧式距离)计算的值for i=1:Mfor j=1:Nc3(i,j)=abs(c1(i,j))+abs(c2(i,j));endend%结果显示subplot(1,3,2);imshow(uint8(c3));%由于之前已经转化为双精度,所以要用uint8显示。

相关主题