算法系列(十二) 多边形区域填充算法--递归种子填充算法

平面区域填充算法是计算机图形学领域的一个很重要的算法,区域填充即给出一个区域的边界(也 可以是没有边界,只是给出指定颜色),要求将边界范围内的所有象素单元都修改成指定的颜色(也 可能是图案填充)。区域填充中最常用的是多边形填色,本文中我们就讨论几种多边形区域填充算法 。

一、种子填充算法(Seed Filling)

如果要填充的区域是以图像元数据方式给出的 ,通常使用种子填充算法(Seed Filling)进行区域填充。种子填充算法需要给出图像数据的区域, 以及区域内的一个点,这种算法比较适合人机交互方式进行的图像填充操作,不适合计算机自动处理 和判断填色。根据对图像区域边界定义方式以及对点的颜色修改方式,种子填充又可细分为几类,比 如注入填充算法(Flood Fill Algorithm)、边界填充算法(Boundary Fill Algorithm)以及为减少 递归和压栈次数而改进的扫描线种子填充算法等等。

所有种子填充算法的核心其实就是一个递 归算法,都是从指定的种子点开始,向各个方向上搜索,逐个像素进行处理,直到遇到边界,各种种 子填充算法只是在处理颜色和边界的方式上有所不同。在开始介绍种子填充算法之前,首先也介绍两 个概念,就是“4-联通算法”和“8-联通算法”。既然是搜索就涉及到搜索的方向问题,从区域内任 意一点出发,如果只是通过上、下、左、右四个方向搜索到达区域内的任意像素,则用这种方法填充 的区域就称为四连通域,这种填充方法就称为“4-联通算法”。如果从区域内任意一点出发,通过上 、下、左、右、左上、左下、右上和右下全部八个方向到达区域内的任意像素,则这种方法填充的区 域就称为八连通域,这种填充方法就称为“8-联通算法”。如图1(a)所示,假设中心的蓝色点是当 前处理的点,如果是“4-联通算法”,则只搜索处理周围蓝色标识的四个点,如果是“8-联通算法” 则除了处理上、下、左、右四个蓝色标识的点,还搜索处理四个红色标识的点。两种搜索算法的填充 效果分别如如图1(b)和图1(c)所示,假如都是从黄色点开始填充,则“4-联通算法”如图1(b) 所示只搜索填充左下角的区域,而“8-联通算法”则如图1(c)所示,将左下角和右上角的区域都填 充了。

图(1) “4-联通”和“8-联通”填充效果

并不能仅仅因为图1的填 充效果就认为“8-联通算法”一定比“4-联通算法”好,应该根据应用环境和实际的需求选择联通搜 索方式,在很多情况下,只有“4-联通算法”才能得到正确的结果。

时间: 2024-10-31 04:47:35

算法系列(十二) 多边形区域填充算法--递归种子填充算法的相关文章

算法系列(十二) 多边形区域填充算法--扫描线种子填充算法

1.3扫描线种子填充算法 1.1和1.2节介绍的两种种子填充算法的优点是非常简单,缺点是使 用了递归算法,这不但需要大量栈空间来存储相邻的点,而且效率不高.为了减少算法中的递归调用 ,节省栈空间的使用,人们提出了很多改进算法,其中一种就是扫描线种子填充算法.扫描线种子填 充算法不再采用递归的方式处理"4-联通"和"8-联通"的相邻点,而是通过沿水平扫描线填充像素 段,一段一段地来处理"4-联通"和"8-联通"的相邻点.这样算法

[算法系列之二十四]后缀树(Suffix Tree)

之前有篇文章([算法系列之二十]字典树(Trie))我们详细的介绍了字典树.有了这些基础我们就能更好的理解后缀树了. 一 引言 模式匹配问题 给定一个文本text[0-n-1], 和一个模式串 pattern[0-m-1],写一个函数 search(char pattern[], char text[]), 打印出pattern在text中出现的所有位置(n > m). 这个问题已经有两个经典的算法:KMP算法 ,有限自动机,前者是对模式串pattern做预处理,后者是对待查证文本text做预处

Silverlight & Blend动画设计系列十二

Silverlight & Blend动画设计系列十二:三角函数(Trigonometry)动画之自由旋转(Free-form rotation) 说到对象的旋转,或许就会联想到对象角度的概念.对象的旋转实现实际上就是利用对象 的角度改变来实现的位置变换,在<Silverlight & Blend动画设计系列二:旋转动画( RotateTransform)>一文中有对对象的不同角度变换的实现介绍,本篇要介绍的自由旋转( Free-form rotation)将借助<Fun

xen虚拟化实战系列(十二)之xen虚拟机高可用之在线迁移

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://koumm.blog.51cto.com/703525/1286643 xen虚拟化实战系列文章列表 xen虚拟化实战系列(一)之xen虚拟化环境安装xen虚拟化实战系列(二)之xen虚拟机安装xen虚拟化实战系列(三)之xen虚拟机复制xen虚拟化实战系列(四)之xen虚拟机扩展磁盘空间一法xen虚拟化实战系列(五)之xen虚拟机扩展磁盘空间再一法xen虚拟化实战系列(六)之x

opengl-请问谁知道怎么用c语言或者c++来实现扫描线种子填充算法的代码!

问题描述 请问谁知道怎么用c语言或者c++来实现扫描线种子填充算法的代码! 1C 请问谁知道怎么用c语言或者c++来实现扫描线种子填充算法的代码!不用graphics.h的,而是用glut的,急,在线等! 解决方案 opencv,或者opengl里面应该有哇 解决方案二: 参考:http://blog.163.com/liuguangqian_866/blog/static/43036601200831885421980/ 解决方案三: http://blog.csdn.net/trent198

算法系列(二十) 计算中国农历(二)

所谓的"天文算法",就是利用经典力学定律推导行星运转轨道,对任意时刻的行星位置进行精确计 算,从而获得某种天文现象发生时的时间,比如日月合朔这一天文现象就是太阳和月亮的地心黄经(视黄 经)差为0的那一瞬间.能够计算任意时刻行星位置的一套理论就被称为星历表,比较著名的星历表有美 国国家航空航天局下属的喷气推进实验室发布的DE系列星历表,还有瑞士天文台在DE406基础上拓展的瑞 士星历表等等.根据行星运行轨道直接计算行星位置通常不是很方便,更何况大多数民用天文计算用不上 那么多精确的轨道参

[算法系列之二十六]字符串匹配之KMP算法

一 简介 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法).KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的. 二 基于部分匹配表的KMP算法 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含搜索串"ABCDABD"? 步骤1:字符串"BBC ABC

算法系列(二十) 计算中国农历(一)

世界各国的日历都是以天为最小单位,但是关于年和月的算法却各不相同,大致可以分为三类: 阳历--以天文年作为日历的主要周期,例如:中国公历(格里历) 阴历--以天文月作为日 历的主要周期,例如:伊斯兰历 阴阳历--以天文年和天文月作为日历的主要周期,例如:中国农 历 我国古人很早就开始关注天象,定昼夜交替为"日",月轮盈亏为"月",寒暑交替为"年" ,在总结日月变化规律的基础上制定了兼有阴历月和阳历年性质的历法,称为中国农历.本文将介绍中国 农历的

[算法系列之二十]字典树(Trie)

一 概述 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计. 二 优点 利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希表高. 三 性质 (1)根节点不包含字符,除根节点外每一个节点都只包含一个字符: (2)从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串: (3)每个节点的所有子节点包含的字符都不相同. 单词列表为"apps&