点填充算法
Ⅰ 比较边界填充算法和泛填充算法的异同
如果是用线填充,程序如下。如果是用点填充需要用到堆栈和系统底层库函数或者用画点函数putpixel()。
下面实例是用扫描线填充长方形,开始要输入长方形的左上顶点坐标和右下顶点坐标以及填充扫描线的间距(>=1),如果间距等于1,就是完全填充(实填充)。
一个完整的c程序如下,程序在win-tc和tc2.0下都调试通过。
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<graphics.h>
void draw(int x1,int y1,int x2,int y2,int delta)
{int nx1,ny1,nx2,ny2; <br/>nx1=x1,ny1=y2-delta,nx2=x1+delta,ny2=y2; <br/>while((ny1>=y1)&&(nx2<=x2)) <br/>{line(nx1,ny1,nx2,ny2); <br/>ny1-=delta; <br/>nx2+=delta; <br/>}
if(nx2>x2)
{ny2-=nx2-x2; <br/>nx2=x2; <br/>while(ny1>y1) <br/>{line(nx1,ny1,nx2,ny2); <br/>ny1-=delta; <br/>ny2-=delta; <br/>}
nx1+=y1-ny1;
ny1=y1;
while(nx1<x2)
{line(nx1,ny1,nx2,ny2); <br/>nx1+=delta; <br/>ny2-=delta; <br/>}
}
else
{nx1+=y1-ny1; <br/>ny1=y1; <br/>while(nx2<x2) <br/>{line(nx1,ny1,nx2,ny2); <br/>nx2+=delta; <br/>nx1+=delta; <br/>}
ny2-=nx2-x2;
nx2=x2;
while(ny2>y1)
{line(nx1,ny1,nx2,ny2); <br/>ny2-=delta; <br/>nx1+=delta; <br/>}
}
}
int main(void)
{int x1,y1,y2,x2,delta; <br/>int driver=DETECT,mode; <br/>printf("Please input lefttop(x1,y1) and rightbottom(x2,y2) of rectangle and delta:\n"); <br/>scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&delta); <br/>initgraph (&driver,&mode,"C:\\TC"); /*这里*/<br/>rectangle(x1,y1,x2,y2); <br/>draw(x1,y1,x2,y2,delta); <br/>gotoxy(1,1); <br/>printf("Press any key to exit!"); <br/>getch()(); <br/>closegraph(); <br/>return 0; <br/>}
说明:将main()函数中的initgraph(&gdriver,&gmode,"");中的""更改为你的TC安装目录,一般tc必须安装在c盘根目录下,所以就是initgraph(&gdriver,&gmode,"C:\\TC");如你的TC安装目录为D盘的Tools目录下的TC目录,那么上述语句改为:
initgraph(&gdriver,&gmode,"D:\\Tools\\TC");
同时保证在D:\\Tools\\TC目录里有文件EGAVGA.BGI,万一不行,将本程序复制到你的TC安装目录下再运行。
Ⅱ 用队列实现种子填充算法的非递归
一、种子填充算法(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 {
166 if(GetPixelColor(x, y) == old_color)
167 {
168 SetPixelColor(x, y, new_color);
169 for(int i = 0; i < COUNT_OF(direction_8); i++)
170 {
171 FloodSeedFill(x + direction_8[i].x_offset,
172 y + direction_8[i].y_offset, old_color, new_color);
173 }
174 }
175 }
for循环实现了向8个联通方向的递归搜索,秘密就在direction_8的定义:
15 typedef struct tagDIRECTION
16 {
17 int x_offset;
18 int 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-联通”填充效果:
Ⅲ 计算机图形学中。写出内点表示的8连通区域的递归填充算法。 请写出完整的函数代码:
用八邻域的话,有重复的,这个你要考虑到,一般都用四邻域的,八邻域你可以设置一个标志数组,对于已经处理的点就不管了
Ⅳ 填充算法的注入填充区域算法
注入填充算法(FloodFill Algorithm)用于内部定义区域,以改变整个区域的颜色属性,它把区域内的原像素点值改变成另一种像素点值。算法3.2用于填充八连通的内部定义区域。算法中,read ¡ pixel(x; y)表示读出像素点(x; y)像素点值。old-value为像素点的原值, new-value为将要填充的新值。
[算法3.2] 注入填充区域算法。
Procere flood-fill-8(x,y,old-value,new-value)
BEGIN
IF read-pixel(x,y)=old-value THEN
BEGIN
write-pixel(x,y,new-value)
flood-fill-8(x,y-1,old-value,new-value)
flood-fill-8(x,y+1,old-value,new-value)
flood-fill-8(x-1,y,old-value,new-value)
flood-fill-8(x+1,y,old-value,new-value)
flood-fill-8(x+1,y-1,old-value,new-value)
flood-fill-8(x+1,y+1,old-value,new-value)
flood-fill-8(x-1,y-1,old-value,new-value)
flood-fill-8(x-1,y+1,old-value,new-value)
END
ENDIF
END
此算法所采用的基本方法是首先确定(x; y)点的像素点是否在区域内尚未被访问过的那一部分之中,也就是说,如果这个像素点的值是原始值old-value,则需要把它改为填充的值new-value,然后按八连通区域性质先后访问其八个相邻的像素点,当访问其中每一个近邻像素点时,都要进行递归调用。此算法通过在四个方向而不是八个方向上扩展,就可以用来填充一个内部定义的四连通式区域。这时程序只要有前面四个flood-fill-8(...)语句就可以了.
Ⅳ 填充算法的概述
填充算法是计算机算法的一种分类,是一个将指定不规则区域内部像素填充为填充色的过程,在计算机辅助设计和图像处理等领域有广泛应用。包括了注入填充区域算法、种子填充算法、扫描线填充算法、边填充算法等。
Ⅵ 请教二值图像点阵区域孔洞的填充方法
四连通填充:
-找到孔洞中的一点,记录坐标(x,y)
-对于记录的点开始进行如下操作,直到所有记录的点都被处理完成:
-将当前点填充,判断该点上、下、左、右各点是否位于孔内,是否还未填充,如是,将该点添加到记录点数组的末尾
由此,处理完所有记录的点后,四连通的孔洞可填充完毕。以上算法比较简单,存在优化的可能。
Ⅶ 微软操作系统:自带的画图工具填充是用什么算法实现的
基于扫描线的洪水填充算法
洪水填充算法 慢在需要检查周边4个点,而如果带上方向,则刚处理过的点是不需要再判断的了
如果维持算法的一致,那么步长可以增加到 3
如果采用多线程处理,则每个线程只处理一根扫描线,且只检查前进方向的一个点
Ⅷ 简述边界表示的四连通区域的种子填充算法的基本思想和执行步骤
一、种子填充算法思想:
首先填充种子所在的尚未填充的一区段,然后确定与这一区段相邻的上下两条扫描线上位于该区段内是否存在需要填充的新区段,如果存在,则依次把每个新区段最右端的象素作为种子放入堆栈。反复这个过程,直到堆栈为空。
二、种子填充算法步骤:
1、初始化堆栈。
2、种子压入堆栈。
3、While(堆栈非空)从堆栈弹出种子象素。
Ⅸ java如何实现填充算法
四向连通递归填充算法:
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);
}
}
该算法的优点是非常简单,缺点是需要大量栈空间来存储相邻的点。
Ⅹ 我想用易语言填充画板的指定区域 并计算填充了多少像素 怎么计算
函数原型:BOOL ExtFloodFill(HDC hdc,int nXStart,int nYStart,COLORREF crColor,UINT fuFillType);
参数:
nXSTart:指定要开始填充处的逻辑X轴坐标。
nYStart:指定要开始填充处的逻辑Y轴坐标。
crColor:指定要填充的边界或区域的颜色。crColor的具体解释要根据参数fuFillType的值而定。
fuFillType:指定要进行的填充操作类型。该参数必须是下列值之一,这些值的含义如下:
FLOODFILLBORDER:表示填充区域是由crColor参数指定的颜色包围起来的部分。这种形式与FloodFill函数执行的填充类型一样。
FLOODFILLSURFACE:表示填充区域是由crColor指定的颜色来定义。填充操作向四周伸展,直到遇到这种颜色为止。这种操作式样对于带有多种颜色边界的填充区域有用。
返回值:如果函数执行成功,那么返回值为非零;如果函数执行失败,那么返回值为零。若想获得更多错误信息,请调用GetLastError函数。
备注:下列原因可能引起函数执行失败:
填充无法完成。
指定的像素点有着参数crColor(如果要求
操作样式)指定的边界颜色(即颜色相同)。
指定的像素点没有参数crColor(如果要求FLOODFILLSURFACE操作样式)指定的颜色。
该点在剪辑区之外――也就是说在设备中不可见。
如果fuFillType参数为FLOODFILLBORDER,那么系统认为要填充的区域是完全被参数crColor指定的颜色包围起来的。该函数从参数nXStart和nYStart指定的点开始填充,向四周继续,直到遇到边界为止。
如果fuFillType是FLOODRILLSURFACE,那么系统就认为要填充的区域是单颜色的,函数从nXStart和nYStart两个参数指定的点开始填充区域,并向四周延伸,对包含参数crColor指定颜色的所有相邻区域进行填充。
只有支持光栅显示操作的设备和内存设备环境才支持ExtFloodFill函数。为了确定设备是否支持该技术,可使用函数GetDeviceCaps。
http://ke..com/link?url=5RPNfKX08273wPGa
以上内容复制自网络
常量值
FLOODFILLBORDER =0
FLOODRILLSURFACE =1
种子填充算法
编辑
种子填充算法又称为边界填充算法。其基本思想是:从多边形区域的一个内点开始,由内向外用给定的颜色画点直到边界为止。如果边界是以一种颜色指定的,则种子填充算法可逐个像素地处理直到遇到边界颜色为止。
种子填充算法常用四连通域和八连通域技术进行填充操作。
从区域内任意一点出发,通过上、下、左、右四个方向到达区域内的任意像素。用这种方法填充的区域就称为四连通域;这种填充方法称为四向连通算法。
从区域内任意一点出发,通过上、下、左、右、左上、左下、右上和右下八个方向到达区域内的任意像素。用这种方法填充的区域就称为八连通域;这种填充方法称为八向连通算法。
一般来说,八向连通算法可以填充四向连通区域,而四向连通算法有时不能填充八向连通区域。例如,八向连通填充算法能够正确填充如图2.4a所示的区域的内部,而四向连通填充算法只能完成如图2.4b的部分填充。
图2.4 四向连通填充算法
a) 连通域及其内点 b) 填充四连通域
四向连通填充算法:
a) 种子像素压入栈中;
b) 如果栈为空,则转e);否则转c);
c) 弹出一个像素,并将该像素置成填充色;并判断该像素相邻的四连通像素是否为边界色或已经置成多边形的填充色,若不是,则将该像素压入栈;
d) 转b);
e) 结束。
http://ke..com/link?url=jAM4UlhNMYk8__THzHZ2vN__KtQHm7CErVWq
要善用搜索