毕业设计(论文)-数字图像边缘检测算法设计与实现.doc_第1页
毕业设计(论文)-数字图像边缘检测算法设计与实现.doc_第2页
毕业设计(论文)-数字图像边缘检测算法设计与实现.doc_第3页
毕业设计(论文)-数字图像边缘检测算法设计与实现.doc_第4页
毕业设计(论文)-数字图像边缘检测算法设计与实现.doc_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

安徽三联学院毕业论文本科毕业论文(设计、创作)题 目: 数字图像边缘检测算法设计与实现 学生姓名: 学号: 0231002045 所在院系: 信息与通信技术系 专业: 电子信息工程 入学时间: 2010 年 9 月 导师姓名: 职称/学位: 讲师/博士 导师所在单位: 完成时间: 2014 年 5 月安徽三联学院教务处 制II安徽三联学院毕业论文 数字图像边缘检测算法设计与实现摘 要:图像有很多最基本的特征,边缘是其中之一,所以图像处理的主要内容中也有图像的边缘检测,图像的边缘检测也是图像测量技术中的热点。本篇论文是来研究图像边缘检测,图像处理技术已经有很广阔的应用域,图像的边缘检测最主要的意思是将图像的边缘提取出来。本文首先简要的介绍了什么是边缘检测,和边缘检测的一些基本知识和原理,然后回顾了一些经典的边缘检测算法。最后在已有的经典算法基础上进行编程仿真来提取图像的边缘。关键词:图像处理;边缘检测;Hough变换;轮廓跟踪Design and implementation the algorithm of digital image edge detectionAbstract:Images have a lot of the most basic features, edge is one of them. So the image edge detection is one of the main content for image processing, the image edge detection has been the hot point in image measurement technology. This paper is to study the image edge detection. Image processing technology has very broad application field. The main mean of image edge detection is to detect image edge. In this article, first, briefly introduced what is edge detection, and some basic knowledge and principle of edge detection. Then reviews some of the classical edge detection algorithm. Finally, extracting image edge programming simulation on the basis of the existing classic algorithms.Key words: Image Processing, Edge Detection, Hough manipulation, contour tracing1安徽三联学院毕业论文设计 目 录第一章 绪论11.1 课程设计选题的背景及意义11.2 图像边缘检测的发展现状1第二章 边缘检测有关知识点22.1 边缘检测算法的分类22.2 边缘检测基本步骤22.3 边缘检测算法评价标准3第三章 一些经典的边缘检测算子的原理介绍53.1 Roberts边缘检测算子53.2 Prewitt算子53.3 Kirsch算子6第四章 图像边缘检测相关程算法和程序74.1 Hough变换74.2轮廓提取94.4轮廓跟踪14第五章 程序调式仿真185.1 MATLAB简介18结论19致谢20参考文献21第一章 绪论我们日常生活和工作中获取和交换信息的来源主要是图像,所以图像处理技术涉及到我们生活的方方面面。数字图像处理技术的发展涉及计算机科学、数学、信息技术等科学,也因此与边缘相关的学科对图像处理技术的发展有着很大的影响。随着多年的发展,图像处理技术被运用到很多高科技领域1.1 课程设计选题的背景及意义 所谓边缘,是指图像中灰度发生急剧变化的区域,或者说是指周围像素灰度有阶跃变化或屋顶变化的那些像素的集合1在对图像处理研究中,图像、图形的处理,包括数字图像的处理、储存等是主要的工作。多媒体技术、计算机视觉和计算机模式识别已经逐渐地应用在日常生活中2。一个区域的终结和另一个区域的开始就是边缘,边缘普遍存在于目标与背景、目标与目标、区域与区域、基元与基元之间,图像分割所依赖的重要特征就是边缘,纹理特征的重要信息源和形状特征的基础是边缘。有了图像边缘,物体的几何尺寸可以确定基于有了边缘,并进一步对其测量,物体在空间中的几何位置可以确定,物体的形状特征被确定并对物体进行识别。图像的边缘信息在图像分析和计算机视觉中图像的边缘信息很重要,图像识别中提取图像特征的一个重要属性是边缘。即使它在数字图像处理中有很重要的作用。1.2 图像边缘检测的发展现状 图像的边缘检测有着很长的研究历史,学术思想非常活跃,不断涌现新理论、新方法,一直是国内外图像处理领域研究的热点一直是图像的边缘检测,现今许多方法和理论己经被提出。目前为止提出的关于边缘检测的方法和理论依然存在不足的地方,在某些具体情况下依然无法很好的检测出目标物体的边缘在某些具体情况下。所以,根据具体的应用要求设计新的边缘检测方法根据具体的应用,或者对现有的方法进行改进以达到满意的结果,研究的主流方向依然是这些依然是。第二章 边缘检测有关知识点2.1 边缘检测算法的分类随着图像处理技术的发展和多种学科在数字图像处理领域的融合交叉,多种多样的边缘检测算法不断出现。目前,边缘检测方法含有算子法、曲面拟合法、模板匹配法等3,分方法为主的是经典边缘检测算法,又可分为一阶微分算法和二阶微分算法。新边缘检测算法有很多种,包含多种学科,有良好的发展形势。如分类图2-1所示:Roberts算法Sobel算法Prewitt算法一阶算法Canny算法经典算法边缘检测算法Laplace算法LOG算法二阶算法数学形态法小波变换法新算法神经网络法模糊检测法图2-1 边缘检测算法分类2.2 边缘检测基本步骤通常边缘检测主要包括以下四个步骤4 (如图2-2所示):(1) 图像滤波同属图像中强度变化剧烈的部位是边缘和噪声,所以边缘检测算子对边缘和噪声都很敏感,为了改善与噪声有关的边缘检测算子的性能所以必须使用滤波器。而边缘检测算法主要是基于图像灰度的一阶和二阶导数,导数的计算对噪声很敏感,而边缘检测算法主要是基于图像灰度的一阶和二阶导数,为了改善与噪声有关的边缘检测器的性能须用滤波器。(2) 图形增强确定图像各点邻域强度的变化值是增强边缘的基础。可以将邻域强度值有显著变化的点突出显示的算法是增强算法。(3) 图像检测图像中有许多梯度幅值比较大的点,然而这些点并不都是边缘在一些特定的应用领域中,哪些是边缘点应用某些方法来确定。梯度幅值阈值判据是最简单的边缘检测判据。(4) 图像定位确定边缘点的具体位置就是边缘定位,边缘细化、连接也应该包括。如果边缘位置在某一应用场合要求确定,则边缘的位置可利用子像素分辨率来估计,也可以估计出边缘的方位。图2-2 边缘检测的流程2.3 边缘检测算法评价标准边缘检测算法的评价标准的研究,需追溯到其发展的思想源头和理论基础。一般情况下,图像中的边缘点可认为是信号中的奇异点和突变点,它相邻像素灰度分布的梯度反映了其附近灰度的变化情况。基于以上我们提出了多种边缘检测算子:如Robert算子、Prewitt算子等。这些方法多灰度分析的基础是待处理像素为中心的邻域,对图像边缘的提取得以实现并已经取得了较好的处理效果。边缘像素宽、噪声干扰较严重等缺点也同时存在于这些方法中,即使采用一些辅助的方法去噪,边缘模糊等难以克服的缺陷也会相应带来。本质上讲,计算局部的微分算子是各种边缘检测技术的基本思想。一般图像的边缘检测识别过程中有如下的要求:(1)有效的边缘能够正确的检测出;(2)要有高精度的边缘定位;(3)检测的响应最好是单像素的检测响应;(4)对于不同尺度的边缘都能有较好的响应且能尽量减少漏检;(5)对噪声尽量不敏感;边缘检测器的响应可简略的总结为以下三种误差:(1)丢失的有效边缘;(2)边缘定位误差(3)将噪声误判断为边缘。第三章 一些经典的边缘检测算子的原理介绍3.1 Roberts边缘检测算子利用局部差分算子寻找边缘的算子就是Roberts算子,Roberts算子在2*2邻域上计算对角导数: (3.1)又称为Roberts交叉算子。近似简化运算: (3.2)用卷积模板,上式变为: (3.3)其中和由图3.2的模板计算:01-10100-1 (a)对角导数 (b)对角导数图3.1 Roberts边缘检测算子将在内插点处计算差分值。该点连续梯度的近似值就是Roberts算子,不是预期点处的近似值。经过用面两个卷积算子对图像运算后,代入,可求得图像的梯度幅度值,再选取适当的门限TH,作如下判断:,为阶跃状边缘点为一个二值图像,就得到了图像的边缘.。3.2 Prewitt算子Prewitt由22扩大到33来计算差分算子,此算子不仅能检测边缘点,这些算子样板是由理想的边缘图像构成的,检测图像则是次用边缘样板,最大值则是由与被检测区域最为相似的样板给出。算子的输出值就是用这个的最大值,则边缘像素就可被检测出来。Prewitt边缘检测算子模板的定义如下:上面8个算子样板分别对应8个等方向的边缘方向。然后适当选取门限TH,作此判断:若P(i,j)TH,那么(i,j)为阶跃状边缘点。就得到P(i,j)为边缘图像。(4)拉普拉斯算子(Laplace)拉普拉斯定义为:(3.4)拉普拉斯也是采用模板计算,有一种经常用的5 5的模板5 3.3 Kirsch算子Kirsch是方向算子。它是用八个卷积核的边缘检测算子,一共有八个33卷积核6。各方向上的边缘均可检测,选择其中的最大值输出, 计算量增加了,并且减少因为平均而造成的细节丢失。局部边缘的突出基于边缘增强算子,通过设置门限的方法提取边缘点集,像素中的“边缘强度”就被定义了这是边缘检测的基本原理。我们要寻找一些各项同性的检测算子这是因为边缘、轮廓在一幅图像中经常具有任意的方向,们对任意方向的边缘、轮廓都有一样的检测能力7。第四章 图像边缘检测相关程算法和程序4.1 Hough变换Hough变换用来在图像中查找直线。它的原理很简单:假设有一条与原点距离为s,方向角为的一条直线,下图所示。直线上的每一点都满足方程 (4.1)利用这个事实,我们可以找出某条直线来。举一个例子,用一段程序找出图像中最长的直线(红色直线),我们可将直线颜色加粗。原图变换的结果找到的最长直线确实是它。下面给出BOOL Hough程序:BOOL Hough(HWND hWnd)/定义一个自己的直线结构 typedef struct int topx; /最高点的x坐标 int topy; /最高点的y坐标 int botx; /最低点的x坐标 int boty; /最低点的y坐标 MYLINE; DWORD OffBits,BufSize; LPBITMAPINFOHEADER lpImgData; LPSTR lpPtr; HDC hDc;LONG x,y; long i,maxd; int k; int Dist,Alpha;HGLOBAL hDistAlpha,hMyLine; Int *lpDistAlpha; MYLINE *lpMyLine,*TempLine,MaxdLine; static LOGPEN rlp=PS_SOLID,1,1,RGB(255,0,0); HPEN rhp;if( NumColors!=256) MessageBox(hWnd,Must be a mono bitmap with grayscale palette!,Error Message,MB_OK|MB_ICONEXCLAMATION);return FALSE;/计算最大距离 Dist=(int)(sqrt(double)bi.biWidth*bi.biWidth+(double)bi.biHeight*bi.biHeight)+0.5); Alpha=180 /2 ; /0 到 to 178 度,步长为2度 /为距离角度数组分配内存if(hDistAlpha=GlobalAlloc(GHND,(DWORD)Dist*Alpha*sizeof(int)=NULL)MessageBox(hWnd,Error alloc memory!,Error Message,MB_OK|MB_ICONEXCLAMATION);return FALSE; if(hMyLine=GlobalAlloc(GHND,(DWORD)Dist*Alpha*sizeof(MYLINE)=NULL) GlobalFree(hDistAlpha); return FALSE; OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);/BufSize为缓冲区大小 BufSize=OffBits+bi.biHeight*LineBytes; lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData); lpDistAlpha=(int *)GlobalLock(hDistAlpha); lpMyLine=(MYLINE *)GlobalLock(hMyLine);for (i=0;i(long)Dist*Alpha;i+) TempLine=(MYLINE*)(lpMyLine+i); (*TempLine).boty=32767; for (y=0;ybi.biHeight;y+) /lpPtr指向位图数据 lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes); for (x=0;xbi.biWidth;x+) if(*(lpPtr+)=0) /是个黑点 for (k=0;k (*TempLine).topy) /记录该直线最高点的x,y坐标 (*TempLine).topx=x; (*TempLine).topy=y; if(y (*TempLine).boty) /记录该直线最低点的x,y坐标 (*TempLine).botx=x; (*TempLine).boty=y; maxd=0; for (i=0;i maxd) maxd=k; MaxdLine.topx=(*TempLine).topx; MaxdLine.topy=(*TempLine).topy; MaxdLine.botx=(*TempLine).botx; MaxdLine.boty=(*TempLine).boty; hDc = GetDC(hWnd); rhp = CreatePenIndirect(&rlp); SelectObject(hDc,rhp); MoveToEx(hDc,MaxdLine.botx,MaxdLine.boty,NULL); LineTo(hDc,MaxdLine.topx,MaxdLine.topy); DeleteObject(rhp); ReleaseDC(hWnd,hDc); /释放内存及资源 GlobalUnlock(hImgData);GlobalUnlock(hDistAlpha); GlobalFree(hDistAlpha); GlobalUnlock(hMyLine); GlobalFree(hMyLine); return TRUE;若 已知,可找到在该方向上最长的直线,通过以上程序。4.2轮廓提取轮廓提取的实例如图所示。原图轮廓提取掏空内部点就可对轮廓进行提取:原图中若有一点是黑的,与它相邻的8个点也是黑色,那么就把那个点删掉。源程序如下:BOOL Outline(HWND hWnd) DWORD OffBits,BufSize; LPBITMAPINFOHEADER lpImgData; LPSTR lpPtr;HLOCAL hTempImgData; LPBITMAPINFOHEADER lpTempImgData; LPSTR lpTempPtr; HDC hDc; HFILE hf; LONG x,y; int num; int nw,n,ne,w,e,sw,s,se;if( NumColors!=256) MessageBox(hWnd,Must be a mono bitmap with grayscale palette!,Error Message,MB_OK|MB_ICONEXCLAMATION);return FALSE;OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);/BufSize为缓冲区大小 BufSize=OffBits+bi.biHeight*LineBytes; if(hTempImgData=LocalAlloc(LHND,BufSize)=NULL) MessageBox(hWnd,Error alloc memory!,Error Message,MB_OK|MB_ICONEXCLAMATION);return FALSE; lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData); lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);/拷贝头信息和位图数据 memcpy(lpTempImgData,lpImgData,BufSize); for (y=1;ybi.biHeight-1;y+) /注意y的范围是从1到高度-2 lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes); lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y*LineBytes); for (x=1;x=SeedFillStack.ElementsNum) return FALSE; /栈已满,返回FALSE TempPtr=(POINT *)(SeedFillStack.lpMyStack+SeedFillStack.ptr+); (*TempPtr).x=p.x; (*TempPtr).y=p.y; return TRUE;/pop操作POINT MyPop() POINT InvalidP; InvalidP.x=-1; InvalidP.y=-1; if(SeedFillStack.ptr0) /注意判断边界 NeighborP.x=CurP.x-1; NeighborP.y=CurP.y; lpTempPtr1=lpTempPtr-1; if(*lpTempPtr1!=0) /上邻点 if(CurP.y0) /注意判断边界 NeighborP.x=CurP.x; NeighborP.y=CurP.y-1; lpTempPtr1=lpTempPtr+LineBytes; if(*lpTempPtr1!=0) MyPush(NeighborP); /右邻点 if(CurP.xbi.biWidth-1) /注意判断边界 NeighborP.x=CurP.x+1; NeighborP.y=CurP.y; lpTempPtr1=lpTempPtr+1; if(*lpTempPtr1!=0) MyPush(NeighborP); /下邻点 if(CurP.ybi.biHeight-1) /注意判断边界 NeighborP.x=CurP.x; NeighborP.y=CurP.y+1; lpTempPtr1=lpTempPtr-LineBytes; if(*lpTempPtr1!=0) MyPush(NeighborP); /析构堆栈,释放内存 DeInitStack();if(hBitmap!=NULL) DeleteObject(hBitmap); hDc=GetDC(hWnd); /创建新的位图 hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpTempImgData,(LONG)CBM_INIT,(LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD),(LPBITMAPINFO)lpTempImgData,DIB_RGB_COLORS); hf=_lcreat(c:seed.bmp,0); _lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER); _lwrite(hf,(LPSTR)lpTempImgData,BufSize); _lclose(hf); /释放内存和资源 ReleaseDC(hWnd,hDc); LocalUnlock(hTempImgData); LocalFree(hTempImgData); GlobalUnlock(hImgData); return TRUE;4.4轮廓跟踪经过顺序找出边缘点以跟踪出边界就是轮廓跟踪。廓跟踪后的结果图如下: 给出程序:BOOL Contour(HWND hWnd) DWORD OffBits,BufSize;LPB

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论