区域填充算法

时间:2024-04-04 09:15:53

填充原理

种子填充算法是从区域内任一个种子像素位置开始,由内向外将填充色扩散到整个多边形区域的填充过程。种子填充算法突出的优点是能对具有任意复杂闭合边界的区域进行填充。

四邻接点与八邻接点

区域填充算法

四连通域与八连通域

区域填充算法
区域填充算法

种子填充算法

算法定义

从种子像素点开始,使用四邻接点方式搜索下一像素点的填充算法称为四邻接点填充算法。从种子像素点开始,使用八邻接点方式搜索下一像素点的填充算法称为八邻接点填充算法。八邻接点填充算法的设计和四邻接点填充算法基本相似,只要把搜索方式由四邻接点修改为八邻接点即可。

算法原理

种子填充算法一般要求区域边界色和填充色不同,输入参数只有种子坐标位置和填充颜色。种子填充算法一般需要使用堆栈数据结构来实现。
先将种子像素入栈,种子像素为栈底像素,如果栈不为空,执行如下3步操作:

  1. 栈顶像素出栈;
  2. 按填充颜色绘制出栈像素
  3. 按左、右、下、上(或左、左上、上、右上、右、右下、下、左下)顺序搜索与出栈像素相邻的四(八)个像素,若该像素的颜色不是边界色并且未置成填充色,则把该像素入栈;否则丢弃该像素。

该算法也可以填充有孔区域。
缺点:递归执行,算法简单,但效率不高,区域内每一象素都引起一次递归,进/出栈,费时费内存。
改进算法,减少递归次数,提高效率。解决方法是用扫描线填充算法

扫描线算法

目标:减少递归层次
算法思想:在任意不间断区间中只取一个种子像素(不间断区间指在一条扫描线上一组相邻元素),填充当前扫描线上的该段区间;然后确定与这一区段相邻的上下两条扫描线上位于区域内的区段,并依次把它们保存起来,反复进行这个过程,直到所保存的个区段都填充完毕。

扫描线种子填充算法

算法原理为:先将种子像素入栈,种子像素为栈底像素,如果栈不为空,执行如下4步操作。
1. 栈顶像素出栈。
2. 沿扫描线对出栈像素的左右像素进行填充,直至遇到边界像素为止。即每出栈一个像素,就对区域内包含该像素的整个连续区间进行填充。
3. 同时记录该区间,将区间最左端像素记为xleft,最右端像素记为xright。
4. 在区间〔xleft,xright〕中检查与当前扫描线相邻的上下两条扫描线的有关像素是否全为边界像素或已填充像素,若存在非边界且未填充的像素,则把未填充区间的最右端像素取作种子像素入栈。