一种改进的种子填充算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
214021 )
( 无锡市广播电视大学 , 江苏 无锡

要 : 在对种子填充算法进行分析和讨论的基础上 , 提出了一种改进的种子填 充算法 , 该改进的 种 子
填充算法无论是时间还是空间效率都优于传统算法。 关键词 : 种子填充算法 ; 区域填充 ; 栈 中图分类号 : TP391 文献标识码 : A 文章编号 : 1007- 4260 ( 2006 ) 01- 0055- 02
1 问题的提出
区域填充是 计算机图形 学的基本问 题之一 , 种子 填充算法是 区域填充 的一种重要 算法 , 它 广 泛 应 用于交互式绘图系统和数字图像处理中。递归种子填充算法是从填充区域内部的一点开始 , 并由此出 发找到区域内的所有像素。算法从给定种子 (x,y)开始 , 先检测该点的颜色 , 如果它与边界色和填充色都 不相同 , 就用填充色来填充该点 , 然后检测相邻位置 , 以确定它们是否是边界色 和填充色 , 若 不是 , 就采 用递归算法填充该相邻点。这个过程运行到检测完区域边界范围内的所有像素为止。有两种方法检测 , 本文采用四向连通区域填充。 相邻像素 : 四向连通区域填充和八向连通区域填充 递归种子填 充算法的优 点是算法简 单 , 易 于 实 现 , 也 可 以 填 充 带 有内孔的平 面区域。但是 这种算法需 要很大的存 储 空 间 以 实 现 栈 结 构 , 这是因为当 某一像素出 栈时 , 其周围 的所有 4 个像 素 不 管 是 否 已 被填充 , 都必须入栈。这样会导致一个像素要入栈多次。如图 1 所示 , 像素 ⑤ 周围有 8 个像素 , 当像素 ② 出栈时 , 按照四连通填充算法 , 要将 同理 , 当像素 ④ , ⑥ , ⑧ 出栈时也分别要把 ⑤ 压入堆栈 , 不 ⑤ 压入堆栈。 管它是否已在堆栈中 , 不管它是否已被填充 , 也不管它是否是边界 , 这 也就意味着入栈总数是所有像素个数总和的 4 倍。 由于栈中有如此多 的“ 冗余” 信息 , 所以采用这种算法进行填充时 , 所需要的栈空间很大 , 而且对同一个像素如此反复入栈和出栈 , 所花费的时间也很多。
2006 年 2 月
第 12 卷第 1 期
安庆师范学院学报 (
自然科学版 )
Feb.2006 Vol.12 No.1
J ourna l of Anqing Te a che rs Colle ge ( Na tura l S cie nce Edition )
一种改进的种子填充算法
胡 云1 , 李盘荣 2
为了验证以上改进算法在栈所用空间大小和进出栈次数方面的改进 , 我们在微机上进行了实验 , 该 实验是在 Pentium4 1.4GHz/256MB/Windows2000/VC++6.0 的环境下完成的。具体实验数据见表 1 , 由此 可以看出 : ( 1 ) 在栈所用空间大小上 , 改进算法的栈空间大小大概是传统种子填充算法的栈空间大小的 这说明改进算 20% 左右 ; ( 2 ) 从进出栈的次数来看 , 传统种子填充算法的进出栈次数是改进算法的 2 倍。 法无论在时间还是在空间上都优于原算法。 在改进的算法中 , 能够节约空间 , 尽量减少了像素点的检测 次数和入栈的总次数 , 同时可以加快填充速度 , 当填充区域很大时这种差别更明显。
One Impr oved Seed- filling Algor ithm
HU Yun, LI Pan- rong
(Wuxi Radio & TV University,Wuxi 214021,China) Abstr act: After the analysis and discussion of the tranditional seed- filling algorilms,tha authors put forword an improved seed - filling algorilm , which is superior to the old ones in increasing the efficiency of time or space. Key wor ds: seed filling algorithm; region filling;stack
收稿日期 : 2005- 07- 12 作者简介 : 胡云( 1978- ) , 男 , 江苏盐城人 , 无锡市广播电视大学教师 , 主要研究算法设计与数据库技术。
・ 56 ・
安庆师范学院学报 ( 自然科学版 )
2006 年
子是给定的 , 另外一个是根据给定的种子产生的。 如图 2 , 假定像素 ① 是给定的种子 , 则另外一个种子可 以取像素 ② 、 ③、 ④、 ⑤ 中的任何一个 , 当然要保证其在填充区域之内。 ( 3 ) 传统的四向连通区域填充取上、 下、 左、 右四个方向 , 而本文四向连通区域填充取左上、 左下、 右 上、 右下四个方向 , 如图 3 所示 , 种子 ① 填充 ○ 标识区域 , 种子 ② 填充 ● 标识区域。
! 1 !"#$%&’()*
2 Байду номын сангаас法的实现思想
传统种子填充算法不足之处主要有两点 : ( 1 ) 像素存在重复入栈 , ( 2 ) 栈所占空间很大。 其中像素的重复 入栈也是栈空间所占空间很大的一个重要原因。本文针对上述两点对算法进行改进。 ( 1 ) 在递归种子填充算法中 , 采用的是先入栈 , 出栈后再填充 , 即当 填充某点 时 , 不管它的 四连通点 是否已被填充 , 都要进入堆栈 , 这会导致很多的冗余像素点入栈。而本文算法采用的是先填充再入栈 , 在入栈之前要判断像素点是否已被填充 , 若已被填充才入栈 , 否则不予考虑。 这样将会减少入栈的冗余 像素 , 即每一个像素点只入栈一次。 ( 2 ) 传统种子填充算法采用的是用一个种子进行填充 , 而本文算法采用两个种子进行填充。 其中一个种
! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
表1
!"#$% !"#$ !"#$ 7651 1588 31015 6327 70088 14329 124843 25469 !"#$% !"#$ !"#$ 30978 15690 124866 62834 281522 141362 500914 251258
3 算法描述
改进算法的算法语言描述 (采用类 C 语言描述 )如下 :
seed(x1,y1)是最初给定的种子像素点,point 表示一个像素点 , 由 x1,y1 坐标组成 ; seed(x2,y2)是由种子 seed(x1,y1)产生的种子 , 由 x2,y2 坐标组成 ; InitStack()初始化栈 , 并使它为空 ; Push()是将一个像素点入栈 ; Pop()是出栈 , 返回类型为像素点 ; StackEmpty()是栈的判空函数 ; getpixel()返回指定像素点的颜色值; putpixel()设定指定像素点的颜色值为给定的颜色值; // 程序从下面开始 InitStack(); putpixel(seed(x1,y1)) ; putpixel(seed(x2,y2)) ; Push (seed(x1,y1)) ; Push (seed(x2,y2)) ; while(! StackEmpty()) { point=Pop(); if(point 的左上一点不为填充色也不为边界色) { putpixel(point 的左上一点 );Push(point 的左上一点 );} if(point 的左下一点不为填充色也不为边界色) { putpixel(point 的左下一点 ); Push (point 的左下一点 );} !"# !" if(point 的右上一点不为填充色也不为边界色) 50 { putpixel(point 的右上一点 ); Push (point 的右上一点 );} 100 150 if(point 的右下一点不为填充色也不为边界色) 200 { putpixel(point 的右下一点 ); Push (point 的右下一点 );} } 4 算法比较
[参考文献 ]
[1]
陈元琰 , 陈洪波 . 一种基于链队列的种子填充法 [J]. 广西师范大学学报 : 自然科学版 , 2003 , 21 ( 3 ) : 30- 33. 计算机图形学的算法基础 (第 2 版 )[M]﹒ 北京 : 机械工业出版社 , 2002 : ﹒ [2] (美 )David F.Rogers. ﹒ 99- 105.
相关文档
最新文档