Python简单实现区域生长方式
区域生长是一种串行区域分割的图像分割方法。区域生长是指从某个像素出发,按照一定的准则,逐步加入邻近像素,当满足一定的条件时,区域生长终止。区域生长的好坏决定于1.初始点(种子点)的选取。2.生长准则。3.终止条件。区域生长是从某个或者某些像素点出发,最后得到整个区域,进而实现目标的提取。
区域生长的原理:
区域生长的基本思想是将具有相似性质的像素集合起来构成区域。具体先对每个需要分割的区域找一个种子像素作为生长起点,然后将种子像素和周围邻域中与种子像素有相同或相似性质的像素(根据某种事先确定的生长或相似准则来判定)合并到种子像素所在的区域中。将这些新像素当作新的种子继续上面的过程,直到没有满足条件的像素可被包括进来。这样一个区域就生长成了。
区域生长实现的步骤如下:
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直到图像中的每个点都有归属时。生长结束。
Python实现
importnumpyasnp importcv2 classPoint(object): def__init__(self,x,y): self.x=x self.y=y defgetX(self): returnself.x defgetY(self): returnself.y defgetGrayDiff(img,currentPoint,tmpPoint): returnabs(int(img[currentPoint.x,currentPoint.y])-int(img[tmpPoint.x,tmpPoint.y])) defselectConnects(p): ifp!=0: connects=[Point(-1,-1),Point(0,-1),Point(1,-1),Point(1,0),Point(1,1),\ Point(0,1),Point(-1,1),Point(-1,0)] else: connects=[Point(0,-1),Point(1,0),Point(0,1),Point(-1,0)] returnconnects defregionGrow(img,seeds,thresh,p=1): height,weight=img.shape seedMark=np.zeros(img.shape) seedList=[] forseedinseeds: seedList.append(seed) label=1 connects=selectConnects(p) while(len(seedList)>0): currentPoint=seedList.pop(0) seedMark[currentPoint.x,currentPoint.y]=label foriinrange(8): tmpX=currentPoint.x+connects[i].x tmpY=currentPoint.y+connects[i].y iftmpX<0ortmpY<0ortmpX>=heightortmpY>=weight: continue grayDiff=getGrayDiff(img,currentPoint,Point(tmpX,tmpY)) ifgrayDiff以上这篇Python简单实现区域生长方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。