计算机图形学——混淆与反混淆


为什么要反混淆

混淆:在光栅显示器上显示图形时,直线段或图形边界或多或少会呈锯齿状。原因是图形信号是连续的,而在光栅显示系统中,用来表示图形的却是一个个离散的象素。这种用离散量表示连续量引起的失真现象称之为混淆。

用于减少或消除这种效果的技术称为反混淆。

反混淆方法

反混淆的方法大致有以下三种:

  1. 提高分辨率
  2. 非加权区域采样
  3. 加权区域采样

其中,第一种提高分辨率的方法是最简单的反混淆的方法。但是,由于分辨率的提升,帧缓存容量则增加到原来的4倍,而扫描转换同样大小的图元却要花4倍时间。因此,这种方法需要耗费大量的资源和时间,不实际。

因此,主要将介绍后两种反混淆的方法。

非加权区域采样

方法简述

非加权区域采样的核心是:改变直线段模型

步骤如下:

  1. 将直线段看作具有一定宽度的狭长矩形
  2. 当直线段与某象素有交时,求出两者相交区域的面积
  3. 根据相交区域的面积,确定该象素的亮度值

所以核心的问题是计算直线段与像素相交区域的面积。根据这个面积信息,就能够计算出像素的亮度了。因此,根据这个结论,可以做出以下结论:

  1. 直线段对一个像素亮度的贡献:

    • 与两者相交区域的面积成正比

    • 和像素中心点距直线段的距离成反比(像素中心点距直线段距离越远,相交区域的面积越小)

  2. 当直线段和某个像素不相交时,它对该像素的亮度无影响

  3. 相同面积的相交区域对像素的亮度贡献相同,而与这个相交区域落在像素内的位置无关

面积计算

假设一条直线段的斜率为 $k(0\le k\le 1)$,且所画直线为一个像素单位,则直线段与象素相交有三种情况。

a)情况中,所形成的区域是一个三角形。因此他的面积可以表示为: $$ S=\frac{1}{2}D\cdot Dk $$ b)情况中,所形成的区域是一个梯形。因此他的面积可以表示为: $$ S=\frac{1}{2}(D+D-k)=D-\frac{k}{2} $$ c)情况中,区域的面积可以通过正方形的面积减去两个三角形的面积。

上面的方法中介绍的都是面积的精确计算。这样的方法是精确的,但是他不能够快速的进行计算。因此,可以将一个像素再划分成多个格子,然后通过数格子的方式来简化面积的计算。

计算灰度值

在得到了面积之后,由于面积是0到1之间的一个数字,其可以直接作为系数乘最大灰度值,从而达到混淆的目的。

因此像素实际显示的灰度值的计算如下: $$ 实际的灰度值=S\cdot 像素灰度值_\max $$

总结

非加权区域采样通过计算直线与像素相交的面积大小,计算出像素对应的灰度,并显示。这样的方式尽管可以完成反混淆的工作,但是他也存在以下的缺点:

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

加权区域采样

加权区域采样通过对非加权区域采样方法的改进,考虑相交区域对象素亮度的贡献依赖于该区域与象素中心的距离,来实现更好的反混淆的效果。

权函数

  • 以象素A的中心为原点建立二维坐标系

  • $w(x,y)$ 反应了微面积元 $dA$ 对整个象素亮度的贡献大小 ,与 $d$ (微面积元与像素中心的距离)成反比。

  • 位于 $(x,y)$ 处的微面积元 $dA$ 对像素的亮度的贡献为 $w(x,y)dA$ ,因此则有: $$ w(x,y)\propto \frac{1}{d}\ \int_Aw(x,y)dA=1 $$

  • 相交区域 $A^\prime$ 对该象素的亮度贡献为: $$ \int_{A^\prime} w(x,y)dA $$

权函数可以选择高斯函数和恒等函数。如果权函数选择为恒等函数,则此时加权区域采样会退化为非加权区域采样。(因为无论面积与中心的距离是多少,他对亮度的贡献都是相等的)

步骤

加权区域采样的实现步骤为:

  1. 求直线段与象素的相交区域 $A^\prime$
  2. 计算 $\int_{A^\prime} w(x,y)dA$ 的值
  3. 上面所得到的值介于0、1之间,乘象素的最大灰度值,即设该象素的显示灰度。

亮度贡献的简单计算

上述的运算中,大量的计算都是用来求相交区域对像素亮度的贡献。和之前非加权的面积计算的简化计算类似的,加权区域采样也可以进行简单的计算,来避免积分运算。

  1. 将象素均匀分割成 $n$ 个子象素,则每个象素的面积为 $\frac{1}{n}$。
  2. 计算每个子象素对原象素的贡献,并保存在一张二维的加权表中。
  3. 求出所有中心落于直线段内的子象素。
  4. 计算所有这些子象素对原象素亮度贡献之和的值,并该值乘以象素的最大灰度值作为该象素的显示灰度值。

上图中展示的是 $n=3$ 的加权表。

通过这样的方式,就可以完成亮度贡献的计算了。

comments powered by Disqus