目录

Fundamentals of Computer Graphics第3章总结_(光栅化)

0. 前言

原书第四版pdf下载链接:Github: t4world/Computer-Graphics

本文为原书第3章总结,主要讲述光栅化的一些基本概念,对光栅化设备和一些光栅化流程有个基本的认知。

光栅这个单词“Raster”在德语/英语中就是“屏幕,栅格”的意思,故名思义,就是将图像显示在屏幕上。现代的通用平板显示器是以红色,绿色,蓝色这三种原色以特定的配比,辅以矩阵式的数量庞大的像素(pixel,其实来源于picture element的缩写),显示我们最终需要的图像。

其实光栅化设备的意义比较宽泛,激光打印机(laser printer)、喷墨式打印机(ink-jet printer)其实也在范畴内,它们是基于扫描原理,没有行列式的栅格。

大多数图像是有固定的pixel级别尺寸的,比如1920x1080,这就是图像的width*height的尺寸。也有不被pixel-size约束的图,就是有向图(vector image),是没有分辨率而言的,颜色的区域划分取决于线条和形状,不特指到像素级别,缩放也不会改变清晰度,通常用于文本、流程图、机械图等。

关于有向图,除了网页的svg图标被广泛应用外,流程图也是极力推荐的。

diagrams软件画出来的draw.io流程图可以导出svg有向图,完美保留了清晰度和节约了内存。

1. 光栅化设备

光栅化设备(Raster Devices)可以简单的分为2类:

  • 输出设备
    1. 用于显示:包含透射式的液晶显示器LCD(liquid crystal display)、和自发光式的LED显示器(light-emitting diode)
    2. 用于硬拷贝:二进制的输出,即喷墨式打印机;或者是连续色域输出的热染料升华打印机(dye sublimation printer)
  • 输入设备
    1. 2维阵列式:数码相机
    2. 1维线性式:平台扫描仪(flatbed scanner)

1.1 显示

自发光式的LED二极管显示器,通过控制阳极、阴极的电流强度来控制是否发光,以及发光的强度。

每个像素,都由若干个子像素组成,子像素通常是由RGB这3原色构成,示意图如下:

而透射式的LCD液晶显示器则需要其他的光源照亮它,也就是俗称的“背光”。

具体原理是当光透过偏光片1-->液晶板-->偏光片2这样的结构时,中间的液晶块是可以旋转光的偏振方向的(也叫极化方向 )。加载的电压不同,旋转的角度不同,最后通过偏光片2的光量就可控了(偏振方向平行于偏光片可全部通过,垂直则全部不通过)。下方示意图是旋转了90度,全部通过的情况:

不论是LED还是LCD,成型后,都是由固定尺寸的像素阵列组成的,也就有了固定的分辨率。比如形容一块显示器为1920*1080,是指宽度方向有1920个像素点,高度方向有1080个像素点。

1.2 硬拷贝

常见的喷墨式打印机如下图,打印喷头来回扫描移动,在特定的位置喷洒颜料,只能打印二值图像(all-or-nothing,某个点着色与否,没有中间态)。分辨率(清晰度)取决于喷墨的颜料颗粒大小和纸张移动的精细程度。

FoCG-Ch3-ink-jet.webp

常见的热染料打印机如下图,打印头加热燃料升华,附着在打印纸上,因为打印喷头输出的热量是线性连续的,打印的图像可以有颜色深浅区分了(即continuous tone)。打印的分辨率取决于"加热-升华-附着 “这一过程和打印纸移动速度的比值。

FoCG-Ch3-dye-printer.webp
关于打印机的分辨率,理解2个概念:
  • ppi : 即每英寸有多少个像素(pixels per inch),一般用于描述连续色调的热染料打印机,比如300ppi;
  • dpi : 即每英寸有多少个点(dot per inch),一般用于描述二值打印的喷墨式打印机,比如1200dpi.

1.3 输入设备

图像的输入设备主要为照相机和扫描仪。

数码相机原理为通过镜头投影光线,透过颜色滤波片,投射到2D阵列式的传感器(CCD或CMOS),记录每个像素的着色情况(每个像素只着色RGB三者之一)。

拍照像素的光学分辨率 也是固定尺寸的,比如3000x2000,那么相乘后得到6000000,即6百万像素(6MP, megapixel)。

这里的megapixel,是$10^6$,而不是计算机的兆字节(MB, megabytes = $2 ^{10}$ Bytes)。


2. 图像,像素与几何

人们采样像素这一概念对存储于计算机的图像,进行描述和细致的计算。从图像矩形阵列到像素值的映射表示: $$ I(x,y): R \rightarrow V , $$ 其中$R$描述了矩形区域,$V$表示像素的RGB值。

一个像素,反映的其实是这个点附近一小块区域的RGB颜色平均值。

如果一张图的尺寸为$n_x$列和$n_y$行,那么起始点坐标为 $(0,0)$,比如左下角为起始点(不同的API的纹理起始点不同,可能是左上角/左下角),右上角坐标为$(n_x -1,n_y -1)$。例如下图为$n_x = 4,n_y = 3$ :

Chapter3-像素坐标

图像区域内的点坐标的定义域 x 值域为:

$$ R = [-0.5 , n_x - 0.5] × [-0.5, n_y - 0.5]$$


2.1 像素值

像素值的存储格式直接影响内存大小,比如32bit的浮点值和8bit的整型值就是4倍差距。所以像素值的存储格式结合使用场景分成了许多种类,以下是一些经典像素格式和应用类型:

像素格式/bit 应用场景
1 0/1二值图,文本显示或是高分辨率的灰度图
8 整型RGB图,共24bits:浏览器、邮件、用户照片
8 ~ 10 整型RGB图,共24~30bits:计算机显示器的数字接口
12 ~ 14 整型RGB图,共36~42bits:专业相机的原始图
16 整型RGB图,共48bits:专业摄影与打印,图像处理的中间结果
16 整型灰度图,共16bits:X光与医学影像
16 浮点值RGB图,共48bits(half-float):HDR图像,或实时渲染的中间结果
32 浮点值RGB图,共96bits:HDR图像,或软件渲染的中间结果

Ps:上述整形RGB图在原书中为"fixed-range RGB”,其实固定范围是指RGB值处于min~max(比如0~255的unsigned char类型),一般就是相对浮点值来说的。另外,这里暂不考虑RGBA的Alpha通道。

像素格式的转变比较常见,如果是像素bit缩减可能有2方面副作用:

  1. 整型RGB图像编码时,超出max范围的会被截断为max;
  2. 有限的精度会带来量化误差,色彩体现就是像色彩带一样颜色跳变,对静止图像无影响,对动画或者视频影响比较明显;

2.2 显示器强度与Gamma校正

由于显示器的物理特性,“输入pixel-value –> 输出亮度intensity-level”这一过程并非线性的。

而且像素值取值范围$[0,1]$,于是人为地映射“pixel-0” $\rightarrow$ “min-intensity” ,以及“pixel-1” $\rightarrow$ “min-intensity”。

使用以下公式可以近似地表述这种关系:

$$displayed \_intensity = (maximum \_intensity)\alpha ^ \gamma$$

其中$\alpha$是像素值,范围$[0,1]$,$\gamma$(读作gamma)是与显示器有关的属性值,作为这种非线性关系映射的近似值。

那么这个$\gamma$值如何测量呢,一般是通过“半灰度测试”得来:调节像素值$\alpha$,使得发光强度为一半。

此时$displayed \_intensity = 0.5(maximum \_intensity)$, 即$0.5=\alpha^{\gamma}$,那么根据计算:$$\gamma = \frac{\ln 0.5}{\alpha}$$

即可求得$\gamma$值。

下方就是“半灰度测试”,左图为黑白棋盘格,其实就是0.5亮度参考,右图pixel-value,直到和左图发出的光强基本一致(这个观察通常要距离远一点,棋盘格看起来是全灰图),记录此时的像素值$\alpha$。

Chapter3-halfway gray test

得到了$\gamma$值后,就需要"gamma校正“了,要让“输入pixel –> 显示强度”之间看起来是线性的。

只要令:

$${\alpha}^{’} = {\alpha}^{\frac{1}{\gamma}} $$

代替输入的像素值$\alpha$,即可得到:

$$displayed \_intensity = (maximum \_intensity)\alpha$$

3. RGB颜色

现代计算机图形学的光学三原色定为“红-绿-蓝”,即RGB,这是典型的增色系(additive color)。

资料拓展💡

相对地,也有减色系(subtractive color)的三原色,颜料的原色(也是彩色印刷的原色) ,CMYK,青(cyan)-品(magenta)-黄(yellow)。其实就是针对RGB三者的反色:(1,1,1) -(r,g,b)(假设像素值范围$[0,1]$)。

相减是因为人们看到物体的颜色是反射出来的,被吸收的部分看不见。多出来的K是黑色,是为了减少颜料使用,纯黑更容易调出来。

常见的RGB颜色以及基本调配有:

颜色 RGB值 备注
红色(red) $(1,0,0)$
绿色(green) $(0,1,0)$
蓝色(blue) $(0,0,1)$
青色(cyan) $(0,1,1)$ 蓝+绿,也叫blue-green
品红(magenta) $(1,0,1)$ 红+蓝,也叫purple
黄色(yellow) $(1,1,0)$ 红+绿
黑色(black) $(0,0,0)$
白色(white) $(1,1,1)$

理论上不同的$(r,g,b)$取值组合可以得到所有的RGB颜色,也一定处于下方RGB颜色立方内的某一点(右图为RGB立方的六面展开图):

Chapter3-RGB-颜色立方.png

4. 透明度混合

许多场景下,我们不需要完全覆盖像素内容,只需要覆盖一部分,比如全透明、半透明材质、树叶缝隙透光等情况。基于此,建立了“前景-背景-混合mask”这样的模式。假设前景色彩为$C_f$,背景色彩为$C_b$,前景覆盖的比例为$\alpha$(取值范围$[0,1]$),则最终的色彩$C$计算方式:

$$C = \alpha C_f + (1 - \alpha) C_b$$

上述的$\alpha$其实就是透明度通道,对于一张图,每个像素都有这个$\alpha$值,存储时可以另外寸一张灰度图作为mask,更常用的是紧跟RGB数据,形成RGBA数据。

一般而言,RGBA数据是默认$\alpha$通道为1,有透明度混合需求才会对其赋值和运算。

4.1 图像存储

未经压缩的原始图像的内存占用会非常大,考虑一张$1900 \times 1080$ 的RGB-8Bit图,需要内存$1920 \times 1080 \times 3 =6220800 Bytes \approx 6.2MB$ ,如果再考虑8Bit以上或者Alpha通道数据,耗费内存更大,所以突出图片压缩的重要性。

保留图片所有信息或者解压缩时可还原信息的压缩叫无损压缩(lossless compression),压缩过程中丢失信息且不可恢复的叫有损压缩(lossy compression)。

常用的图片压缩格式列举一部分如下:

图片格式 压缩类型 备注
jpeg 有损 基于人类视觉系统压缩,去除那些人眼不铭感的信息
tiff 无损 保存二进制数据或8bit,16bit的无损图
ppm 无压缩 格式非常简单,通常保存8-bit的RGB图
png 无损 分为PNG-8,和PNG-24,前者更常用,后者图像质量更高

$$\text{——————– Chapter3(完结) @2022-2-21 ——————–}$$