欢迎来到天天文库
浏览记录
ID:32607372
大小:59.00 KB
页数:11页
时间:2019-02-13
《区域生长算法代码概要1.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、区域增长算法/*****************************************************************\函数名称:* RegionGrow()**\输入参数:* CDib*pDib -指向CDib类的指针,含有原始图象信息* unsignedchar*pUnRegion -指向区域生长结果的指针**\返回值:* 无**\说明:* pUnRegion指针指向的数据区存储了区域生长的结果,其中1(逻辑)表示* 对应象素为生长区域,0表示为非生长区域* 区域生长一般包含三个比较重要的问题:* 1.种子点的选取*
2、2.生长准则* 3.终止条件* 可以认为,这三个问题需要具体分析,而且每个问题解决的好坏直接关系到* 区域生长的结果。* 本函数的种子点选取为图像的中心,生长准则是相邻象素的象素值小于* nThreshold,终止条件是一直进行到再没有满足生长准则需要的象素时为止***************************************************************************/voidRegionGrow(CDib*pDib,unsignedchar*pUnRegion,intnThreshold){ staticintnDx[]={-1,0,
3、1,0}; staticintnDy[]={0,1,0,-1}; //遍历图象的纵坐标// inty; //遍历图象的横坐标// intx; //图象的长宽大小 CSizesizeImage =pDib->GetDimensions(); intnWidth =sizeImage.cx ; intnHeight =sizeImage.cy ; //图像在计算机在存储中的实际大小 CSizesizeImageSave =pDib->GetDibSaveDim(); //图像在内存中每一行象素占用的实际空间 intnSaveWidth=sizeImageSave.cx;
4、//初始化 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=
5、(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) {
6、 //当前种子点的坐标 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)象素
7、值差的绝对值 if( (xx=0)&&(yy=0) &&(pUnRegion[yy*nWidth+xx]==0) &&abs(pUnchInput[yy*nSaveWidth+xx]-pUnchInput[nCurrY*nSaveWidth+nCurrX])
此文档下载收益归作者所有