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

接上文 计算机图形学 学习笔记(二):多边形扫描转换:X扫描线算法 和 改进的X扫描线算法


光栅图形学算法

2.6 多边形的区域填充算法

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

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

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

这里写图片描述
内点表示:枚举出区域内部的所有像素,内部的所有像素着同一个颜色,边界像素着与内部像素不同的颜色

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

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

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

这里写图片描述

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

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

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

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

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

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

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

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

  1. 栈顶元素出栈
  2. 将出栈像素置成要填充的颜色
  3. 按左,上,右,下顺序检查与栈像素相邻的四个像素,若其中某个像素不再边界且未被置成填充色,则把该像素入栈

例子

这里写图片描述

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

种子填充算法的不足

  • 有些像素会入栈多次,降低算法效率,栈结构占空间
  • 递归执行,算法很简单,但是效率不高。区域内每一像素都引进一次递归,进/出栈,费时费内存。

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

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

基本思想不同
- 多边形扫描转换是指将多边形的顶点表示转化为点阵表示
- 区域填充只改变区域的填充颜色,不改变区域表示方法

基本条件不同

  • 在区域填充算法中,要求给定区域内的一点作为种子点,然后从这一点根据连通性将新的颜色扩散到整个区域
  • 扫描转换多边形是从多边形的边界(顶点)信息出发,利用多种形式的连贯性进行填充的

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

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

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

  • 选择实际区域颜色或图案填充方式
  • 选择某种颜色和图案

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

2.7 反走样算法

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

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

走样

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

这里写图片描述

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

走样现象

  1. 光栅图形产生的阶梯形(锯齿形
  2. 图形中包含相对微小的物体时,这些物体在静态图形中容易被丢弃或忽略(小物体由于走样而消失)
  3. 在动画序列中时隐时现,产生闪烁(因为有的时候显示,有的时候不显示)

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

这里写图片描述

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

这里写图片描述

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

反走样技术

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

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

这里写图片描述

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

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

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

这里写图片描述

主要有两种反走样方法:

  1. 非加权区域采样方法
  2. 加权区域采样方法

非加权区域采样方法

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

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

这里写图片描述

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

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

  1. 像素的亮度与相交区域的面积成正比,而与相交区域落在像素内的位置无关,这仍然会导致锯齿效应。
  2. 直线条上沿理想直线方向的相邻两个像素有时会有较大的灰度差

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

加权区域采样方法

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

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

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

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

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

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

这里写图片描述
这里写图片描述

  • 8
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Prioritized Replay 是 Deep Q-Network (DQN) 中的一种重要改进算法。在传统的 DQN 算法中,模型训练是基于经验回放技术的。简单来说,就是将之前的一些观察和动作的经验随机地从经验池中抽取出来进行训练。但是,这种随机抽样并没有考虑到每个经验的重要性。有些经验虽然出现的次数很少,但是对模型的训练影响很大。因此,如果我们能够对经验进行优先级的排序,就能够更加有效地训练模型。 在 Prioritized Replay 算法中,我们使用了一个优先级队列来对经验进行排序。每个经验的优先级是根据其对模型训练的贡献来计算的。具体来说,每个经验的优先级为: $P_i = |\delta_i| + \epsilon$ 其中 $|\delta_i|$ 表示当前状态下真实 Q 值与估计 Q 值之差的绝对值,$\epsilon$ 是一个很小的常数,避免了某些经验的优先级为 0。这个公式的意思是,我们更倾向于选择那些真实 Q 值与估计 Q 值之差较大的经验进行训练。 在进行经验回放时,我们根据经验的优先级从优先级队列中抽取出经验。我们还需要一个重要的参数 $\alpha$,它表示优先级的重要程度。在优先级队列中,每个经验的优先级 $P_i$ 都会被赋予一个权重 $w_i$,它表示该经验在训练中的重要性。这个权重的计算公式为: $w_i = (\frac{1}{N} \frac{1}{P_i})^{\alpha}$ 其中 $N$ 是经验池中经验的总数,$\alpha$ 是一个超参数,控制优先级的重要程度。这个公式的意思是,优先级较高的经验在训练中得到的权重也较高,从而更加有效地更新模型。 需要注意的是,在 Prioritized Replay 算法中,我们对经验进行了优先级排序,但是这并不意味着我们只选择优先级高的经验进行训练。为了保证训练的稳定性,我们还需要引入一个随机因素,以一定的概率从优先级较低的经验中进行抽样。 总之,Prioritized Replay 算法通过对经验进行优先级排序,从而更加有效地训练模型。它是 DQN 算法的一个重要改进,被广泛地应用于深度强化学习领域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值