扫描线填充算法与种子填充算法的区别是啥

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了扫描线填充算法与种子填充算法的区别是啥相关的知识,希望对你有一定的参考价值。

参考技术A 种子优点是非常简单,缺点是需要大量栈空间来存储相邻的点。

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

图形填充之种子填充算法

算法说明:

栈结构实现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 }

 

效果图

技术分享 

技术分享

 




以上是关于扫描线填充算法与种子填充算法的区别是啥的主要内容,如果未能解决你的问题,请参考以下文章

openGL实现图形学扫描线种子填充算法

简述边界表示的四连通区域的种子填充算法的基本思想和执行步骤

LinuxUbuntu20.04平台安装Clion与OpenGL并实现图形算法--区域填充扫描线算法

LinuxUbuntu20.04平台安装Clion与OpenGL并实现图形算法--区域填充扫描线算法

LinuxUbuntu20.04平台安装Clion与OpenGL并实现图形算法--区域填充扫描线算法

图形填充之边缘填充算法