种子填充算法
种子填充算法又称为边界填充算法。其基本思想是:从多边形区域的一个内点开始,由内向外用给定的颜色画点直到边界为止。如果边界是以一种颜色指定的,则种子填充算法可逐个像素地处理直到遇到边界颜色为止。
种子填充算法常用四连通域和八连通域技术进行填充操作。
从区域内任意一点出发,通过上、下、左、右四个方向到达区域内的任意像素。用这种方法填充的区域就称为四连通域;这种填充方法称为四向连通算法。
从区域内任意一点出发,通过上、下、左、右、左上、左下、右上和右下八个方向到达区域内的任意像素。用这种方法填充的区域就称为八连通域;这种填充方法称为八向连通算法。
一般来说,八向连通算法可以填充四向连通区域,而四向连通算法有时不能填充八向连通区域。例如,八向连通填充算法能够正确填充如图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);
}
}
上述算法的优点是非常简单,缺点是需要大量栈空间来存储相邻的点。一个改进的方法就是:通过沿扫描线填充水平像素段,来处理四连通或八连通相邻点,这样就仅仅只需要将每个水平像素段的起始位置压入栈,而不需要将当前位置周围尚未处理的相邻像素都压入栈,从而可以节省大量的栈空间。
以上原文引自:
http://comic.sjtu.edu.cn/thucs/GD_jsj_027y/text/chapter2/section5/part01/l1_bq2.htm#2
====================================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];
}
}
分享到:
相关推荐
这是计算机图形学实验课用的种子填充算法,希望大家能够有用
图形学种子填充算法 seedfilling(x+1,y, fill_color, boundary_color);
图形学中的种子填充算法,很实用!对于学习图形学,理解填充算法有参考价值。
图形学种子填充算法 C语言实现,具有参考价值
计算机图形学的种子填充算法.........
图形学,种子填充算法,活性边表填充算法,图案填充算法,MFC工程
种子填充算法,自己写的,希望对大家有用 // 种子法View.cpp : implementation of the CMyView class // #include "stdafx.h" #include "种子法.h" #include "种子法Doc.h" #include "种子法View.h" #ifdef _...
实习作业,画线画圆种子填充算法在MFC工程中的实现,部分代码有引用
计算机图形学 边界定义的8连通区域的种子填充算法 计算机图形学 边界定义的8连通区域的种子填充算法 计算机图形学 边界定义的8连通区域的种子填充算法
图形学-种子填充算法-C++
计算机图形学 扫描线种子填充算法实现 1、初始化堆栈。 2、种子压入堆栈。 3、while(堆栈非空) { (1)从堆栈弹出种子象素。 (2)如果种子象素尚未填充,则: a.求出种子区段:xleft、xright; b.填充...
种子填充算法实现(计算机图形学)版权归太原工业学院研究所所有
扫描下种子填充算法扫描下种子填充算法扫描下种子填充算法
用VC++,采用种子填充算法来填充多边形,图形可进行改变
在 pycharm 加 pyqt5环境中开发,python实现种子填充算法。 有优美的 UI界面
VC++6.0上运行 我们的图形学实验 完整的直接打开工作区间 可以看到
图形学填充作业,第一步在视图窗口画任意封闭图形,选择颜色,种子点,进行填充
实现封闭区域的沿水平扫描线段的种子填充 安装配置GLUT库: OpenGL提供了一系列的辅助函数,用于简化Windows操作系统的窗口操作,使我们能把注意力集中到图形编程上,这次试验的程序就采用这些辅助函数。 将压缩包...