【读书笔记】计算机图形学基础(虎书)第3章 - 点阵图

大多的计算机图形或图片通常使用光栅化显示(raster指光栅或点阵)的方法,指将图片当作填满像素的矩阵。一个例子是电视机使用二极管排列成方形矩阵加以显示,不同强度的红绿蓝光的混合创造了不同的颜色,该方法的不同二极管是同时变化的。另一个例子是打印机,图片的变化是按特定顺序的,即一横排一横排的逐步打印。其他的例子有照相机、扫描仪等。

就计算机而言,我们可能想更改图片的朝向、大小、颜色或者把图片贴在运动物体的表面上。这些操作让"点阵图的原图片"与“最终通过器材显示的图片”分为两个不同的事物。除了点阵图以外还存在向量图,向量图更多对形状与比例进行描述,并与分辨率无关。在实际应用中,向量图需要先被转换为点阵图再被计算机显示,时间消耗较长但精度更高。

此章介绍点阵图与计算机显示的基础,并着重于介绍显示方式的非线性。之后的章节也会继续逐步介绍像素值与光线强度直接的关系。

1.光栅设备

就具体设备而言,可以简单分为输入和输出两部分。输出有屏幕显示与打印。屏幕显示分为自发光的(emissive)例如LED显示屏与非自发光的例如LCD。非自发光的通常是在前后板中间加一块液晶板作为控制,将穿透与反射进行混合,也有一些别的发光方法,一个具体的英文链接在此。打印有二元的黑白打印机或连续的彩色打印机。输入主要为传感器,例如二维的相机传感器用于接受光与颜色,还有一维的平板式扫描仪(flatbed/reflective scanner)实际上是打上白光后逐行扫描再通过反射亮度进行分析的。

1.1 显示设备

此部分的物理知识科普较多,不做具体介绍。就自发光的LED而言,发光的亮度与电流大小相关,RGB颜色与颜色相关,最终的颜色为RGB三色的混合。

液晶显示LCD是非自发光设备的一种,利用电压大小来改变光的偏振中文介绍见链接,总的来讲光通过了一个横向偏振过滤片,再依次通过液晶片、滤色片、纵向偏振过滤片与人眼。如果液晶片不通过改变电压来改变光的偏振方向,横纵两次的偏振过滤片会将光阻拦,呈现闭合(OFF)的状态,反之更改电流来改变90度的光偏振为打开(ON)的状态。因为改变角度为连续的,我们可以有效控制光的强度并最终控制RGB值。

另外拥有固定大小像素格的显示器都拥有自己的固定分辨率,如果其他分辨率的图片需要在此显示器上进行显示都需要先一步进行转换。

1.2 打印设备

黑白打印机(ink-jet)的针头通常由一行或数行构成,针头经过计算机控制是否在指定地方滴下墨点,决定后针头一起向前移动,移动的距离决定了分辨度。

热升华印花打印机(dye sublimation printer)通过打印板(原文是print head)发热将印花印到纸上。数种不同颜色的颜料经过同样的操作印至纸上,不同的热度决定了多少颜料被印至纸上,综合可得最后的连续值颜色。最后的分辨率由打印机的打印版发热单元数量与颜料在纸上的加热/冷却速度共同决定。

与显示设备分辨率的全部长宽像素数量不同,打印设备通常以单位面积的像素数量为单位,例如黑白打印机的dpi(dots per inch)与热升华印花打印机的(ppi, pixels per inch)。黑白打印机的高精度主要是为了避免过于明显的边缘,彩色打印机的高精度主要是为了平滑的颜色改变与半色调的调整等。

1.3 输入设备

最初的点阵图除了手动输入外通常通过相机或其他输入设备来得到。相机这个概念在计算机图形的多个地方都有应用,例如前文提到的全局、局部坐标系与相机空间的转换,又或者以后会提到的纹理映射(Texture Mapping)。相机主要使用了矩阵排列的传感器来衡量光的强度与色彩信息,两个主要的传感器种类为CCD与CMOS,两者的介绍与区别见链接。两者都首先使用镜头将光传输至底层的传感器矩阵上,运用每个像素上的光电二极管来感光。具体区别来讲,CCD中一列内的多个二极管集合在一起传输电压信号,而CMOS中每个二极管都有自己的电流电压转换器。通常彩色相机通常使用颜色过滤的技术,每个像素仅负责RGB的一种,并通过后期处理来还原颜色,具体见下图。此外也有一些彩色相机选择用三层感应分别查看RGB颜色并加以混合。

扫描仪与之前的彩色打印机类似,以三层RGB的线形长条光感板为基础,进行移动来进行扫描。同样,每轮扫描后向前移动的距离越小则越高清。

2. 图片、像素与几何

从数学意义上来讲,像素是一个点采样(point sample),而不是一个小方块,具体可以见此论文,主要论述的观点是像素是离散的,显示图片是由离散至连续的一个滤波器(reconstruction filter)转换过程。从图形学的应用中,早期可以将像素看为一个拥有单一颜色的小方块。数学上我们认为对于任何点\((x,y)\)可以通过函数\(I(x,y):R \rightarrow V\)得到一些信息,例如光的强度或者RGB值。在实际处理时,点采样通过计算该点周围的平均值来得到结果,从而将有限的离散点转换为连续的图像。

就图形API来讲,点的坐标可能有所区别,因为历史原因可能存在左上角为\((0,0)\)的情况,坐标可能是所对应方格的左下角或者中心,需要额外注意。本书将整数坐标放置在对应方格的中心上。

2.1 像素值

一个像素可能记录一个灰度值或者三个RGB值,如果利用浮点数记录则需要64位储存,若仅使用\(0-255\)的范围则仅需要8位,容量缩小了八倍(如果对比32位浮点则可以缩小4倍)。我们通常将利用浮点值记录的方法称为HDR(high dynamic range)而利用整数的成为LDR(low dynamic range)。通常一个像素的值有以下分类,比较重要的是1位的灰度值,8位RGB(共24位)的彩色普通图片与16位或32位的高清HDR图片。

缩小位数通常会导致两个问题,分别是clipping和banding。其中clipping指的是真实颜色的亮度或其他值大于被设置的最大值,导致真实颜色被像素值的最大值所取代,额外的亮度或其他值被切割(clip)掉了。另外banding指的是将真实值取整至最接近的像素值时,存在连续值变换为离散值的问题,当精度较低时会存在突兀的颜色变换线或者条状物(band)。这一现象在静态时难以观察,但在动画或者视频中较为明显。

2.2 显示器的亮度与Gamma值

显示器的输出亮度与输入的亮度值之间存在非线性关系,具体可以看作“输出亮度等于最大亮度的\(\alpha^{\gamma}\)倍”,其中\(\alpha\)\([0,1]\)内的输入亮度。实际计算时不需要太过准确,通常选用黑白之间的半值进行计算,可得\(0.5=\alpha^{\gamma}\)\(\gamma = \frac{ln 0.5}{ln \alpha}\)。计算\(\alpha\)时一般让用户或测试员调整\(\alpha\)值,直到灰度图与黑白相间的棋盘图从远处看拥有类似的亮度,具体对比见下图。

在知道\(\gamma\)值后,我们可以通过\(a'=a^{\frac{1}{\gamma}}\)的调整来使得输出亮度与输入亮度值变动比例一致。因为亮度值通常依然利用0至255去代表\(\frac{i}{255}\),最后通常会有256个不同的亮度。在需要高度掌握最终亮度的时候可能需要一一确认加以调整,并根据角度需求添加额外的变化。

3. RGB颜色

此部分主要表示RGB三色可以通过加法混合的方法得到绝大部分颜色。就拓展而言可以见以下链接。
-色料三原色与色光三原色,主要一个是发光的加法叠光,一个是反射的减法叠光。
-调色
-其他色彩空间

4. Alpha合成

对于同一个像素上前后景图片进行叠加操作时需要使用Alpha合成的特殊操作。简单一点的是前景完全覆盖背景,更为复杂一点的是前景仅在像素的一半或一部分覆盖背景,就像远处树林的叶子一样。因此,像素覆盖率成为了一个合成时的重要因素,并得到简单明了的公式"最终颜色=像素覆盖率前景颜色+(1-像素覆盖率)背景颜色"。因为像素覆盖率用\(\alpha\)来表示,这个方法与公式也被称为Alpha合成。Alpha合成也可以使用其他的公式,具体可以见此论文

因为每个像素的Alpha值可能不同,可以用一个矩阵或者灰度图来进行储存,称之为Alpha遮罩或者透明度遮罩。除开常规的RGB的三个颜色通道外,Alpha值可以当作第四个Alpha通道。以下是一个Alpha通道的一个示范。

4.1 图片的储存格式

在RGB每一个8位储存的基础上,往往通过压缩的形式减少储存成本。 主要分为无损压缩和有损压缩,有损压缩会无法回复的丢失部分信息。以下附链接介绍
-BMP,GIF,JPEG,PNG,SVG,WebP
-TIFF
-PPM
因为图片类型的不同往往需要调整输入和输出方法,但是通常图片读取库已经写好了不同的使用方法,可以直接使用。对于快速开发来讲可以直接使用最简单直接的ppm读值。

posted @ 2021-08-14 13:51  一支随缘箭  阅读(1702)  评论(0编辑  收藏  举报