图像分割和二值数学形态学图象处理_第1页
图像分割和二值数学形态学图象处理_第2页
图像分割和二值数学形态学图象处理_第3页
图像分割和二值数学形态学图象处理_第4页
图像分割和二值数学形态学图象处理_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

*******************实践教学*******************兰州理工大学计算机与通信学院2023年秋季学期计算机图象处理综合训练题目:图像分割和二值数学形态学图象处理程序设计专业班级:姓名:学号:指导教师:成绩:目录摘要1一、前言2二、算法分析与描述3三、详细设计过程53.1区域生长法53.1图像腐蚀5四、调试过程中出现的问题及相应解决方法74.1程序调试中出现的问题及解决方法74.2程序运行过程中出现的问题8五、程序运行截图及其说明9六、简单操作手册12参考资料15致谢16附录17摘要用计算机进行数字图像处理的目的有两个,一是产生更适合人类视觉观察和识别的图像,二是希望计算机能够自动进行识别和理解图像。数字图像处理包括的内容主要有:图像数字化,图像增强,图像几何变换,图像恢复,图像重建,图像隐藏,图像变换,图像编码,图像识别与理解。在这里主要研究图像分割中的区域生长法和二值图像处理中的腐蚀。区域生长的根本思想是将具有相似性质的像素集合起来构成区域。首先,对每个要分割的区域找一个种子点,然后将种子像素周围邻域中域种子像素由相同或相似性质的像素合并到种子像素所在的区域中。将这些新像素当作新的种子点继续进行上面的过程,直到没有满足条件的像素点时停止生长。腐蚀是一种消除边界点,使边界向内部收缩的过程,可以消除小且无意义的目标物。腐蚀处理可以表示成用结构元素对图像进行探测,找出图像中可以放下该结构元素的区域。在图像处理中主要用MATLAB和VC++编写图像处理程序,这里主要用VC++编写图像处理程序并调用C++图像处理的局部内部函数进行处理。关键词数字图象处理;区域生长法;图像腐蚀;一、前言数字图像处理〔DigitalImageProcessing〕又称为计算机图像处理,它是指将图像信号转换成数字信号并利用计算机对其进行处理的过程。在图像分析中,通常需要将所关心的目标从图像中提取出来,这种从图像中将某个特定区域与其他局部进行别离并提取出来的处理,就是图像分割。因为图像分析处理实际就是区分图像中的“前景目标〞和“背景〞,所以通常又称之为图像的二值化处理。图像分割在图像分析、图像识别、图像检测等方面占有非常重要的地位。在图象处理中,二值数学形态学是一种经典的算法,在图象处理与分析技术中,许多场合下对所拍摄的图象进行二值化处理,然后对分割出的目标区域进行几何特征的测量。二值图象中的一种主要处理是对所提取的目标图形进行形态分析。二值图像中的一种主要处理是对所提取的目标图形进行形态分析。腐蚀处理的作用是将目标图形收缩,为了实现腐蚀,数学形态学提出了结构元素的概念。所谓结构元素是指具有某种确定形状的根本结构元素,例如,一定大小的矩形、圆或者菱形等。腐蚀处理可以表示成用结构元素对图像进行探测,找出图像中可以放下该结构元素的区域。二、算法分析与描述2.1.区域生长法图像分割的目的是要把一幅图像划分成一些区域,最直接的方法就是把点组成区域。为此需要以下三个步骤:确定区域的数目;确定一个区域与其他区域相区别的特征;产生有意义分割的相似性判据。由此,假定要划分的区域数目以及每个区域内某一点的位置,就可以推导出图像分割的一种算法,即区域生长法。区域生长的根本思想是将具有相似性质的像素集合起来构成区域。首先,对每个要分割的区域找一个种子点,然后将种子像素周围邻域中与种子像素有相同或相似性质的像素合并到种子像素所在的区域中。将这些新像素当作新的种子点继续进行上面的过程,直到没有满足条件的像素点时停止生长。其中相似性准那么可以是灰度级、彩色、组织、梯度或其他特性。相似性的测度可以由所确定的阈值来决定从上例可知,区域生长方法的实现有三个关键点:①种子点的选取;②生长准那么确实定;③区域生长停止的条件。选取的种子点原那么上是待提取区域的有代表性的点可是单个像素,也可是包括假设干个像素的子区域。生长准那么原那么上是评价与种子点相似程度的度量。生长准那么多采用与种子点的距离度量。种子点可以随着区域的生长而变化,也可以设定为一个固定的数值。区域生长的停止条件,对于渐变区域进行生长时的停止判断非常重要。一般是结合生长准那么来进行合理的设定。判定生长停止的阈值可以是确定的值,也可是随生长而变化的值。2.1.图像腐蚀形态学运算是针对二值图象依据数学形态学(MathematicalMorphology)的集合论方法开展起来的图象处理方法。数学形态学起源于岩相学对岩石结构的定量描述工作,近年来在数字图象处理和机器视觉领域中得到了广泛的应用,形成了一种独特的数字图象分析方法和理论。通常形态学图象处理表现为一种邻域运算形式,一种特殊定义的邻域称之为“结构元素〞〔StructureElement〕,在每个象素位置上它与二值图象对应的区域进行特定的逻辑运算,逻辑运算的结果为输出图象的相应象素。形态学运算的效果取决于结构元素的大小、内容以及逻辑运算的性质。给定二值图象I(x,y)和作为结构元素的二值模板T(i,j),那么典型的腐蚀运算可表示成:腐蚀是一种消除边界点,使边界向内部收缩的过程。可以用来消除小且无意义的物体。一般意义的腐蚀概念定义为:也就是说,由B对X腐蚀所产生的二值图象E是满足以下条件的点(x,y)的集合:如果B的原点平移到点(x,y),那么B将完全包含于X中。根据以上原理,腐蚀运算的具体步骤如下:1〕.扫描原图,找第一个像素值为1的点;2〕.将预先设定好形状以及原点位置的结构元素的原点移动到该点;3〕.判断该结构元素所覆盖范围内的像素值是否全部为1,如果是,那么腐蚀后图像的相同位置上的像素值置为1,如果至少有一个像素的值为0,那么腐蚀后图像的相同位置上的像素值置为0;4〕.对原图中所有像素值为1的点重复进行2〕和3).三、详细设计过程3.1区域生长法1.类的属性说明: double*m_pDbImage; intm_nSupp; intm_nDWTCurDepth;2.类的行为说明:intInitDocVariable();intFreeDocVariable();virtualvoidAssertValid()const;virtualvoidDump(CDumpContext&dc)const;BOOLDIBDWTStep(CDib*pDib,intnInv);C06500131panzhangrongDoc*GetDocument();afx_msgvoidOnEdgeRoberts();afx_msgvoidOnEdgeSobel();afx_msgvoidOnEdgePrewitt();afx_msgvoidOnEdgeLaplace();afx_msgvoidOnEdgeCanny();afx_msgvoidOnEdgeTrack();afx_msgvoidOnRegionGrow();RegionGrow();pUnRegion指针指向的数据区存储了区域生长的结果,其中1〔逻辑〕表示,对应象素为生长区域,0表示为非生长区域。3.2.图像腐蚀1、程序运行中用到的运算:VErosion()图象进行垂直方向上的腐蚀运算HErosion()图象进行水平方向上的腐蚀运算VHErosion()图象进行全方向腐蚀2、主要函数说明1〕.函数名称:VErosion()参数:HDIBhDIB-待处理的DIB返回值:void -无返回值说明:该函数对图象进行垂直方向上的腐蚀2〕.函数名称:HErosion()参数:HDIBhDIB-待处理的DIB返回值:void -无返回值说明:该函数对图象进行水平方向上的腐蚀3).函数名称:VHErosion()参数:HDIBhDIB-待处理的DIB返回值:void -无返回值说明:该函数对图象进行全方向腐蚀四、调试过程中出现的问题及相应解决方法4.1程序调试中出现的问题及解决方法voidRegionSegFixThreshold(CDib*pDib,intnThreshold){ //遍历图象的纵坐标 inty; //遍历图象的横坐标 intx; //图象的长宽大小 CSizesizeImage =pDib->GetDimensions(); intnWidth =sizeImage.cx ; intnHeight =sizeImage.cy ; //图像在计算机在存储中的实际大小 CSizesizeImageSave =pDib->GetDibSaveDim(); //图像在内存中每一行象素占用的实际空间 intnSaveWidth=sizeImageSave.cx; //图像数据的指针LPBYTEpImageData=pDib->m_lpImage;for(y=0;y<nHeight;y++) for(x=0;x<nWidth;x++) {if() *(pImageData+y*nSaveWidth+x)=0; }}程序中判断条件空,程序无法顺利执行改正为:voidRegionSegFixThreshold(CDib*pDib,intnThreshold){ //遍历图象的纵坐标 inty; //遍历图象的横坐标 intx; //图象的长宽大小 CSizesizeImage =pDib->GetDimensions(); intnWidth =sizeImage.cx ; intnHeight =sizeImage.cy ; //图像在计算机在存储中的实际大小 CSizesizeImageSave =pDib->GetDibSaveDim(); //图像在内存中每一行象素占用的实际空间 intnSaveWidth=sizeImageSave.cx; //图像数据的指针LPBYTEpImageData=pDib->m_lpImage;for(y=0;y<nHeight;y++) for(x=0;x<nWidth;x++) {if(*(pImageData+y*nSaveWidth+x)<nThreshold) *(pImageData+y*nSaveWidth+x)=0; }}4.2程序运行过程中出现的问题该程序只能处理256色的文件,对于其他格式的图像文件不能直接处理要经过格式转换后才能在改程序上执行。1、函数在编译时出错,应为没有参加必须有的头文件#include"math.h"有"math.h"头文件才能对出现的数学计算进行正确处理。2、安装的创天中文VC++无法翻开头文件"afsrex.h"。3、所被用来做二值数学形态学图象处理的图像必须是24位色位图,假设不是那么需将其先转化。五、程序运行截图及其说明5.1区域生长法运行结果1.原图图5.12.经区域生长法分割后图像图5.25.2图像腐蚀运行结果1.原图2.水平腐蚀后的图像3.垂直腐蚀后的图像4.全方位腐蚀后的图像六、简单操作手册6.1区域生长法的操作:运行程序出现界面,如下列图6.1所示:图6.1程序界面点击文件,再点击翻开,翻开原图,如下列图6.2所示:图6.2程序界面6.2图像腐蚀的操作:运行程序界面,如下列图6.3所示:图6.3程序界面点击文件,再点击翻开,翻开原图,如下列图6.4所示:图6.4程序界面设计总结通过这次综合训练,使我受到了一次用专业知识、专业技能分析和查找资料以及解决问题的全面系统的锻炼。使我在综合知识的选用方面,在应用软件开发的根本思想、方法方面,以及在常用编程设计思路技巧的掌握方面都能向前迈了一大步。这次在指导老师的帮助下,在同学的支持下,根本上完成了设计任务,在软件的设计方面也有了一定的提高,较熟练掌握了一些VisulC++编程技巧,为今后走上工作岗位打下了专业根底。在这次的综合训练中,让我深深地表达到进行软件开发不是一件简单的事情,它需要设计者具有全面的专业知识、缜密的思维、严谨的工作态度以及较高的分析问题、解决问题的能力,而我在很多方面还有欠缺。最后,我要衷心感谢老师和同学们在我的设计过程中给予我的极大帮助,使我能够及时、顺利地完成此次的课程设计。参考资料[1]朱虹.计算机图象处理根底[M].科学出版社,2005[2]RC.Gonzalez,RE.Woods著,阮秋琦,阮宇智等译.计算机图象处理(第2版).北京:电子工业出版社,2003[3]K.R.Castleman.计算机图象处理.北京:电子工业出版社,2002[4]章毓晋.图像处理与分析-图像工程〔上册〕,清华大学,2001[5]何斌等编著.VisualC++计算机图象处理.人民邮电出版社,2002[6]张宏林编著.VisualC++计算机图象模式识别技术及工程实践.人民邮电出版社,2003.[7]黄维通.VisualC++面向对象与可视化程序设计.清华大学出版社,2003[8]RC.Gonzalez,RE.Woods,SL.Eddins著,阮秋琦,阮宇智等译.计算机图象处理(MATLAB版).北京:电子工业出版社,2005致谢为期2周的计算机图象处理综合训练终于落下了帷幕,在这段日子里,非常感谢老师和同学的帮助和支持,才能使我顺利的完成课设。尤其是我的指导老师柯铭老师,她在上课期间为我们打下坚实的根底,在我们的课程设计过程中提出了指导性的方案和架构,并指引我们阅读相关的资料和书籍,使我在不熟悉的领域中仍能迅速掌握新的技术。在此,对柯老师在我的设计过程中给予我的极大帮助表示衷心的感谢。同时,在这里要特别感谢我宿舍的同学们,可以说没有你们的帮助我就很难完成这次课程设计,对于你们的帮助我只能由衷地说句:谢谢!附录/***************************************************************************\函数名称:*RegionGrow()**\输入参数:*CDib*pDib -指向CDib类的指针,含有原始图象信息*unsignedchar*pUnRegion -指向区域生长结果的指针**\返回值:*无**\说明:*pUnRegion指针指向的数据区存储了区域生长的结果,其中1〔逻辑〕表示* 对应象素为生长区域,0表示为非生长区域*区域生长一般包含三个比拟重要的问题:* 1.种子点的选取* 2.生长准那么* 3.终止条件* 可以认为,这三个问题需要具体分析,而且每个问题解决的好坏直接关系到* 区域生长的结果。* 本函数的种子点选取为图像的中心,生长准那么是相邻象素的象素值小于* nThreshold,终止条件是一直进行到再没有满足生长准那么需要的象素时为止***************************************************************************/voidRegionGrow(CDib*pDib,unsignedchar*pUnRegion,intnThreshold){ staticintnDx[]={-1,0,1,0}; staticintnDy[]={0,1,0,-1}; //遍历图象的纵坐标// inty; //遍历图象的横坐标// intx; //图象的长宽大小 CSizesizeImage =pDib->GetDimensions(); intnWidth =sizeImage.cx ; intnHeight =sizeImage.cy ; //图像在计算机在存储中的实际大小 CSizesizeImageSave =pDib->GetDibSaveDim(); //图像在内存中每一行象素占用的实际空间 intnSaveWidth=sizeImageSave.cx; //初始化 memset(pUnRegion,0,sizeof(unsignedchar)*nWidth*nHeight); //种子点 intnSeedX,nSeedY; //设置种子点为图像的中心 nSeedX=nWidth/2; nSeedY=nHeight/2; //定义堆栈,存储坐标 int*pnGrowQueX; int*pnGrowQueY; //分配空间 pnGrowQueX=newint[nWidth*nHeight]; pnGrowQueY=newint[nWidth*nHeight]; //图像数据的指针 unsignedchar*pUnchInput=(unsignedchar*)pDib->m_lpImage; //定义堆栈的起点和终点 //当nStart=nEnd,表示堆栈中只有一个点 intnStart; intnEnd; //初始化 nStart=0; nEnd=0; //把种子点的坐标压入栈 pnGrowQueX[nEnd]=nSeedX; pnGrowQueY[nEnd]=nSeedY; //当前正在处理的象素 intnCurrX; intnCurrY; //循环控制变量 intk; //图象的横纵坐标,用来对当前象素的4邻域进行遍历 intxx; intyy; while(nStart<=nEnd) { //当前种子点的坐标 nCurrX=pnGrowQueX[nStart]; nCurrY=pnGrowQueY[nStart]; //对当前点的4邻域进行遍历 for(k=0;k<4;k++) { //4邻域象素的坐标 xx=nCurrX+nDx[k]; yy=nCurrY+nDy[k]; //判断象素(xx,yy)是否在图像内部 //判断象素(xx,yy)是否已经处理过 //pUnRegion[yy*nWidth+xx]==0表示还没有处理 //生长条件:判断象素(xx,yy)和当前象素(nCurrX,nCurrY)象素值差的绝对值 if( (xx<nWidth)&&(xx>=0)&&(yy<nHeight)&&(yy>=0) &&(pUnRegion[yy*nWidth+xx]==0) &&abs(pUnchInput[yy*nSaveWidth+xx]-pUnchInput[nCurrY*nSaveWidth+nCurrX])<nThreshold) { //堆栈的尾部指针后移一位 nEnd++; //象素(xx,yy)压入栈 pnGrowQueX[nEnd]=xx; pnGrowQueY[nEnd]=yy; //把象素(xx,yy)设置成逻辑1〔255〕 //同时也说明该象素处理过 pUnRegion[yy*nWidth+xx]=255; } } nStart++; } //释放内存 delete[]pnGrowQueX; delete[]pnGrowQueY;pnGrowQueX=NULL; pnGrowQueY=NULL;}voidDFT_2D(CDib*pDib,double*pTrRstRpart,double*pTrRstIpart){ doublePI=3.14159; //遍历图象的纵坐标 inty; //遍历图象的横坐标 intx; //频域的横坐标 intm; //频域的纵坐标 intn; //图象的长宽大小 CSizesizeImage =pDib->GetDimensions(); intnWidth =sizeImage.cx ; intnHeight =sizeImage.cy ; //图像在计算机在存储中的实际大小 CSizesizeImageSave =pDib->GetDibSaveDim(); intnSaveWidth=sizeImageSave.cx; //图像数据的指针 LPBYTEpImageData=pDib->m_lpImage; //初始化结果数据 for(n=0;n<nHeight;n++) for(m=0;m<nWidth;m++) { *( pTrRstRpart+n*nWidth+m )=0; *( pTrRstIpart+n*nWidth+m )=0; } doublefCosTable; doublefSinTable; int nPxValue; fCosTable=0; nPxValue=0; doublefTmpRstR; doublefTmpRstI;for(n=0;n<nHeight;n++)for(m=0;m<nWidth;m++) { fTmpRstR=0; fTmpRstI=0; for(y=0;y<nHeight;y++) for(x=0;x<nWidth;x++) { fCosTable=cos( 2*PI*(((double)m*x)/nWidth+((double)n*y)/nHeight)); fSinTable=sin( -2*PI*(((double)m*x)/nWidth+((double)n*y)/nHeight)); nPxValue=*(pImageData+y*nSaveWidth+x) ; fTmpRstR+=fCosTable*nPxValue ; fTmpRstI+=fSinTable*nPxValue ; } *(pTrRstRpart+nWidth*n+m)=fTmpRstR; *(pTrRstIpart+nWidth*n+m)=fTmpRstI; }}voidIDFT_2D(CDib*pDib,double*pTrRstRpart,double*pTrRstIpart){ doublePI=3.14159; //遍历图象的纵坐标 inty; //遍历图象的横坐标 intx; //频域的横坐标 intm; //频域的纵坐标 intn; //图象的长宽大小 CSizesizeImage =pDib->GetDimensions(); intnWidth =sizeImage.cx ; intnHeight =sizeImage.cy ; //图像在计算机在存储中的实际大小 CSizesizeImageSave =pDib->GetDibSaveDim(); intnSaveWidth=sizeImageSave.cx; //图像数据的指针 LPBYTEpImageData=pDib->m_lpImage; doublefCosTable; doublefSinTable; fCosTable=0; fSinTable=0; doublefTmpPxValue; doublefRpartValue; doublefIpartValue; fTmpPxValue=0; fRpartValue=0; fIpartValue=0; for(y=0;y<nHeight;y++) for(x=0;x<nWidth;x++) { fTmpPxValue=0; for(n=0;n<nHeight;n++) for(m=0;m<nWidth;m++) { fCosTable=cos( 2*PI*(((double)m*x)/nWidth+((double)n*y)/nHeight)); fSinTable=sin( 2*PI*(((double)m*x)/nWidth+((double)n*y)/nHeight)); fRpartValue=*(pTrRstRpart+n*nHeight+m); fIpartValue=*(pTrRstIpart+n*nHeight+m); fTmpPxValue+=fCosTable*fRpartValue-fSinTable*fIpartValue; } fTmpPxValue=fTmpPxValue/(nHeight*nWidth); *(pImageData+nSaveWidth*y+x)=(unsignedchar)fTmpPxValue; }}********************************************************************//文件名:morph.cpp////图像形态学变换API函数库:////ErosionDIB()-图像腐蚀//****************************************************************#include"stdafx.h"#include"morph.h"#include"DIBAPI.h"#include<math.h>#include<direct.h>/*****************************************************************函数名称:*ErosiontionDIB()**参数:*LPSTRlpDIBBits-指向源DIB图像指针*LONGlWidth-源图像宽度〔象素数,必须是4的倍数〕*LONGlHeight-源图像高度〔象素数〕*intnMode -腐蚀方式,0表示水平方向,1表示垂直方向,2表示自定义结构元素。* intstructure[3][3] -自定义的3×3结构元素。**返回值:*BOOL-腐蚀成功返回TRUE,否那么返回FALSE。**说明:*该函数用于对图像进行腐蚀运算。结构元素为水平方向或垂直方向的三个点,中间点位于原点;*或者由用户自己定义3×3的结构元素。**要求目标图像为只有0和255两个灰度值的灰度图像。************************************************************************/BOOLWINAPIErosionDIB(LPSTRlpDIBBits,LONGlWidth,LONGlHeight,intnMode,intstructure[3][3]){ //指向源图像的指针 LPSTR lpSrc; //指向缓存图像的指针 LPSTR lpDst; //指向缓存DIB图像的指针 LPSTR lpNewDIBBits; HLOCAL hNewDIBBits; //循环变量 longi; longj; intn; intm; //像素值 unsignedcharpixel; //暂时分配内存,以保存新图像 hNewDIBBits=LocalAlloc(LHND,lWidth*lHeight); if(hNewDIBBits==NULL) { //分配内存失败 returnFALSE; } //锁定内存 lpNewDIBBits=(char*)LocalLock(hNewDIBBits); //初始化新分配的内存,设定初始值为255 lpDst=(char*)lpNewDIBBits; memset(lpDst,(BYTE)255,lWidth*lHeight); if(nMode==0) { //使用水平方向的结构元素进行腐蚀 for(j=0;j<lHeight;j++) { for(i=1;i<lWidth-1;i++) { //由于使用1×3的结构元素,为防止越界,所以不处理最左边和最右边的两列像素 //指向源图像倒数第j行,第i个象素的指针 lpSrc=(char*)lpDIBBits+lWidth*j+i; //指向目标图像倒数第j行,第i个象素的指针 lpDst=(char*)lpNewDIBBits+lWidth*j+i; //取得当前指针处的像素值,注意要转换为unsignedchar型 pixel=(unsignedchar)*lpSrc; //目标图像中含有0和255外的其它灰度值 if(pixel!=255&&*lpSrc!=0) returnFALSE; //目标图像中的当前点先赋成黑色 *lpDst=(unsignedchar)0; //如果源图像中当前点自身或者左右有一个点不是黑色, //那么将目标图像中的当前点赋成白色 for(n=0;n<3;n++) { pixel=*(lpSrc+n-1); if(pixel==255) { *lpDst=(unsignedchar)255; break; } } } } } elseif(nMode==1) { //使用垂直方向的结构元素进行腐蚀 for(j=1;j<lHeight-1;j++) { for(i=0;i<lWidth;i++) { //由于使用1×3的结构元素,为防止越界,所以不处理最上边和最下边的两列像素 //指向源图像倒数第j行,第i个象素的指针 lpSrc=(char*)lpDIBBits+lWidth*j+i; //指向目标图像倒数第j行,第i个象素的指针 lpDst=

温馨提示

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

最新文档

评论

0/150

提交评论