




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
区域增长算法/* 函数名称:* RegionGrow()* 输入参数:* CDib * pDib- 指向CDib类的指针,含有原始图象信息* unsigned char * pUnRegion- 指向区域生长结果的指针* 返回值:* 无* 说明:* pUnRegion指针指向的数据区存储了区域生长的结果,其中1(逻辑)表示* 对应象素为生长区域,0表示为非生长区域* 区域生长一般包含三个比较重要的问题:*1. 种子点的选取*2. 生长准则*3. 终止条件* 可以认为,这三个问题需要具体分析,而且每个问题解决的好坏直接关系到* 区域生长的结果。* 本函数的种子点选取为图像的中心,生长准则是相邻象素的象素值小于* nThreshold, 终止条件是一直进行到再没有满足生长准则需要的象素时为止*/void RegionGrow(CDib * pDib, unsigned char * pUnRegion, int nThreshold)static int nDx=-1,0,1,0;static int nDy=0,1,0,-1;/ 遍历图象的纵坐标/int y;/ 遍历图象的横坐标/int x;/ 图象的长宽大小CSize sizeImage= pDib-GetDimensions();int nWidth= sizeImage.cx;int nHeight= sizeImage.cy;/ 图像在计算机在存储中的实际大小CSize sizeImageSave= pDib-GetDibSaveDim();/ 图像在内存中每一行象素占用的实际空间int nSaveWidth = sizeImageSave.cx;/ 初始化memset(pUnRegion,0,sizeof(unsigned char)*nWidth*nHeight);/ 种子点int nSeedX, nSeedY;/ 设置种子点为图像的中心nSeedX = nWidth /2 ;nSeedY = nHeight/2 ;/ 定义堆栈,存储坐标int * pnGrowQueX ;int * pnGrowQueY ;/ 分配空间pnGrowQueX = new int nWidth*nHeight;pnGrowQueY = new int nWidth*nHeight;/ 图像数据的指针unsigned char *pUnchInput =(unsigned char * )pDib-m_lpImage;/ 定义堆栈的起点和终点/ 当nStart=nEnd, 表示堆栈中只有一个点int nStart ;int nEnd ;/初始化nStart = 0 ;nEnd = 0 ;/ 把种子点的坐标压入栈pnGrowQueXnEnd = nSeedX;pnGrowQueYnEnd = nSeedY;/ 当前正在处理的象素int nCurrX ;int nCurrY ;/ 循环控制变量int k ;/ 图象的横纵坐标,用来对当前象素的4邻域进行遍历int xx;int yy;while (nStart=nEnd)/ 当前种子点的坐标nCurrX = pnGrowQueXnStart;nCurrY = pnGrowQueYnStart;/ 对当前点的4邻域进行遍历for (k=0; k4; k+)/ 4邻域象素的坐标xx = nCurrX+nDxk;yy = nCurrY+nDyk;/ 判断象素(xx,yy) 是否在图像内部/ 判断象素(xx,yy) 是否已经处理过/ pUnRegionyy*nWidth+xx=0 表示还没有处理/ 生长条件:判断象素(xx,yy)和当前象素(nCurrX,nCurrY) 象素值差的绝对值if (xx =0) & (yy=0) & (pUnRegionyy*nWidth+xx=0) & abs(pUnchInputyy*nSaveWidth+xx - pUnchInputnCurrY*nSaveWidth+nCurrX)nThreshold )/ 堆栈的尾部指针后移一位nEnd+;/ 象素(xx,yy) 压入栈pnGrowQueXnEnd = xx;pnGrowQueYnEnd = yy;/ 把象素(xx,yy)设置成逻辑1(255)/ 同时也表明该象素处理过pUnRegionyy*nWidth+xx = 255 ;nStart+;/ 释放内存delete pnGrowQueX;delete pnGrowQueY;pnGrowQueX = NULL ;pnGrowQueY = NULL ;对于2D图象的组织增长,使用递归也是一种不错的选择,但需要注意栈空间需要设大一些。而在3D数据场上,递归几乎是不可行的,栈空间经常会出现溢出的情况,因此不具备实用性。2D组织增长伪代码如下组织增长(Image* pImage, int i, ing j, byte* mask) if 不满足增长条件(pImage, i,j, mask) return; 设置标记(mask, i, j); 组织增长(pImage, i-1, j, mask); 组织增长(pImage, i+1, j, mask); 组织增长(pImage, i, j-1, mask); 组织增长(pImage, i, j+1, mask);至于将递归程序改为迭代程序,可以看一看程序设计方法学 区域增长算法 区域增长的算法实现: 1)根据图像的不同应用选择一个或一组种 子,它或者是最亮或最暗的点,或者是位 于点簇中心的点 2.通过像素集合的区域增长 算法实现: 区域A 区域B 种子像素增长.3)增长的规则 4)结束条件.BOOL RegionGrow(int nSeedX, int nSeedY, BYTE * pUnchInput,int nWidth, int nHeight, BYTE * pUnRegion,CRect &R)int nDx = -1,1,0,0; int nDy = 0,0,-1,1;int nSaveWidth = nWidth; / 定义堆栈,存储坐标int * pnGrowQueX ;int * pnGrowQueY ;/ 分配空间pnGrowQueX = new int nWidth*nHeight;pnGrowQueY = new int nWidth*nHeight;/ 定义堆栈的起点和终点/ 当nStart=nEnd, 表示堆栈中只有一个点int nStart ;int nEnd ;/初始化nStart = 0 ;nEnd = 0 ;/ 把种子点的坐标压入栈pnGrowQueXnEnd = nSeedX;pnGrowQueYnEnd = nSeedY;/ 当前正在处理的象素int nCurrX ;int nCurrY ;/ 循环控制变量int k ; / 图象的横纵坐标,用来对当前象素的8邻域进行遍历int xx;int yy;while (nStart=nEnd)/ 当前种子点的坐标nCurrX = pnGrowQueXnStart;nCurrY = pnGrowQueYnStart; / 对当前点的4邻域进行遍历for (k=0; k4; k+) / 4邻域象素的坐标xx = nCurrX+nDxk;yy = nCurrY+nDyk;/ 判断象素(xx,yy) 是否在图像内部/ 判断象素(xx,yy) 是否已经处理过/ pUnRegionyy*nWidth+xx=0 表示还没有处理/ 生长条件:判断象素(xx,yy)和当前象素(nCurrX,nCurrY) 象素值差的绝对值if ( (xx =0) & (yy=0) & (yynHeight) & (pUnRegionyy*nWidth+xx=0) & (pUnchInputyy*nSaveWidth+xx=1) / 堆栈的尾部指针后移一位nEnd+;/ 象素(xx,yy) 压入栈pnGrowQueXnEnd = xx;pnGrowQueYnEnd = yy;/ 把象素(xx,yy)设置成逻辑1(255)/ 同时也表明该象素处理过pUnRegionyy*nWidth+xx = 255 ;nStart+;/找出区域的范围 int nMinx=pnGrowQueX0, nMaxx=pnGrowQueX0, nMiny=pnGrowQueY0, nMaxy = pnGrowQueY0; for (k=0; k nMaxx) nMaxx = pnGrowQueXk; if (pnGrowQueXk nMaxy) nMaxy = pnGrowQueYk; if (pnGrowQueYk 40 & (nMaxx - nMinx) 40) R.left = nMinx; R.right = nMaxx; R.top = nMiny; R.bottom = nMaxy; return TRUE; / 释放内存delete pnGrowQueX;delete pnGrowQueY;pnGrowQueX = NULL ;pnGrowQueY = NULL ;return FALSE;/调用方法void OnButton(LPBYTE S,int ImageWidth,int ImageHeight)int i=0,j=0;CRect rect;LPBYTE lpFlag = new BYTEImageWidth*ImageHeight;memset(lpFlag,0,ImageWidth*ImageHeight);for (i=0; iImageHeight; i+)for (j=0; jImageWidth; j+)if (Si*ImageWidth+j = 1 & lpFlagi*ImageWidth+j = 0)RegionGrow(j, i, S, ImageWidth, ImageHeight, lpFlag,rect);if(lpFlag!=NULL)delete lpFlag;lpFlag = NULL;区域增长算法递归实现void RegionGrowTwo(int nSeedX, int nSeedY, BYTE * pUnchInput,BYTE * D, int nWidth, int nHeight, BYTE * pUnRegion,int &iLeft,int & iRight,int & iTop,int & iBottom) int nDx = -1,1,0,0;int nDy = 0,0,-1,1;int k=0;int nCurrX ;int nCurrY ;int xx=0,yy=0;nCurrX = nSeedX;nCurrY = nSeedY;if(nCurrXiRight)iRight = nCurrX;if(nCurrYiBottom)iBottom = nCurrY;/pUnRegionnCurrY*nWidth+nCurrX = 255 ; / 对当前点的4邻域进行遍历 int times = 0;for (k=0; k4; k+) / 4邻域象素的坐标xx = nCurrX+nDxk;yy = nCurrY+nDyk;/ 判断象素(xx,yy) 是否在图像内部/ 判断象素(xx,yy) 是否已经处理过/ pUnRegionyy*nWidth+xx=0 表示还没有处理/ 生长条件:判断象素(xx,yy)和当前象素(nCurrX,nCurrY) 象素值差的绝对值if ( (xx =0) & (yy=0) & (yynHeight) & (pUnRegionyy*nWidth+xx=0) & (pUnchInputyy*nWidth+xx=1) / 同时也表明该象素处理过pUnRegionyy*nWidth+xx = 255 ;if(xxiRight)iRight = xx;if(yyiBottom)iBottom = yy; RegionGrowTwo(xx,yy,pUnchInput,D,nWidth,nHeight,pUnRegion,iLeft,iRight,iTop,iBottom);elsetimes+;/*区域增长,递归实现* S,源图象 D,目标图象ImageWidth,ImageHeight,表示图象的宽、高*/void RegionGrowOne(BYTE *S,BYTE *D,int ImageWidth,int ImageHeight)int iLeft=0,iRight=0,iTop=0,iBottom=0;int k1,k2,k3,k4,ii1=0,off=0;int i=0,j=0;LPBYTE lpFlag = new BYTEImageWidth*ImageHeight;memset(lpFlag,0,ImageWidth*ImageHeight);memcpy(D,S,ImageWidth*ImageHeight);for (i=0; iImageHeight; i+)for (j=0; j40 & (iBottom-iTop)40) /表示区域大于40*40时就画出边框/画边框k1 = (iLeft -1 )=ImageWidth?(ImageWidth-1):(iRight+1);k3 = (iTop-1)=ImageHeight?(ImageHeight-1):(iBottom+1);for(ii1 = k1;ii1 = k2;ii1+)off = ii1 + k3*ImageWidth;Doff = 11;off = ii1 + k4*ImageWidth;Doff = 11;for(ii1 = k3 ;ii1 0) lpSrc = (char *)lpDIBBits + lWidth * iCurrentPixely + iCurrentPixelx - 1; /取得当前指针处的像素值,注意要转换为unsigned char型 pixel = (unsigned char)*lpSrc; if (pixel = 255) StackPoint+; SeedsStackPoint.Height = iCurrentPixely; SeedsStackPoint.Width = iCurrentPixelx - 1; /目标图像中含有0和255外的其它灰度值 if(pixel != 255 & pixel != 0) return FALSE; /判断上面的点,如果为白,则压入堆栈 /注意防止越界 if(iCurrentPixely lHeight - 1) lpSrc = (char *)lpDIBBits + lWidth * (iCurrentP
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 建筑工程项目工程完工后设备验收方案
- 混凝土浇筑工艺优化与工效提升方案
- 智算中心分布式存储系统方案
- 施工人员工伤保险与赔偿管理方案
- 水的三态课件
- 医药组织者市场购买行为分析一47课件
- 水电气安全知识培训内容课件
- 主情造意41主景塑造手法49课件
- 2025版建筑行业安全生产合作协议
- 二零二五年度第四章:跨境电商合同履行风险防范协议
- 数字经济产业组织-洞察及研究
- 2025年中国美甲贴片行业市场全景分析及前景机遇研判报告
- mcn公司管理制度
- 儿童腹痛的课件
- 会计常用的130个函数公式
- 国家保安员模拟考试题(含答案)
- 校招项目管理笔试题目及答案
- 2025年中国微功率模块电源项目投资可行性研究报告
- 《肩关节解剖学》课件
- 垫资过桥合同协议
- 2024储能参与电力市场
评论
0/150
提交评论