区域扫描线
- 格式:docx
- 大小:41.77 KB
- 文档页数:4
印刷行业中CTP质量控制影响计算机直接制版系统质量的因素很多,包括设备配置、参数设置、冲显影设备的参数、药水老化等。
就版面本身所表现出来的现象判断,有如下一些情况。
1、版面脏物版面脏物主要有纸屑、指纹。
如果纸屑黏附在感光胶上,并且曝光开始前没有脱离感光膜面,则这部分被遮盖的本应为空白的区域会变为图文区域。
指纹太重则会在曝光时因能量不足而导致曝光不完全,使印版上出现指纹状残影。
另外,如果印版背面有纸屑等杂物黏附,则会导致正面的曝光区域出现局部扫描线。
灰尘、蚊虫等进和制版机内部,黏附在滚筒上也会导致脏点或扫描线等结果。
2. 马蹄印马蹄印是在生产使用过程中由于人工操作不当而造成的,它同样会造成扫描线之类的印版制版质量问题。
同时还会造成印刷过程局部上墨不均。
3,划痕划浪引起的因素有多种,除了少数情况下是由机械原因造成的之外,其它基本上是人为原因造成的,如果出现在图文部份,它会直接造成印刷品上划痕区不上墨。
如果出现在非图文部分,则划痕区砂目遭到破坏,亲水性降低,可能会造成脏版。
4.感光胶涂布相关问题版材生产过程中,很多因素都会导致白点、气泡的产生(可参考CTP版材生产流程简介之涂布后烘干),如果选版过程有疏漏,而使用时又没有检查,则会导致图文部分网点丢失,或者网点损失量大。
版材感光胶均有涂布不均的现象(可参考CTP版材生产流程简介之涂布)尤其生产线换卷后的未稳定的一段时间内较严重,但是只要保证这种不均的程度在一定的范围内,就可以忽略其影响。
如果通过目测就能发现深浅不一的现象,则版材不可用。
因为深浅不一的现象越严重,意味着感光胶厚度不一,不同的厚度在显影后的留膜率不一样,而留膜率太低,网点面积率就得不到保证。
涂布后烘干环节,烘干温度过低时,感光胶不能完全干燥,曝光时间缩短,显影速度加快,感光层吸附不牢固,耐印力低。
当烘干温度过高时,在曝光显影后印刷易引起上脏,我记得在丽然印刷厂工作的时候就遇到过这种情况,所以说这是经验之谈。
快速的复连通区域扫描线图形填充新方法
李波;吴琼玉;刘东华;唐朝京;张尔扬
【期刊名称】《国防科技大学学报》
【年(卷),期】2003(025)004
【摘要】对复连通区域填充算法进行了细致的研究,提出一种新的扫描线填充算法.该算法先对目标边界进行标注,提供判断条件,然后用扫描线进行填充;该算法不仅适用于单连通区域,而且也适用于复杂区域的填充.该算法效率高,通用性强,实现简单,填充准确.
【总页数】4页(P68-71)
【作者】李波;吴琼玉;刘东华;唐朝京;张尔扬
【作者单位】国防科技大学电子科学与工程学院,湖南,长沙,410073;国防科技大学电子科学与工程学院,湖南,长沙,410073;国防科技大学电子科学与工程学院,湖南,长沙,410073;国防科技大学电子科学与工程学院,湖南,长沙,410073;国防科技大学电子科学与工程学院,湖南,长沙,410073
【正文语种】中文
【中图分类】TP391;O235
【相关文献】
1.多边形图形的环状扫描线种子填充算法 [J], 邱国清
2.基于边界标注的单连通区域扫描线填充新方法 [J], 李波;王刚;刘东华;唐朝京;张尔扬
3.多边形图形的环状扫描线种子填充算法 [J], 邱国清;
4.一种新的快速复杂连通区域扫描线填充算法 [J], 张志龙;李吉成;沈振康
5.复杂连通区域扫描线填充算法的问题及改进 [J], 孙青;郑永果
因版权原因,仅展示原文概要,查看原文内容请购买。
扫描线算法(Scan-Line F illing)扫描线算法适合对矢量图形进行区域填充,只需要直到多边形区域的几何位置,不需要指定种子点,适合计算机自动进行图形处理的场合使用,比如电脑游戏和三维CAD软件的渲染等等。
对矢量多边形区域填充,算法核心还是求交。
《计算几何与图形学有关的几种常用算法》一文给出了判断点与多边形关系的算法――扫描交点的奇偶数判断算法,利用此算法可以判断一个点是否在多边形内,也就是是否需要填充,但是实际工程中使用的填充算法都是只使用求交的思想,并不直接使用这种求交算法。
究其原因,除了算法效率问题之外,还存在一个光栅图形设备和矢量之间的转换问题。
比如某个点位于非常靠近边界的临界位置,用矢量算法判断这个点应该是在多边形内,但是光栅化后,这个点在光栅图形设备上看就有可能是在多边形外边(矢量点没有大小概念,光栅图形设备的点有大小概念),因此,适用于矢量图形的填充算法必须适应光栅图形设备。
扫描线算法的基本思想扫描线填充算法的基本思想是:用水平扫描线从上到下(或从下到上)扫描由多条首尾相连的线段构成的多边形,每根扫描线与多边形的某些边产生一系列交点。
将这些交点按照x坐标排序,将排序后的点两两成对,作为线段的两个端点,以所填的颜色画水平直线。
多边形被扫描完毕后,颜色填充也就完成了。
扫描线填充算法也可以归纳为以下4个步骤:(1)求交,计算扫描线与多边形的交点(2)交点排序,对第2步得到的交点按照x值从小到大进行排序;(3)颜色填充,对排序后的交点两两组成一个水平线段,以画线段的方式进行颜色填充;(4)是否完成多边形扫描?如果是就结束算法,如果不是就改变扫描线,然后转第1步继续处理;整个算法的关键是第1步,需要用尽量少的计算量求出交点,还要考虑交点是线段端点的特殊情况,最后,交点的步进计算最好是整数,便于光栅设备输出显示。
对于每一条扫描线,如果每次都按照正常的线段求交算法进行计算,则计算量大,而且效率底下,如图(6)所示:图(6)多边形与扫描线示意图观察多边形与扫描线的交点情况,可以得到以下两个特点:(1)每次只有相关的几条边可能与扫描线有交点,不必对所有的边进行求交计算;(2)相邻的扫描线与同一直线段的交点存在步进关系,这个关系与直线段所在直线的斜率有关;第一个特点是显而易见的,为了减少计算量,扫描线算法需要维护一张由“活动边”组成的表,称为“活动边表(AET)”。
区域填充的扫描线算法区域填充是一种常见的计算机图形学算法,用于将一个封闭区域内的所有像素点填充为指定的颜色。
扫描线算法是区域填充的一种常用方法,本文将介绍扫描线算法的基本原理、实现步骤和一些优化技巧。
扫描线算法的基本原理是利用扫描线从图像的上边界向下扫描,检测每个扫描线与区域的交点。
当遇到一个交点时,根据该交点的左右两侧的交点情况,确定将该交点连接到哪个交点上。
通过不断地扫描和连接交点,最终将整个区域填充为指定的颜色。
下面是扫描线算法的具体实现步骤:1.首先需要确定区域的边界,可以由用户提供或通过其他算法生成。
边界可以用一系列的线段、多边形或曲线表示。
2. 创建一个数据结构来存储每个扫描线与区域的交点。
常用的数据结构是活性边表(Active Edge Table,AET)和扫描线填充表(Scanline Fill Table,SFT)。
AET用于存储当前扫描线与区域边界的交点,SFT用于存储所有扫描线的交点。
3.初始化扫描线的起始位置为图像的上边界,并创建一个空的AET。
4.开始扫描线的循环,直到扫描线到达图像的下边界。
每次循环都进行以下操作:-将扫描线与区域边界进行相交,找出所有与区域相交的线段,并将它们的交点加入到AET中。
-对AET按照交点的x坐标进行排序。
-从AET中取出相邻的两个交点,根据这两个交点之间的像素点是否在区域内来决定是否填充这些像素点。
5.当扫描线到达图像的下边界时,完成填充。
扫描线算法的实现可能会遇到一些边界情况和优化需求。
下面是一些常见的优化技巧:1.边界处理:在AET中存储的交点需要进行边界处理,确保交点处于图像范围内。
2.垂直线段处理:对于垂直线段,可以进行特殊处理,避免在AET中重复存储相同的交点。
3.区域内部边界处理:当区域内部有不连续的边界时,需要对交点进行合并,避免出现多余的像素点填充。
4.使用扫描线填充算法优化:对于大尺寸的区域填充,可以使用扫描线填充算法进行优化。
扫描线区域填充算法
扫描线区域填充算法,又称为"扫描线填涂算法",它用于对平面中特定区域填充指定的颜色、灰度或纹理,是计算机图形学中常用的算法之一。
该算法的原理是:给定待填充的区域内的点的有限个边界,从某一顶点开始,以某一规则遍历所有的边界点,形成边界数组,接着顺次扫描边界数组,将包含在边界中的每个合理像素点标记成已填充状态,由此而达到填充区域的目的。
算法步骤如下:
(1)设置起始点A,判断是否存在右方向上有没有边界点,若有,则把下一个边界点B作为起始点;
(2)从起始点A 开始,以扫描线的形式一次扫描边界点,把有效的像素点标记为“已填充”;
(3)把已扫描的点加入边界数组,直到下一个边界点C,且C点不等于起始点A;
(4)重复步骤(2)和(3),直至再回到起始点A,完成一次区域填充;
(5)如果还有未填充的区域,则重复步骤(1)至(4),直至所有区域填充完成。
实际应用中,为了避免停滞,可以采用八方向搜索策略;此外,由于扫描线填充算法中填充空间的范围是由边界点定义的,因此,当边界未经处理的是孤立的点或直线时,将无法实现实际的填充效果。
计算机图形学——区域填充的扫描线算法一.实验名称:区域填充的扫描线算法二.实验目的:1、理解区域填充扫描线算法的原理;2、实现区域填充的扫描线算法并测试;三.算法原理:算法基本思想: 首先填充种子点所在扫描线上位于区域内的区段,然后确定与该区段相邻的上下两条扫描线上位于区域内的区段,并依次将各区段的起始位置保存, 这些区段分别被用区域边界色显示的像素点所包围。
随后,逐步取出一开始点并重复上述过程,直到所保存各区段都填充完毕为止。
借助于栈结构,区域填充的扫描线算法之步骤如下:Step 1. 初始化种子点栈:置种子点栈为空栈,并将给定的种子点入栈;Step 2. 出栈:若种子点栈为空,算法结束;否则,取栈顶元素(x,y)为种子点;Step 3. 区段填充:从种子点(x, y) 开始沿纵坐标为y 的当前扫描线向左右两个方向逐像素点进行填色,其颜色值置为newcolor 直至到达区域边界。
分别以xl 和xr 表示该填充区段两端点的横坐标;Step 4. 新种子点入栈: 分别确定当前扫描线上、下相邻的两条扫描线上位于区段[xl, xr] 内的区域内的区段。
若这些区段内的像素点颜色值为newolor ,则转至Step 2;否则以区段的右端点为种子点入种子点栈,再转至Step 2。
四.原程序代码:/*****************************************//*4-ScanLineFill 区域填充的扫描线算法实现*//*****************************************/#include <stdio.h>#include <conio.h>#include <graphics.h>#include <malloc.h>#define Stack_Size 100 //栈的大小常量//定义结构体,记录种子点typedef struct{int x;int y;}Seed;//定义顺序栈(种子点)typedef struct{Seed Point[Stack_Size];int top;}SeqStack;//初始化栈操作void InitStack(SeqStack *&S){S=(SeqStack *)malloc(sizeof(SeqStack));S->top=-1;}//种子点栈置空;void setstackempty (SeqStack *S){S->top==-1;}//种子点栈状态检测函数int isstackempty (SeqStack *S){if(S->top==-1)return true; //空栈返回trueelsereturn false; //非空栈返回false}//种子点入栈;int stackpush (SeqStack *&S,Seed point){if(S->top==Stack_Size-1)//栈已满,返回false return false;S->top++;//栈未满,栈顶元素加1S->Point[S->top]= point;return true;}//取栈顶元素;int stackpop (SeqStack *&S,Seed &point){if(S->top==-1)//栈为空,返回falsereturn false;point=S->Point[S->top];S->top --;//栈未空,top减1return true;}//画圆void CirclePoints (int xc, int yc, int x, int y, int Color) {putpixel (xc + x, yc + y, Color);putpixel (xc + x, yc - y, Color);putpixel (xc - x, yc + y, Color);putpixel (xc - x, yc - y, Color);putpixel (xc + y, yc + x, Color);putpixel (xc + y, yc - x, Color);putpixel (xc - y, yc + x, Color);putpixel (xc - y, yc - x, Color); }//中点画圆算法void MidpointCircle(int radius, int Color) {int x, y;float d;x=0;y=radius;d=5.0/4-radius;CirclePoints(250,250,x,y,Color);while(x<y){if (d<0){d+=x*2.0+3;}else{d+=(x-y)*2.0+5;y--;}x++;CirclePoints(250,250,x,y,Color);}}//四连通扫描线算法void ScanLineFill4(int x, int y, int oldcolor, int newcolor) {int xl, xr, i;bool SpanNeedFill;Seed pt;//种子点SeqStack *S;//定义顺序栈InitStack(S);//定义了栈之后必须把栈先初始化setstackempty(S);//种子点栈置空;pt.x = x;pt.y = y;stackpush (S,pt); // 种子点(x, y)入栈while (!isstackempty(S)){stackpop (S,pt);//取种子点y = pt.y;x = pt.x;while (getpixel (x,y)==oldcolor) {// 从种子点开始向右填充putpixel (x, y, newcolor);x++;}xr = x -1;x = pt.x -1;while (getpixel (x,y)==oldcolor) { // 从种子点开始向左填充putpixel (x, y, newcolor);x--;}xl = x + 1;x = xl;y = y +1; // 处理上面一条扫描线while (x < xr){SpanNeedFill = false;while (getpixel (x, y)==oldcolor){SpanNeedFill = true;x++ ;} // 待填充区段搜索完毕if (SpanNeedFill){// 将右端点作为种子点入栈pt.x = x - 1;pt.y = y;stackpush (S,pt);SpanNeedFill = false;} //继续向右检查以防遗漏while ((getpixel (x, y)!=oldcolor) && (x< xr)) x++;} //上一条扫描线上检查完毕x = xl;y=y-2; // 处理下面一条扫描线while (x < xr){SpanNeedFill = false;while (getpixel (x, y)==oldcolor){SpanNeedFill=true;x++ ;}if (SpanNeedFill){pt.x= x - 1;pt.y = y;stackpush (S,pt);SpanNeedFill=false;}while ((getpixel (x, y)!=oldcolor) && (x < xr))x++;}}}//主函数检测void main(){int radius,color;int x,y;//种子点int oldcolor,newcolor;//原色与填充色//输入参数值printf("input radius and color:\n");//画圆参数scanf("%d,%d",&radius,&color);printf("input x and y:\n"); //读入内点scanf("%d,%d", &x, &y);printf("input oldcolor and newcolor:\n"); //读入原色与填充色scanf("%d,%d", &oldcolor, &newcolor);int gdriver = DETECT,gmode;initgraph(&gdriver, &gmode, "c:\\tc");// 用背景色清空屏幕cleardevice();// 设置绘图色为红色setcolor(RED);MidpointCircle(radius,color);//用中点画圆算法画圆rectangle(150, 150, 350, 350);//再画一个矩形区域ScanLineFill4 (x,y,oldcolor,newcolor);//扫描线区域填充getch();closegraph();}五.运行结果与讨论:测试结果1:测试结果2:六.实验分析与讨论:1.通过借助栈这一数据结构,完成了区域填充的扫描线算法的实现,并利用以前所学的画圆等算法,进行综合运用,在此基础上进行扩充,设计多种图案,进行扫描线填充算法的检测,都得到了理想的结果,体现了算法的有效性;2.栈的数据结构给种子点的操作带来了极大的方便,为算法的实现提供了便利,同时还提高了算法的复用性和可靠性;3.此扫描线填充算法能够对多种图案进行填充,展现了算法的实用性。
区域填充的扫描线算法的使用
计科一班寇大磊2009118251
一.实验题目:区域填充的扫描线算法
二.实验内容:
区域填充的边界算法:
首先填充种子点所在扫描线上位于区域内的区段,然后确定与该区段相邻的上下两条扫描线上位于区域内的区段,并依次将各区段的起始位置保存, 这些区段分别被用区域边界色显示的像素点所包围。
随后,逐步取出一开始点并
重复上述过程,直到所保存各区段都填充完毕为止。
借助于栈结构,区域填充的扫描线算法之步骤如下:
Step 1. 初始化种子点栈置种子点栈为空栈,并将给定的种子点入栈; Step 2. 出栈若种子点栈为空,算法结束;否则,取栈顶元素(x,y)为种子点;
Step 3. 区段填充从种子点 (x, y) 开始沿纵坐标为y 的当前扫描线向左右两个方向逐像素点进行填色,其颜色值置为:
F_Color
直至到达区域边界。
分别以xl 和xr 表示该填充区段两端点的横坐标;
Step 4. 新种子点入栈分别确定当前扫描线上、下相邻的两条扫描线上位于区段 [xl, xr] 内的区域内的区段。
若这些区段内的像素点颜色值为F_Color 或B_Color,则转至 Step 2;否则以区段的右端点为种子点入种子点栈,再转至 Step 2。
首先使用以前的直线画法画一个不规则的封闭图形。
然后通过调用区域填充的扫描线算法的函数来实现对封闭图形的填充。
三.实验代码:
#include <winbgim.h>
#include <conio2.h>
#define MAXSIZE 50000
typedef struct { // 记录种子点
int x;
int y;
} Seed;
typedef struct{
Seed pt[MAXSIZE];
int top;
}stack;
void sestackempt(stack *s){
s->top = -1;
}
bool stackpush(stack *s,Seed pt){
if(s->top == MAXSIZE - 1)
return false;
s->top++;
s->pt[s->top]=pt;
return true;
}
bool isstackempty(stack *s){
if(s->top == -1)
return true;
else
return false;
}
Seed stackpop(stack *s){
if(s->top == -1)
exit(1);
Seed temp = s->pt[s->top];
s->top--;
return temp;
}
void ScanLineFill4 ( int x, int y, int oldcolor, int newcolor)
{
int xl, xr, i;
bool spanNeedFill;
Seed pt;
stack s;
sestackempt(&s);
pt.x = x; pt.y = y;
stackpush (&s,pt); // 种子点(x, y)入栈
while (! isstackempty (&s)){
pt = stackpop (&s); // 取种子点
y = pt.y; x = pt.x;
while (getpixel (x,y) == oldcolor) {
putpixel (x, y, newcolor);
x ++;
}
xr = x -1; x = pt.x -1;
while (getpixel (x,y) == oldcolor){ // 从种子点开始向左填充
putpixel (x, y, newcolor); x--;
}
xl = x + 1;
x = xl; y = y +1; // 处理上面一条扫描线
while (x <= xr) {
spanNeedFill = false;
while (getpixel (x, y) == oldcolor){
spanNeedFill = true; x ++ ;
} // 待填充区段搜索完毕
if (spanNeedFill) {// 将右端点作为种子点入栈
pt.x = x - 1; pt.y = y;
stackpush (&s,pt);
spanNeedFill = false;
} //继续向右检查以防遗漏
while (getpixel (x, y) != oldcolor && x <= xr) x ++ ;
} // 上一条扫描线上检查完毕
x = xl; y = y - 2; // 处理下面一条扫描线
while (x <= xr) {
spanNeedFill = false;
while (getpixel (x, y) == oldcolor) {
spanNeedFill = true; x ++ ;
}
if (spanNeedFill) {
pt.x= x - 1; pt.y = y;
stackpush (&s,pt); spanNeedFill = false;
}
while (getpixel (x, y) != oldcolor && x<= xr) x ++;
}
}
}
int main()
{
initwindow(900,800); //open a 640x480 graphics window
setcolor(WHITE);
line (500,50,50,200);
line (50,200,620,600);
line (620,600,420,440);
line (420,440,500,50);
ScanLineFill4(330,220,0,3);
getch(); //wait for user to press a key
closegraph(); //close graphics window
return 0;
}
四.实验截图:
五.实验总结:
通过区域填充的扫描线算法的学习和使用。
通过上机的实践加深了对这种填充算法的理解。
对算法的基本原理和方法基本明白。
达到了预期的目的。
对自己的实践能力也有着一定的提高和帮助。