计算机图形学——区域填充算法
一、区域填充概念
比奇中文网 https://m.biqi.org/
区域:指已经表示成点阵形式的填充图形,是象素的集合。
区域填充:将区域内的一点(常称【种子点】)赋予给定颜色,然后将这种颜色扩展到整个区域内的过程。
区域填充算法要求区域是连通的,因为只有在连通区域中,才可能将种子点的颜色扩展到区域内的其它点。
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)改进算法,减少递归次数,提高效率
三、扫描线种子填充算法
基本思想
从给定的种子点开始,填充当前扫描线上种子点所在的一区段,然后确定与这一段相邻的上下两条扫描线上位于区域内的区段(需要填充的区间),从这些区间上各取一个种子点依次把它们存起来,作为下次填充的种子点。反复进行这过程,直到所保存的各区段都填充完毕。
算法步骤
步骤 1:(初始化)将算法设置的堆栈置为空。将给定的种子点(x, y)压入堆栈
步骤 2:(出栈)如果堆栈为空,算法结束;否则取栈顶元素(x, y)作为种子点
步骤 3:(区段填充)从种子点(x, y)开始,沿纵坐标为y的当前扫描线向左右两个方向逐个像素用新的颜色值进行填充,直到边界为止即象素颜色等于边界色。设区间两边界的横坐标分别为xleft 和xright。
步骤4:在与当前扫描线相邻的上下两条扫描线上,以区间[xleft, xright]为搜索范围,求出需要填充的各小区间,把各小区间中最右边的点并作为种子点压入堆栈,转到步骤2。
算法的关键原则
1)搜索原则:
从前一个填充的区间(边界之间的范围xleft, xright)作为后一条扫描线种子点寻找的范围。
2)填充原则:
从种子点往左,右填,填到边界
实例
上述算法的描述过于抽象,直接看演示
算法代码
Stack stack=new Stack();//堆栈 pixel_stack初始化 Stack.push (point); //(x,y)是给定的种子像素 while (!stack.empty()) { p=(Point)(stack.pop());//出栈,从堆栈中取一像素作种子像素 x=p.x; y=p.y; savex=x;//保存种子点的横坐标x的值 while (pixels [y*w+x]!= boundary_color) { pixels [y*w+x]= new_color; x++; } //从种子像素开始向右填充到边界 xright=x–1; //保存线段的右端点 x=savex–1; //设定种子点往左填充的起点 while (pixels [y*w+x]!= boundary_color) { pixels [y*w+x] = new_color; x=x–1; } //从种子像素开始向左填充到边界,以上两步完成区间填充。 xleft=x+1; //保存线段的左端点,加1是因为前面 循环时多减一次 x=xleft; //起点是上次的左端点 y=y+1; //开始处理上一条扫描线 while(x<=xright) //在上一条扫描线上检查是否需要填充 { span_need_fill=false; //先设定为不需要填充 while (pixels [y*w+x] ==old_color&&x<=xright ) { //待填充的线段 span_need_fill=true; //发现有旧象素,需要填充 x=x+1; } //待填充的线段处理完,即遇到边界色,!=old_color跳出 if (span_need_fill) //如果区间需要填充,则将其右端点作为种子点压进堆栈 { p=new Point(x-1,y); stack.push (p); //进栈 span_need_fill=false; } //继续向右检查以防有遗漏 while (pixels [y*w+x] !=old_color &&x<=xright ) x=x+1; } //在上一条扫描线上检查完 x=xleft; y=y–2; //形成下一条扫描线的y值 //在下一条扫描线上从左向右检查位于区间[xleft,xright]上的像素,其方法与在上一条扫描线上检查的情况完全一样,见书。 }//出栈完
四、多边形的扫描转换与区域填充算法小结
上一篇博客讲述了多边形的扫描转换 ,这里将多边形扫描转换和区域填充算法进行比较总结。
基本思想不同
多边形扫描转换是指将多边形的顶点表示转化为点阵表示
区域填充只改变填充颜色,不改变区域表示方式
基本条件不同
在区域填充算法中,要求给定区域内的一点作为种子点,然后从这一点根据连通性将新的颜色扩展到整个区域。
扫描转换多边形是从多边形的边界(顶点)信息出发,利用多种形式的连贯性进行填充的。
扫描转换区域填充的核心是知道多边形的边界,要得到多边形内部的像素集,有很多种办法。其中扫描线算法是利用一套特殊的数据结构,避免求交,然后一条条扫描线确定。
区域填充条件更强一些,不但要知道边界,而且要知道区域内的一点,可以利用四连通或八连通区域不断向外扩展。
填充一个定义的区域的选择包括:
a)选择实区域颜色或图案填充方式
b)选择某种颜色和图案
这些填充选择可以应用于多边形区域或用曲线边界定义的区域;此外,区域可用多种画笔、颜色和透明度参数来绘制
计算机图形学——区域填充算法相关推荐
- GIS地图界面和计算机图形学填充算法
一 GIS地图界面 GIS程序最常见的界面就是,不同区域被边界隔开,填充为不同的颜色: 如下三个:是超图iServer自带: 京津地区土地利用现状,京津地区人口分布,京津地区地貌分布:用于学习是很好资 ...
- 计算机图形学算法详解,计算机图形学裁剪算法详解
<计算机图形学裁剪算法详解>由会员分享,可在线阅读,更多相关<计算机图形学裁剪算法详解(10页珍藏版)>请在人人文库网上搜索. 1.裁剪算法详解在使用计算机处理图形信息时,计算 ...
- 计算机图形学常见算法原理,计算机图形学常用算法及代码大全
<计算机图形学常用算法及代码大全>由会员分享,可在线阅读,更多相关<计算机图形学常用算法及代码大全(41页珍藏版)>请在人人文库网上搜索. 1.2.1.1 生成直线的DDA算法 ...
- 计算机图形学要学什么语言,计算机图形学:算法与实现
计算机图形学:算法与实现 语音 编辑 锁定 讨论 上传视频 <计算机图形学:算法与实现>一书的出版社是清华大学出版社,出版时间是第1版 (2012年1月1日). 书 名 计算机图形学 ...
- 计算机图形学直线算法论文,《计算机图形学》中直线生成算法的教学心得
摘要:<计算机图形学>是计算机科学与技术专业一门重要的专业课,其中直线生成算法是教学重点之一.该文通过分析几种直线生成算法的特点,阐述了理论教学和实践教学的重点和难点,总结了教学的体会和心 ...
- 计算机图形学 裁剪算法源代码,OpenGL计算机图形学梁友栋裁剪算法实验代码及运行结果.doc...
OpenGL计算机图形学梁友栋裁剪算法实验代码及运行结果.doc (10页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分 .<计算 ...
- 计算机图形学+简单算法实现,《计算机图形学》课程设计-简单几何体的消隐算法实现.doc...
PAGE PAGE 18 PAGE 18 课程名称:<计算机图形学> 论文题目:简单几何体的消隐算法实现 教学部: 年 级: 班 级: 学 号: 姓 名: 简单几何体的消隐算法实现 摘 要 ...
- 七巧板复原算法——计算机图形学基本算法之一, 点在多边形内部的判断
注:此时我已经完成了一个演示版本,但是为了文章的渐进性,我将把开发过程一步步的写出来,用来记录. 本实验代码用到的图形学关系和算法列举如下: 基本计算机图形学关系和算法 1.点在多边形内部的 点在多边 ...
- 计算机图形学曲线算法代码,计算机图形学自由曲线绘制算法.doc
计算机图形学自由曲线绘制算法 宁夏师范学院数学与计算机科学学院 <>实验报告 实验序号: 实验项目名称: 学 号姓 名专业.班实验地点指导教师时 间.实验内容与步骤 1 //TestVie ...
最新文章
- Java 常见内存溢出异常与代码实现
- 全境封锁UI游戏设计指南
- 分區策略與數據傾斜處理策略的區別
- C语言 有符号字符型输出 面试题
- softmax函数与交叉熵损失函数
- ajax传递json对象 php,ajax 和 php 相互传递 JSON对象(转载)
- Vue项目开发中的点滴积累系列文章
- 2020最新android教程,Android教程2020
- Unity中UI框架初试探
- 多目标优化中常用的进化算法简介及原论文(最全概括)
- 【BP回归预测】基于matlab鲸鱼算法优化BP神经网络回归预测(多输入单输出)【含Matlab源码 1554期】
- 反函数抽样(包括离散的)
- 为什么使用计算机网络连接,为什么无线网络连接上却不能上网,教您电脑连上无线网却不能上网怎么办...
- libreCAD源码阅读笔记3
- 小a与星际探索 线性基算法
- 中文编程书籍资料一览表
- pat 1027. Colors in Mars (20)
- 定义表格标签(table)
- python修改列表元素_python 3 基础之列表和列表添加元素、修改元素、查找元素、删除元素、排序、嵌套、取最值...
- CSP-S2022T1题解