第三讲区域填充

第三讲区域填充

ID:20641923

大小:1.08 MB

页数:53页

时间:2018-10-14

第三讲区域填充_第1页
第三讲区域填充_第2页
第三讲区域填充_第3页
第三讲区域填充_第4页
第三讲区域填充_第5页
资源描述:

《第三讲区域填充》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、第三节区域填充种子填充算法多边形扫描转换算法1.区域是指光栅网格上的一组象素。区域填充是把某确定的象素值送入到区域内部的所有象素中。2.区域定义方法分为两大类。⑴区域由多边形围成,区域由多边形的顶点序列来定义;优点:占用内存少,缺点:得区分内外侧⑵是通过象素的值来定义区域的内部优点:形状可任意复杂,可直接着色缺点:几何意义不直观一、种子填充算法3.用象素值定义区域(1)内定义区域(oldvalue)指出区域内部所具有的象素值,(内点表示)(2)边界定义区域(boundaryvalue),指出区域边界所具有的象素值。此时区域边界上所有象素具有某个边界boundaryvalue

2、。区域的边界应该是封闭的,指明区域的内部和外部。以象素为基础的区域填充主要是依据区域的连通性进行。4.区域的连通性(1)四连通:从区域中的一个象素出发,经连续地向上下左右四个相邻象素的移动,就可以到达区域内的任意另一个象素.(2)八连通:如果除了要经上下左右的移动,还要经左上、右上、左下和右下的移动,才能由一个象素走到区域中另外任意一个象素.四连通区域必定是八连通区域,反之不一定四连通区域八连通区域4.区域的连通性(1)四连通(2)八连通5.种子填充算法利用区域的连通性进行区域填充,除了需要区域应该明确定义外,还需要事先给定一个区域内部象素,这个象素称为种子。做区域填充时,

3、要对光栅网格进行遍历,找出由种子出发能达到而又不穿过边界的所有象素。这种利用连通性的填充,其主要优点是不受区域不规则性的影响,主要缺点是需要事先知道一个内部象素。(1)四连通内定义区域填充算法:voidFloodfill(intx,inty,COLORREFoldvalue,COLORREFnewvalue){/*(x,y)为种子oldvalue是原值newvalue是新值,应不等于原值。*/{//是否在区域内并且尚未被访问过if(GetPixel(x,y)==oldvalue){{SetPixel(x,y,newvalue);//赋值为新值Floodfill(x,y-1,

4、oldvalue,newvalue);//向上扩散Floodfill(x,y+1,oldvalue,newvalue);//向下扩散Floodfill(x-1,y,oldvalue,newvalue);//向左扩散Floodfill(x+1,y,oldvalue,newvalue);//向右扩散}}优点:算法简单缺点:重复多(2)四连通边界定义区域填充算法:voidBoundaryfill(intx,inty,COLORREFboundaryvalue,COLORREFnewvalue)/*(x,y)为种子位置boundaryvalue是边界象素值newvalue是区域内象

5、素新值,未填充前区域内不应有值为newvalue的象素。*/{if(GetPixel(x,y)!=boundaryvalue&&GetPixel(x,y)!=newvalue)//未达边界且未访问过{SetPixel(x,y,newvalue);//赋以新值//向四个方向扩散。Boundaryfill(x,y-1,boundaryvalue,newvalue);Boundaryfill(x,y+1,boundaryvalue,newvalue);Boundaryfill(x-1,y,boundaryvalue,newvalue);Boundaryfill(x+1,y,bou

6、ndaryvalue,newvalue);}}算法简单,多层递归,存储空间有限->堆栈溢出voidFloodfill(intx,inty,COLORREFoldvalue,COLORREFnewvalue){stacks;Pointp;if(GetPixel(x,y)==oldvalue)s.push(Point(x,y));while(!s.empty()){p=s.pop();SetPixel(p.x,p.y,newvalue);if(GetPixel(p.x,p.y-1)==oldvalue)s.push(Point(p.x,p.y-1));if(GetPixel(p

7、.x,p.y+1)==oldvalue)s.push(Point(p.x,p.y+1));if(GetPixel(p.x-1,p.y)==oldvalue)s.push(Point(p.x-1,p.y));if(GetPixel(p.x+1,p.y)==oldvalue)s.push(Point(p.x+1,p.y));}}voidBoundaryfill(intx,inty,COLORREFboundaryvalue,COLORREFnewvalue){stacks;Pointp;if((GetPixel(x,y

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。