种子填充算法

种子填充算法

种子填充算法又称为边界填充算法。其基本思想是:从多边形区域的一个内点开始,由内向外用给定的颜色画点直到边界为止。如果边界是以一种颜色指定的,则种子填充算法可逐个像素地处理直到遇到边界颜色为止。

种子填充算法常用四连通域和八连通域技术进行填充操作。

从区域内任意一点出发,通过上、下、左、右四个方向到达区域内的任意像素。用这种方法填充的区域就称为四连通域;这种填充方法称为四向连通算法。

从区域内任意一点出发,通过上、下、左、右、左上、左下、右上和右下八个方向到达区域内的任意像素。用这种方法填充的区域就称为八连通域;这种填充方法称为八向连通算法。

一般来说,八向连通算法可以填充四向连通区域,而四向连通算法有时不能填充八向连通区域。例如,八向连通填充算法能够正确填充如图2.4a所示的区域的内部,而四向连通填充算法只能完成如图2.4b的部分填充。

图2.4 四向连通填充算法

a) 连通域及其内点 b) 填充四连通域

四向连通填充算法:

a) 种子像素压入栈中;

b) 如果栈为空,则转e);否则转c);

c) 弹出一个像素,并将该像素置成填充色;并判断该像素相邻的四连通像素是否为边界色或已经置成多边形的填充色,若不是,则将该像素压入栈;

d) 转b);

e) 结束。

四向连通填充方法可以用递归函数实现如下:

算法2.3 四向连通递归填充算法:

void BoundaryFill4(int x, int y, long FilledColor, long BoundaryColor)

{

long CurrentColor;

CurrentColor = GetPixelColor(x,y);

if (CurrentColor != BoundaryColor && CurrentColor != FilledColor)

{

SetColor(FilledColor);

SetPixel (x,y);

BoundaryFill4(x+1, y, FilledColor, BoundaryColor);

BoundaryFill4(x-1, y, FilledColor, BoundaryColor);

BoundaryFill4(x, y+1, FilledColor, BoundaryColor);

BoundaryFill4(x, y-1, FilledColor, BoundaryColor);

}

}

上 述算法的优点是非常简单,缺点是需要大量栈空间来存储相邻的点。一个改进的方法就是:通过沿扫描线填充水平像素段,来处理四连通或八连通相邻点,这样就仅 仅只需要将每个水平像素段的起始位置压入栈,而不需要将当前位置周围尚未处理的相邻像素都压入栈,从而可以节省大量的栈空间。

====================================J2ME模拟================================

/**

* 填充算法

* @author comic.sjtu.edu.cn

*

*/

public class FillAlgorithm {

private int[] RGBdata;

private int imgW;

private int imgH;

public FillAlgorithm(Image img){

imgW = img.getWidth();

imgH = img.getHeight();

RGBdata = new int[imgW*imgH];

img.getRGB(RGBdata, 0, imgW, 0, 0, imgW, imgH);

}

/**

* 种子填充算法(4向连通)

* @param x 填充区域内一点的X坐标

* @param y 填充区域内一点的Y坐标

* @param FilledColor    要填充的颜色

* @param BoundaryColor 边界的颜色

*/

public void BoundaryFill4(int x, int y, int FilledColor, int BoundaryColor){

int CurrentColor;

CurrentColor = GetPixelColor(x,y);

if (CurrentColor != BoundaryColor && CurrentColor != FilledColor)

{

SetPixelColor(x,y,FilledColor);

BoundaryFill4(x+1, y, FilledColor, BoundaryColor);

BoundaryFill4(x-1, y, FilledColor, BoundaryColor);

BoundaryFill4(x, y+1, FilledColor, BoundaryColor);

BoundaryFill4(x, y-1, FilledColor, BoundaryColor);

}

}

/**

* 种子填充算法(8向连通) (72x72的都爆内存了)

* @param x 填充区域内一点的X坐标

* @param y 填充区域内一点的Y坐标

* @param FilledColor    要填充的颜色

* @param BoundaryColor 边界的颜色

*/

public void BoundaryFill8(int x, int y, int FilledColor, int BoundaryColor){

int CurrentColor;

CurrentColor = GetPixelColor(x,y);

if (CurrentColor != BoundaryColor && CurrentColor != FilledColor)

{

SetPixelColor(x,y,FilledColor);

BoundaryFill8(x+1, y, FilledColor, BoundaryColor);

BoundaryFill8(x-1, y, FilledColor, BoundaryColor);

BoundaryFill8(x, y+1, FilledColor, BoundaryColor);

BoundaryFill8(x, y-1, FilledColor, BoundaryColor);

BoundaryFill8(x+1, y-1, FilledColor, BoundaryColor);

BoundaryFill8(x-1, y-1, FilledColor, BoundaryColor);

BoundaryFill8(x+1, y+1, FilledColor, BoundaryColor);

BoundaryFill8(x-1, y+1, FilledColor, BoundaryColor);

}

}

public Image getImage(boolean alphas){

return Image.createRGBImage(RGBdata, imgW, imgH, alphas);

}

public int[] getRgbData(){

return RGBdata;

}

private void SetPixelColor(int x, int y, int filledColor) {

if(x<0 || x>=imgW || y<0 || y>=imgH)

return;

RGBdata[y*imgW+x] = filledColor;

}

private int GetPixelColor(int x, int y) {

if(x<0 || x>=imgW || y<0 || y>=imgH)

return -1;

return RGBdata[y*imgW+x];

}

}

java 种子填充算法_种子填充算法相关推荐

  1. 【Matlab】智能优化算法_蜻蜓优化算法DA

    [Matlab]智能优化算法_蜻蜓优化算法DA 1.背景介绍 2.灵感 3.公式推导 3.1 勘探和开发操作 4.算法流程图 5.文件结构 6.伪代码 7.详细代码及注释 7.1 DA.m 7.2 d ...

  2. 【Matlab】智能优化算法_蚁狮优化算法ALO

    [Matlab]智能优化算法_蚁狮优化算法ALO 1.背景介绍 2.基本思想 3.公式推导 3.1 ALO算法的运算符 3.2 蚂蚁的随机游动 3.3 困在蚂蚁坑里 3.4 修建陷阱 3.5 蚂蚁划向 ...

  3. 【Matlab】智能优化算法_灰狼优化算法GWO

    [Matlab]智能优化算法_灰狼优化算法GWO 1.背景介绍 2.基本思想 2.1 等级制度 2.2 狩猎方式 3.公式推导 3.1 社会等级制度 3.2 包围猎物 3.3 包围猎物 3.4 攻击猎 ...

  4. java 最少使用(lru)置换算法_缓存置换算法 - LRU算法

    LRU算法 1 原理 对于在内存中并且不被使用的数据块就是LRU,这类数据需要从内存中删除,以腾出空间来存储常用的数据. LRU算法(Least Recently Used,最近最少使用),是内存管理 ...

  5. java 投票算法_摩尔投票算法 - woshixin的个人空间 - OSCHINA - 中文开源技术交流社区...

    摩尔投票算法(Moore majority vote algorithm) 这个在wiki的介绍在https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_m ...

  6. java 排名算法_排行榜的算法

    好久不来博客园了,前几天更新个人状态时,也把"技术博客"四个字改成了"荒废已久的博客". 好久不总结自己的工作和学习了,怎么说也过不去,就来这写一篇浅显的文章, ...

  7. 机器学习 线性回归算法_探索机器学习算法简单线性回归

    机器学习 线性回归算法 As we dive into the world of Machine Learning and Data Science, one of the easiest and f ...

  8. 时间序列分类算法_时间序列分类算法简介

    时间序列分类算法 A common task for time series machine learning is classification. Given a set of time serie ...

  9. 垃圾回收算法_垃圾回收算法有哪些

    垃圾检测通常通过建立一个根对象的集合以及建立一个从这些根对象开始能够触及的对象集合来实现.如果正在执行的程序可以访问到根对象和某个对象之间存在引用路径,这个对象就是可触及的.对于程序来说,根对象总是可 ...

  10. prim算法_数据结构与算法

    根据MOOC上课程总结,文章目录为: 一.引论 数据结构的基本概念 数据的逻辑结构和存储结构 算法及其时间复杂度 时间复杂度及应用 二.线性表 线性表的概念及顺序存储 单链表的概念及其基本操作 建立单 ...

最新文章

  1. 开启Mac充电提示音
  2. java 静态方法重写_Java 类中可以覆盖静态方法吗?
  3. Proof-of-Stake (POS) outperforms Bitcoin’s Proof-of-Work (POW)
  4. node n 切换node版本失败_记一次 node-sass@4.x 安装失败
  5. 单体模式singleton
  6. HDU - 3081 Marriage Match II(二分+并查集+最大流/匈牙利删边)
  7. CCPC-Wannafly Winter Camp Day8 (Div2, onsite) A 题 Aqours (精巧的树形DP)
  8. jsp+js实现二级级联
  9. 三次握手和四次挥手图解_TCP三次握手和四次挥手详解
  10. HTML5 基础知识
  11. IntelliJ IDEA 创建Java Web项目
  12. Android 提高 5 SurfaceView绘图容器的基本使用
  13. securecrt批量登录linux,SecureCRT批量配置使用会话key
  14. AirDisk创建网盘
  15. 维宏v8系列卡win7/win10 64位驱动
  16. QQ群下载解除限速小技巧【提高千倍不止】【无需会员】
  17. 在知乎上看到的一个关于Linux运维工程师必知的几点,希望对有志于从事运维工作的你有帮助
  18. Android 接入google pay
  19. 冒泡排序保姆级心得分享
  20. 如何將人臉變漂亮(三)

热门文章

  1. python如何实现简单的宠物管理系统
  2. 黑马程序员Python教程的代码--植物大战僵尸游戏代码
  3. cnn程序流程图_深度学习(一)——CNN算法流程
  4. ARM指令集(数据处理指令)
  5. python2.7详细安装教程_python2.7安装图文教程
  6. LabVIEW安装多个NI软件产品时的安装顺序
  7. cgi一键还原 linux分区,cgi plus一键备份恢复工具
  8. 卸下重负,苏宁易购重组价值逻辑
  9. json数据类型基本转换
  10. 基于JavaWeb实现网上图书商城系统