《图像边缘检测各种算子matlab实现以及实际应用.doc》由会员分享,可在线阅读,更多相关《图像边缘检测各种算子matlab实现以及实际应用.doc(32页珍藏版)》请在金锄头文库上搜索。
1、图像处理中的数学方法实验报告学生姓名:赵芳舟教师姓名:曾理学院:数学与统计学院专业:信息与计算科学学号:联系方式:梯度和拉普拉斯算子在图像边缘检测中的应用1、 数学方法边缘检测最通用的方法是检测灰度值的不连续性,这种不连续性用一阶和二阶导数来检测。1. (1)一阶导数:一阶导数即为梯度,对于平面上的图像来说,我们只需用到二维函数的梯度,即: f=gxgy=fxfy,该向量的幅值:f=magf=gx2+gy21/2=f/x2+f/y21/2,为简化计算,省略上式平方根,得到近似值fgx2+gy2;或通过取绝对值来近似,得到:fgx+gy。(2)二阶导数:二阶导数通常用拉普拉斯算子来计算,由二阶微
2、分构成:2fx,y=2f(x,y)x2+2f(x,y)y22. 边缘检测的基本思想:(1) 寻找灰度的一阶导数的幅度大于某个指定阈值的位置;(2) 寻找灰度的二阶导数有零交叉的位置。3. 几种方法简介(1) Sobel边缘检测器:以差分来代替一阶导数。Sobel边缘检测器使用一个33邻域的行和列之间的离散差来计算梯度,其中,每行或每列的中心像素用2来加权,以提供平滑效果。f=gx2+gy21/2=z7+2z8+z9-(z1+2z2+z3)2+z3+2z6+z9-z1+2z4+z721/2-1-21000121 -101-202-101 (2) Prewitt边缘检测器:使用下图所示模板来数字化
3、地近似一阶导数。与Sobel检测器相比,计算上简单一些,但产生的结果中噪声可能会稍微大一些。gx=z7+z8+z9-z1+z2+z3gy=z3+z6+z9-z1-z4-z7-1-1-1000111-101-101-101(3) Roberts边缘检测器:使用下图所示模板来数字化地将一阶导数近似为相邻像素之间的差,它与前述检测器相比功能有限(非对称,且不能检测多种45倍数的边缘)。gx=z9-z5gy=z8-z6-10010-110(4) Laplace边缘检测器:二维函数f(x,y)的拉普拉斯是一个二阶的微分定义:2fx,y=2f(x,y)x2+2f(x,y)y2模板算子可分为四邻域和八邻域,
4、如下:0101-41010(四邻域)1111-81111(八邻域)(5) LoG边缘检测器由于噪声点(灰度与周围点相差很大的像素点)对边缘检测有一定的影响,所以效果更好的是LoG算子,即Laplacian-Guass算子。引入高斯函数来平滑噪声:该函数的Laplace算子:它把Guass平滑滤波器和Laplace锐化滤波器结合起来,先平滑掉噪声,再进行边缘检测,所以效果比单用Laplace算子要更为平滑,效果更好。(6) Canny边缘检测器主要分为以下几个步骤:使用具有指定标准差的一个高斯滤波器来平滑图像,以减少噪声;在每个点处计算局部梯度和边缘方向;对步骤中确定的边缘点产生梯度中的脊线顶部
5、进行追踪,并将实际山不在脊线顶部的像素设置为零,从而在输出中给出一条细线(非最大值抑制),然后使用滞后阈值处理法对这些脊线像素进行阈值处理。最后进行边缘连接。2、 实验结果原始图像:1.Roberts算子2.Prewitt算子3.Sobel算子4.Laplace算子(4邻域)(8邻域)5. LoG四种结果的比较:(Laplace采用8邻域模板)图像来源:http:/ 格式:SVG 模式:RGB硬件条件:软件条件:运行环境:Matlab r2015b三、讨论1. 各方法优缺点及比较:(1) Roberts算子:Roberts算子是22算子,对具有陡峭的低噪声图像响应最好,并且检测垂直边缘的效果好
6、于斜向边缘,定位精度高。然而,它对噪声敏感,无法抑制噪声的影响。因此,它适用于边缘明显且噪声较少的图像分割。(2) Prewitt算子:Prewitt算子将两个点的各自一定领域内的灰度值求和,并根据两个灰度值和的差来计算x,y的偏导数。它是平均滤波,对噪声有抑制作用,对于灰度渐变的低噪声图像有较好的检测效果,但是像素平均相当于对图像的低通滤波,所以它对边缘的定位不如Roberts算子。对于混合多复杂噪声的图像,效果不太理想。(3) Sobel算子:Sobel算子是滤波算子的形式,用于提取边缘,可以利用快速卷积函数, 简单有效,因此应用广泛。美中不足的是,Sobel算子并没有将图像的主体与背景严
7、格地区分开来,即Sobel算子没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意。(4) Laplace算子:Laplace算子是一种各向同性算子,在只关心边缘的位置而不考虑其周围的象素灰度差值时比较合适。Laplace算子对孤立象素的响应要比对边缘或线的响应要更强烈,因此只适用于无噪声图象。存在噪声情况下,使用Laplacian算子检测边缘之前需要先进行低通滤波。(5) LoG算子:由于二阶导数是线性运算,利用LoG卷积一幅图像与首先使用高斯型平滑函数卷积改图像,然后计算所得结果的拉普拉斯是一样的。所以在LoG公式中使用高斯函数的目的就是对图像进行平滑处理,使用Laplac
8、ian算子的目的是提供一幅用零交叉确定边缘位置的图像;图像的平滑处理减少了噪声的影响并且它的主要作用还是抵消由Laplacian算子的二阶导数引起的逐渐增加的噪声影响。(6) Canny算子:是一个具有滤波,增强和检测的多阶段的优化算子,在进行处理前,Canny算子先利用高斯平滑滤波器来平滑图像以消除噪声,Canny分割算法采用一阶偏导的有限差分来计算梯度的幅值和方向。在处理过程中,Canny算法还将经过一个非极大值抑制的过程。最后Canny算法将采用两个阈值来连接边缘。高定位精度、低误判率、抑制虚假边缘,适用于高噪声图像。四、实际应用1、概述:图像边缘检测广泛应用于车牌识别,人脸识别,地震带
9、检测,生物医疗以及产品外观检测等方面。为了体现其实际应用,在此针对车牌识别来进行实验,实验流程如下:确定区域文字分割模板配对均值滤波边缘检测二值化灰度处理3、 实验结果原图像:灰度处理:将彩色图像转化为灰度图像,缩小图片占用的空间,减少处理时间边缘检测:车牌区域的边缘信息一般比其他部分丰富且集中,只要 背景不太复杂,没有过多干扰,边缘特征可将车牌区域与其他部分区别开来,从而消除图像中的无关信息。腐蚀和膨胀:腐蚀可以分割独立的图像元素,膨胀用于连接相邻的元素,更加利于图像的分割最后将车牌号分割成七个单个字符,建立模板库,与其进行配对,最终得出结果。五、程序介绍(1) Roberts边缘检测 cl
10、ear;sourcePic=imread(C:Users34899Desktoptimg.jpg); %读取原图像grayPic=mat2gray(sourcePic); %实现图像矩阵的归一化操作m,n=size(grayPic);newGrayPic=grayPic;%为保留图像的边缘一个像素robertsNum=0; %经roberts算子计算得到的每个像素的值robertThreshold=0.2; %设定阈值for j=1:m-1 %进行边界提取 for k=1:n-1 robertsNum = abs(grayPic(j,k)-grayPic(j+1,k+1) + abs(gray
11、Pic(j+1,k)-grayPic(j,k+1); if(robertsNum robertThreshold) newGrayPic(j,k)=255; else newGrayPic(j,k)=0; end endendsubplot(1,2,1);imshow(sourcePic);title(原图); subplot(1,2,2);imshow(newGrayPic);title(Robert算子处理后图像); (2) Prewitt边缘检测 clear;sourcePic=imread(C:Users34899Desktoptimg.jpg); %读取原图像grayPic=mat2
12、gray(sourcePic);%实现图像矩阵的归一化操作m,n=size(grayPic);newGrayPic=grayPic;%为保留图像的边缘一个像素PrewittNum=0;%经Prewitt算子计算得到的每个像素的值PrewittThreshold=0.5;%设定阈值for j=2:m-1 %进行边界提取for k=2:n-1 PrewittNum=abs(grayPic(j-1,k+1)-grayPic(j+1,k+1)+grayPic(j-1,k)-grayPic(j+1,k)+grayPic(j-1,k-1)-grayPic(j+1,k-1)+abs(grayPic(j-1,
13、k+1)+grayPic(j,k+1)+grayPic(j+1,k+1)-grayPic(j-1,k-1)-grayPic(j,k-1)-grayPic(j+1,k-1); if(PrewittNum PrewittThreshold) newGrayPic(j,k)=255; else newGrayPic(j,k)=0; end endendsubplot(1,2,1);imshow(sourcePic);title(原图); subplot(1,2,2);imshow(newGrayPic);title(Prewitt算子处理后图像); (3) Sobel边缘检测 clear all; close all; imag = imread(C:Users34899Desktoptimg.jpg); %读取关键帧 imag = rgb2gray(imag); %转化为灰度图 subplot(1,2,1);imshow(imag);title(原图); high,width = si