区域生长原理和代码.doc_第1页
区域生长原理和代码.doc_第2页
区域生长原理和代码.doc_第3页
区域生长原理和代码.doc_第4页
区域生长原理和代码.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

区域生长原理和代码基于区域的图像分割-区域生长 区域增长方法是根据同一物体区域内象素的相似性质来聚集象素点的方法,从初始区域(如小邻域或甚至于每个象素)开始,将相邻的具有同样性质的象素或其它区域归并到目前的区域中从而逐步增长区域,直至没有可以归并的点或其它小区域为止。区域内象素的相似性度量可以包括平均灰度值、纹理、颜色等信息。 区域增长方法是一种比较普遍的方法,在没有先验知识可以利用时,可以取得最佳的性能,可以用来分割比较复杂的图象,如自然景物。但是,区域增长方法是一种迭代的方法,空间和时间开销都比较大。 区域生长是一种串行区域分割的图像分割方法。区域生长是指从某个像素出发,按照一定的准则,逐步加入邻近像素,当满足一定的条件时,区域生长终止。区域生长的好坏决定于1.初始点(种子点)的选取。2.生长准则。3.终止条件。区域生长是从某个或者某些像素点出发,最后得到整个区域,进而实现目标的提取。区域生长的原理区域生长的基本思想是将具有相似性质的像素集合起来构成区域。具体先对每个需要分割的区域找一个种子像素作为生长起点,然后将种子像素和周围邻域中与种子像素有相同或相似性质的像素(根据某种事先确定的生长或相似准则来判定)合并到种子像素所在的区域中。将这些新像素当作新的种子继续上面的过程,直到没有满足条件的像素可被包括进来。这样一个区域就生长成了。 图1给出已知种子点进行区域生长的一个示例。图1(a)给出需要分割的图像,设已知两个种子像素(标为深浅不同的灰色方块),现要进行区域生长。设这里采用的判定准则是:如果考虑的像素与种子像素灰度值差的绝对值小于某个门限T,则将该像素包括进种子像素所在的区域。图1(b)给出了T=3时的区域生长结果,整幅图被较好地分成2个区域;图1(c)给出了T=1时的区域生长结果,有些像素无法判定;图1(c)给出了T=6时的区域生长的结果,整幅图都被分在一个区域中了。由此可见门限的选择是很重要的。图1如下:1 0 4 7 5 1 1 5 5 5 1 1 5 7 51 0 4 7 7 1 1 5 5 5 1 1 5 7 70 1 4 5 5 1 1 5 5 5 1 1 5 5 52 0 5 6 5 1 1 5 5 5 2 1 5 5 5 2 2 5 6 4 1 1 5 5 5 2 2 5 5 5 (a) (b) (c) 区域生长是一种古老的图像分割方法,最早的区域生长图像分割方法是由Levine等人提出的。该方法一般有两种方式,一种是先给定图像中要分割的目标物体内的一个小块或者说种子区域(seed point),再在种子区域基础上不断将其周围的像素点以一定的规则加入其中,达到最终将代表该物体的所有像素点结合成一个区域的目的;另一种是先将图像分割成很多的一致性较强,如区域内像素灰度值相同的小区域,再按一定的规则将小区域融合成大区域,达到分割图像的目的,典型的区域生长法如T. C. Pong等人提出的基于小面(facet)模型的区域生长法,区域生长法固有的缺点是往往会造成过度分割,即将图像分割成过多的区域 区域生长实现的步骤如下:1. 对图像顺序扫描!找到第1个还没有归属的像素, 设该像素为(x0, y0);2. 以(x0, y0)为中心, 考虑(x0, y0)的4邻域像素(x, y)如果(x0, y0)满足生长准则, 将(x, y)与(x0, y0)合并(在同一区域内), 同时将(x, y)压入堆栈;3. 从堆栈中取出一个像素, 把它当作(x0, y0)返回到步骤2;4. 当堆栈为空时!返回到步骤1;5. 重复步骤1 - 4直到图像中的每个点都有归属时。生长结束。 区域生长的代码实现:/* * * 函数名称: * RegionGrow() * * 输入参数: * CDib * pDib - 指向CDib类的指针,含有原始图象信息 * unsigned char * pUnRegion - 指向区域生长结果的指针 * * 返回值: * 无 * * 说明: * pUnRegion指针指向的数据区存储了区域生长的结果,其中(逻辑)表示 * 对应象素为生长区域,表示为非生长区域 * 区域生长一般包含三个比较重要的问题: * 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; nThreshold = 20; / 遍历图象的纵坐标/ 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 ; / 图象的横纵坐标,用来对当前象素的邻域进行遍历 int xx; int yy; while (nStart=nEnd) / 当前种子点的坐标 nCurrX = pnGrowQueXnStart; nCurrY = pnGrowQueYnStart; / 对当前点的邻域进行遍历 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

温馨提示

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

评论

0/150

提交评论