您的位置:首页 > 理论基础

计算机图形学 学习笔记(三):多边形的区域填充算法,反走样算法

2017-07-11 15:07 736 查看
接上文 计算机图形学 学习笔记(二):多边形扫描转换:X扫描线算法 和 改进的X扫描线算法

光栅图形学算法

2.6 多边形的区域填充算法

区域:指已经表示成点阵样式的填充图形,是像素的集合

区域填充:指将区域内的一点(常称种子点)赋予给定颜色,然后将这种颜色扩展到整个区域内的过程。

区域可采用* 内点表示* 和 边界表示 两种表示形式。



内点表示:枚举出区域内部的所有像素,内部的所有像素着同一个颜色,边界像素着与内部像素不同的颜色

边界表示:枚举出边界上的所有像素,边界上的所有像素着同一个颜色,内部像素着与边界像素不同的颜色

区域填充算法要求区域是连通的,因为只有在连通区域中,才可能将种子点的颜色扩展到区域内的其它点。

区域可分为 4向连通区域和 8向连通区域。



4向连通区域 指的是从区域上一点出发,可通过四个方向,即上下左右移动的组合,在不越出区域的前提下,到达区域内的任意像素。

8向连通区域指的是区域内每一像素出发,可通过八个方向,即上、下、左、右、左上、右上、左下、右下这八个方向的移动的组合来到达。

简单四连通种子填充算法(区域填充递归算法)

种子填充算法的原理:假设在多边形区域内部有一像素已知,由此出发找到区域内的所有像素,用一定的颜色或灰度来填充。

假设区域采用边界定义,即区域边界上所有像素均具有某个特定值,区域内部所有像素均不取这一特定值,而边界外的像素则可具有与边界相同的值。

考虑区域的四向连通,即从区域上一点出发,可通过四个方向,即上下左右移动的组合,在不越出区域的前提下,到达区域内的任意像素。

使用栈结构来实现简单的种子填充算法

算法原理如下:种子像素入栈,当栈非空时重复执行如下三步操作:

栈顶元素出栈

将出栈像素置成要填充的颜色

按左,上,右,下顺序检查与栈像素相邻的四个像素,若其中某个像素不再边界且未被置成填充色,则把该像素入栈

例子



一开始种子像素入栈,形成第1幅图。然后因为栈非空(因为种子像素入栈了),所以现在执行那三步操作。第一步栈顶元素出栈(现在的栈顶元素即种子像素),第二步将出栈元素置为填充色(即种子像素现在变为绿色了),形成第2幅图。然后按左上右下顺序,把1号元素入栈,形成了第3幅图。以此类推,则是种子填充算法的实现。

种子填充算法的不足

有些像素会入栈多次,降低算法效率,栈结构占空间

递归执行,算法很简单,但是效率不高。区域内每一像素都引进一次递归,进/出栈,费时费内存。

改进算法,减少递归次数,提高效率(可以采用区域填充的扫描线算法)

多边形的扫描转换与区域填充算法小结

基本思想不同

- 多边形扫描转换是指将多边形的顶点表示转化为点阵表示

- 区域填充只改变区域的填充颜色,不改变区域表示方法

基本条件不同

在区域填充算法中,要求给定区域内的一点作为种子点,然后从这一点根据连通性将新的颜色扩散到整个区域

扫描转换多边形是从多边形的边界(顶点)信息出发,利用多种形式的连贯性进行填充的

扫描转换区域填充的核心是知道多边形的边界,要得到多边形内部的像素集,有多种方法。其中扫描线算法是利用一套特殊的数据结构,避免求交,然后一条条扫描线确定。

区域填充条件更强一些,不但知道边界,而且还知道区域内的一旦,可以利用四连通或八连通区域不断往外扩展。

填充一个定义的区域的选择包括:

选择实际区域颜色或图案填充方式

选择某种颜色和图案

这些填充选择可应用于多边形区域或用曲线边界定义的区域;此外,区域可用多种画笔、颜色和透明度参数来绘制。

2.7 反走样算法

对直线、圆及椭圆这些最基本元素的生成速度和显示质量的改进,在图形处理系统中具有重要的应有价值。

但是它们生成线条具有明显的“锯齿形”即它们会发生走样现象。

走样

在前面,我们讲过直线转换算法,比如说 DDA,中点画线算法等。但是无论是什么直线转换算法,其实画的都不是直线,而是对直线的一种逼近,如下所示,因此会产生锯齿形。



“锯齿”是走样的一种形式。而走样是光栅显示的一种固有性质,产生走样现象的原因是像素本质上的离散性。(因为我是以有限的像素,去逼近包含无限点的直线的)

走样现象

光栅图形产生的阶梯形(锯齿形

图形中包含相对微小的物体时,这些物体在静态图形中容易被丢弃或忽略(小物体由于走样而消失)

在动画序列中时隐时现,产生闪烁(因为有的时候显示,有的时候不显示)

小物体由于走样而消失 例子:



简单来说,走样的产生是因为采样不足。就像如下图所示:



那么如何降低由于采样不足而产生的走样现象呢?(引出反走样技术)

反走样技术

用于减少或消除走样效果的技术,称为反走样。由于图形的走样现象对图形的质量有很大影响,几乎所有图形处理系统都要对基本图形进行反走样处理。

直观上我们有一种解决方案:采用分辨率更高的显示设备,对解决走样现象有所帮助,因为可以使锯齿相对物体更小一些。如下所示:



但是该反走样方法是以4倍的存储器代价和扫描转化时间获得的,因此这个方法是不可取的。

反走样技术涉及到某种形式的“模糊”来产生更平滑的图像。

对于在白色背景中的黑色矩形,通过在矩形的边界附近掺入一些灰色像素,可以柔化从黑到白的尖锐变化。从远处观察这幅图像时,人眼能够把这些缓和变化的暗影融合在一起,从而看到了更加平滑的边界。如下所示:



主要有两种反走样方法:

非加权区域采样方法

加权区域采样方法

非加权区域采样方法

算法原理:根据物体的覆盖率计算像素的颜色。(覆盖率:某个像素区域被物体覆盖的比例)

例子:显示器的背景颜色是黑色,而我要显示的图形是白色。下面做出“模糊”处理,使其产生更平滑的图像。



以此类推,进行计算。因为进行了颜色的灰度处理,产生了渐变的效果,所以锯齿变得平滑。

非加权区域采样方法的两个缺点

像素的亮度与相交区域的面积成正比,而与相交区域落在像素内的位置无关,这仍然会导致锯齿效应。

直线条上沿理想直线方向的相邻两个像素有时会有较大的灰度差

因为每个像素的权值是一样的,这是它的主要缺点。因此这个算法也被称为非加权区域采样算法。

加权区域采样方法

非加权区域采样方法没有考虑,亮度不仅取决于所占的面积,还需要取决于这个物体里像素中心的远近。所以介绍加权区域采样方法。

加权区域采样方法:这种方法更适合人视觉系统对图像信息的处理方式,反走样效果更好。

算法原理:将直线段看做是具有一定宽度的狭长矩形。当直线段与像素有相交时,根据相交区域与像素中心的距离来决定其对像素亮度的贡献(比重)。

简单来说:直线段对一个像素亮度的贡献正比于相交区域与像素中心的距离。

计算方法:设置相交区域面积与像素中心距离的权函数(高斯函数)反映相交面积对整个像素亮度的贡献大小,利用权函数积分求相交区域面积,用它乘以像素可设置最大亮度值,即可得到该像素实际显示的亮度值。

上述的计算方法比较复杂,我们可采用离散计算方法



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐