区域填充算法

本文详细介绍了区域填充算法,特别是多边形填色方法。针对扫描线填色和种子填色算法进行了阐述,包括基本思想、处理技巧以及各自的优缺点。通过对多边形边边界的处理,如左、右顶点的修正,水平边的处理,以及采用活性边表提高效率,文章深入探讨了扫描线填色算法的实现。此外,还提到了种子填色算法中的四邻法和八邻法,分析了它们在填充效果上的差异。
摘要由CSDN通过智能技术生成

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

        区域填充即给出一个区域的边界,要求对边界范围内的所有象素单元赋予指定的颜色代码。区域填充中最常用的是多边形填色,本节中我们就以此为例讨论区域填充算法。

多边形填色即给出一个多边形的边界,要求对多边形边界范围的所有象素单元赋予指定的色代码。要完成这个任务,一个首要的问题,是判断一个象素是在多边形内还是外。数学上提供的方法是“扫描交点的奇偶数判断”法:

1、将多边形画在纸上。

2、用一根水平扫描线自左而右通过多边形而与多边形之边界相交。扫描线与边界相交奇次数后进入该多边形,相交偶次数后走出该多边形。图2.3.1示出这类情况:扫描线与多边形相交四点。相交a点之后入多边形;交b点(第2交点)之后出多边形;交c点(第3交点)之后又入多边形;交d点(第4交点)之后又出多边形。

上述方法似乎能完满地解决问题,但事实并非如此,因为直线在光栅化后变成了占有单位空间的离散点。图2.3.1中的A点处和B、C处,在光栅化后变成图2.3.2所示的情况。此时,使用上述判断法则,在A、B、C处发现错判现象。在A处,扫描线通过一点后以为入多边形,其实此时已出多边形。结果是在A点之后的扫描线段上全都错误地填上色。在B和C处,因为光栅化后,使得扫描线通过交点的个数发生变化而同样导致填色错误。因此,原始的奇偶判断方法需要加以周密地改善,才能成为计算机中实用的填色算法。

2_3_1.gif (3081 bytes)                         2_3_2.gif (2351 bytes)         

                            图2.3.1                                                                            图2.3.2

填色算法分为两大类:

1、扫描线填色(Scan-Line Filling)算法。这类算法建立在多边形边边界的矢量形式数据之上,可用于程序填色,也可用交互填色。

2、种子填色(Seed Filling)算法。这类算法建立在多边形边边界的图象形式数据之上,并还需提供多边形界内一点的坐标。所以,它一般只能用于人机交互填色,而难以用于程序填色。

        区域填充即给出一个区域的边界,要求对边界范围内的所有象素单元赋予指定的颜色代码。区域填充可以分两步走,第一步先确定需要填充那些象素,第二步确定用什么颜色来填充。区域填充中最常用的是多边形填色。
填色算法分为两大类: 1、扫描线填色(Scan-Line Filling)算法。这类算法建立在多边形边边界的矢量形式数据之上,可用于程序填色,也可用交互填色。 2、种子填色(Seed Filling)算法。这类算法建立在多边形边边界的图象形式数据之上,并还需提供多边形界内一点的坐标。所以,它一般只能用于人机交互填色,而难以用于程序填色。

1>.扫描线填色算法

扫描线填色算法的基本思想是:

用水平扫描线从上到下扫描由点线段构成的多段构成的多边形。每根扫描线与多边形各边产生一系列交点。将这些交点按照x坐标进行分类,将分类后的交点成对取出,作为两个端点,以所填的色彩画水平直线。多边形被扫描完毕后,填色也就完成。
 

一、算法的基本思想

多边形以n, x_array, y_array形式给出,其中x_array,y_array中存放着多边形的n个顶点的x, y坐标。扫描线填色算法的基本思想是:

用水平扫描线从上到下扫描由点线段构成的多段构成的多边形。每根扫描线与多边形各边产生一系列交点。将这些交点按照x坐标进行分类,将分类后的交点成对取出,作为两个端点,以所填的色彩画水平直线。多边形被扫描完毕后,填色也就完成。

上述基本思想中,有几个问题需要解决或改善。它们是:

1. 左、右顶点处理 当以1, 2, 3的次序画多边形外框时,多边形的左顶点和右顶点如图2.3.3 (a)、(b)所示的顶点2。它们具有性质:

左顶点2:y1<y2<y3

右顶点2:y1>y2>y3

其中y1, y2, y3是三个相邻的顶点的y坐标。

(a)左顶点 (b)右顶点

2_3_3.gif (2620 bytes)

图2.3.3

当扫描线与多边形的每个顶点相交时,会同时产生2个交点,这是因为一个顶点同属于多边形之两条边的端点。这时,如果所交的顶点是左顶点或右顶点,填色就会因奇偶计数出错而出现错误。因此,对多边形的所有左、右顶点作如下处理;

左、右顶点的入边(以该顶点为终点的那条边),即1, 2边之终点删去。即:

对于左顶点:入边(x1, y1)(x2, y2)修改为(x1, y1)(,y2-1);

对于右顶点:入边(x1, y1)(x2, y2)修改为(x1, y1)(,y2+1);

其中m=,即入边之斜率。

对于多边形的上顶点(y2>y1 & y2>y3)或

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值