首页 > 代码库 > 图形填充之种子填充算法

图形填充之种子填充算法

算法说明:

栈结构实现4-连通边界填充算法的算法步骤为:

种子象素入栈;当栈非空时重复执行如下三步操作:
(a)栈顶象素出栈;
(b)将出栈象素置成填充色;
(c)检查出栈象素的4-邻接点,若其中某个象素点不是边界色且未置成多边形色,则把该象素入栈。

点评:代码写的比较遭,用的是c,但是也掺入了c++的模板和STL,水平还是欠缺,且图中种子事先固定(100,100),最大的缺点是该算法效率较低

 

代码

 

 1 // 种子区域填充算法.cpp : 定义控制台应用程序的入口点。
 2 //
 3 
 4 #include "stdafx.h"
 5 #include<stdio.h>
 6 #include"graphics.h"
 7 #include<stdlib.h>
 8 #include<stack>
 9 
10 using namespace std;
11 
12 //定义结构体存储像素坐标
13 struct Point
14 {
15     int x;
16     int y;
17 };
18 
19 //函数声明
20 void Boundaryfilling(Point a[], int n);
21 void judgecolor(int x, int y, stack<int> &sx, stack<int> &sy);
22 
23 int main()
24 {
25     int gdriver = DETECT, gmode, n, i;
26 
27     printf("please input number of point:\n");
28     scanf_s("%d", &n);
29 
30     Point *p=(Point *)malloc(n*sizeof(Point));    //动态分配内存
31 
32     printf("please input point :\n");
33     for (i = 0; i < n; i++)
34         scanf_s("%d%d", &p[i].x, &p[i].y);
35 
36     initgraph(&gdriver, &gmode, "");
37 
38     setcolor(BLUE);
39     setbkcolor(BLACK);
40 
41     //画出多边形
42     for (i = 0; i < n-1; i++)
43         line(p[i].x, p[i].y, p[i + 1].x, p[i + 1].y);
44 
45     Boundaryfilling(p, n);
46 
47     system("pause");
48     closegraph();
49 
50     return 0;
51 }
52 
53 void Boundaryfilling(Point a[], int n)
54 {
55     stack<int> sx,sy;
56     int x=0 , y=0 ,x0,y0,i;
57 
58     for (i = 0; i < n; i++)
59     {
60         x += a[i].x;
61         y += a[i].y;
62     }
63 
64     x = x / (n-1);
65     y = y / (n-1);
66 
67     sx.push(x);//x坐标入栈
68     sy.push(y);//y坐标入栈
69 
70     while (!sx.empty())    //判断栈是否为空
71     {
72         x0 = sx.top();
73         y0 = sy.top();
74 
75         putpixel(sx.top(), sy.top(), YELLOW);    //栈顶元素着色
76         sx.pop();//栈顶元素出栈
77         sy.pop();//栈顶元素出栈
78 
79         judgecolor(x0 - 1, y0, sx, sy);//左边点
80         judgecolor(x0 + 1, y0, sx, sy);//右边点
81         judgecolor(x0, y0 - 1, sx, sy);//下边点
82         judgecolor(x0, y0 + 1, sx, sy);//上边点
83     }
84 }
85 
86 //判断该像素是否没有着色
87 void judgecolor(int x, int y,stack<int> &sx,stack<int> &sy)
88 {
89     if (getpixel(x, y) == BLACK)
90     {
91         sx.push(x);
92         sy.push(y);
93     }
94 }

 

效果图

技术分享 

技术分享

 

图形填充之种子填充算法