计算机图形学——区域填充算法

一、区域填充概念

区域:指已经表示成点阵形式的填充图形,是象素的集合。

区域填充:将区域内的一点(常称【种子点】)赋予给定颜色,然后将这种颜色扩展到整个区域内的过程。

区域填充算法要求区域是连通的,因为只有在连通区域中,才可能将种子点的颜色扩展到区域内的其它点。

1、区域有两种表示形式



1)内点表示:枚举出区域内部的所有象素,内部所有象素着同一个颜色,边界像素着与内部象素不同的颜色。
2)边界表示:枚举出区域外部的所有象素,边界上的所有象素着同一个颜色,内部像素着与边界象素不同的颜色。

2、区域分为

1)四向连通区域:从区域上一点出发可通过【上、下、左、右】四个方向移动的组合,在不越出区域的前提下,到达区域内的任意象素。
2)八向连通区域:从区域上一点出发可通过【上、下、左、右、左上、右上、左下、右下】八个方向移动的组合,在不越出区域的前提下,到达区域内的任意象素。

二、简单种子填充算法

基本思想:给定区域G一种子点(x, y),首先判断该点是否是区域内的一点,如果是,则将该点填充为新的颜色,然后将该点周围的四个点(四连通)或八个点(八连通)作为新的种子点进行同样的处理,通过这种扩散完成对整个区域的填充。

这里给出一个四连通的种子填充算法(区域填充递归算法),使用【栈结构】来实现
原理算法原理如下:种子像素入栈,当【栈非空】时重复如下三步:

 这里给出八连通的种子填充算法的代码:

void flood_fill_8(int[] pixels, int x, int y, int old_color, int new_color)
{
    if(x<w&&x>0&&y<h&&y>0)
    {
        if (pixels[y*w+x]==old_color)
        {
            pixels[y*w+x]== new_color);
            flood_fill_8(pixels, x,y+1,old_color,new_color);
            flood_fill_8(pixels, x,y-1,old_color,new_color);
            flood_fill_8(pixels, x-1,y,old_color,new_color);
            flood_fill_8(pixels, x+1,y,old_color,new_color);
            flood_fill_8(pixels, x+1,y+1,old_color,new_color);
            flood_fill_8(pixels, x+1,y-1,old_color,new_color);
            flood_fill_8(pixels, x-1,y+1,old_color,new_color);
            flood_fill_8(pixels, x-1,y-1,old_color,new_color);
        }
    }
}

简单种子填充算法的不足

 a)有些像素会多次入栈,降低算法效率,栈结构占空间
 b)递归执行,算法简单,但效率不高,区域内每一像素都要进/出栈,费时费内存
 c)改进算法,减少递归次数,提高效率

三、扫描线种子填充算法

基本思想:从给定的种子点开始,填充当前扫描线上种子点所在的一区段,然后确定与这一段相邻的上下两条扫描线上位于区域内的区段(需要填充的区间),从这些区间上各取一个种子点依次把它们存起来,作为下次填充的种子点。反复进行这过程,直到所保存的各区段都填充完毕。

猜你喜欢

转载自www.cnblogs.com/wkfvawl/p/11625323.html