Java种子填充算法代码 java种子填充算法代码怎么写

java实现画图工具颜色填充怎么实现或判断可以用扫描线种子算法
扫描线种子填充算法的基本过程如下Java种子填充算法代码:当给定种子点(x, y)时Java种子填充算法代码 , 首先分别向左和向右两个方向填充种子点所在扫描线上的位于给定区域的一个区段,同时记下这个区段的范围[xLeft, xRight],然后确定与这一区段相连通的上、下两条扫描线上位于给定区域内的区段,并依次保存下来 。反复这个过程,直到填充结束 。
扫描线种子填充算法可由下列四个步骤实现:
(1) 初始化一个空的栈用于存放种子点,将种子点(x, y)入栈Java种子填充算法代码;
(2) 判断栈是否为空,如果栈为空则结束算法,否则取出栈顶元素作为当前扫描线的种子点(x, y) , y是当前的扫描线;
(3) 从种子点(x, y)出发,沿当前扫描线向左、右两个方向填充 , 直到边界 。分别标记区段的左、右端点坐标为xLeft和xRight;
(4) 分别检查与当前扫描线相邻的y - 1和y1两条扫描线在区间[xLeft, xRight]中的像素,从xLeft开始向xRight方向搜索,若存在非边界且未填充的像素点,则找出这些相邻的像素点中最右边的一个,并将其作为种子点压入栈中,然后返回第(2)步;
java如何实现填充算法四向连通递归填充算法:
【Java种子填充算法代码 java种子填充算法代码怎么写】void BoundaryFill4(int x, int y, long FilledColor, long BoundaryColor)
{
long CurrentColor;
CurrentColor = GetPixelColor(x,y);
if (CurrentColor != BoundaryColorCurrentColor != 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);
}
}
该算法的优点是非常简单 , 缺点是需要大量栈空间来存储相邻的点 。
用队列实现种子填充算法的非递归一、种子填充算法(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-联通算法”才能得到正确的结果 。
1.1 注入填充算法(Flood Fill Algorithm)
注入填充算法不特别强调区域的边界,它只是从指定位置开始,将所有联通区域内某种指定颜色的点都替换成另一种颜色,从而实现填充效果 。注入填充算法能够实现颜色替换之类的功能,这在图像处理软件中都得到了广泛的应用 。注入填充算法的实现非常简单,核心就是递归和搜索,以下就是注入填充算法的一个实现:
164 void FloodSeedFill(int x, int y, int old_color, int new_color)
165 {
166if(GetPixelColor(x, y) == old_color)
167{
168SetPixelColor(x, y, new_color);
169for(int i = 0; iCOUNT_OF(direction_8); i)
170{
171FloodSeedFill(xdirection_8[i].x_offset,
172ydirection_8[i].y_offset, old_color, new_color);
173}
174}
175 }
for循环实现了向8个联通方向的递归搜索,秘密就在direction_8的定义:
15 typedef struct tagDIRECTION
16 {
17int x_offset;
18int y_offset;
19 }DIRECTION;
79 DIRECTION direction_8[] = { {-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1},{0, -1}, {-1, -1} };
这个是搜索类算法中常用的技巧 , 无需做太多说明,其实只要将其替换成如下direction_4的定义,就可以将算法改成4个联通方向填充算法:
80 DIRECTION direction_4[] = { {-1, 0}, {0, 1}, {1, 0}, {0, -1} };
图2就是应用本算法实现的“4-联通”和“8-联通”填充效果:
下面是一个4通向的种子填充算法 但是运行时老是堆栈溢出, 小弟急求大神相助啊.1、参数x、y由double类型改为int型 。
2、方法中x、y限定最小值、最大值 。
void seed(int x, int y, Color now, Color fill) {
Color currentcolor;
currentcolor=bmp-GetPixel(x,y);
if (currentcolor == now) {
bmp-SetPixel(x,y,fill);
if (xMAX_X) {
seed(x1, y, now, fill);
}
if (xMIN_X) {
seed(x - 1, y, now, fill);
}
if (xMAX_Y) {
seed(x, y1, now, fill);
}
if (xMIN_Y) {
seed(x, y - 1, now, fill);
}
}
}
Java种子填充算法代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java种子填充算法代码怎么写、Java种子填充算法代码的信息别忘了在本站进行查找喔 。

    推荐阅读