计算机图形学笔记——光栅图(Raster Images)

3,641 阅读12分钟

前言

此系列是本人对于学习计算机图形学过程中的记录及总结,所看教材是《Fundamentals of Computer Graphics (FOURTH EDITION)》。本文的图片也主要来源此书。以博客作为学习记录,理解之中若有不足还请大佬们指教。

本篇主要记录第三章Raster Image的学习。Raster Image即光栅图像,也叫位图、点阵图、像素图。

总述

许多计算机图形在光栅显示器(raster display)上向用户展示。raster display则是通过二维像素数组展示图像。像素即pixel,它是“picture element”的缩写。举个例子就是平常的电视,他们含有二维数组的小像素点,这些像素点可以独立地设置不同颜色以创造任何图像。很多打印机,比如激光打印机、喷墨打印机等也是光栅设备(raster devices)

**光栅(Rasters)**也同样在输入图像设备中流行。比如数码相机。

因为光栅如此在设备中如此流行,光栅图(raster images)是最共通的储存和处理图像的方法。一张光栅图就是一个存储像素值的二维数组。同时,因为不同设备中的物理像素点数量是不一样的,最好把光栅图看作与设备无关的图像描述,而显示设备则是一种尽量去接近理想情况下展示图片的方式。

除了光栅图外还有矢量图(vector image),矢量图本质上可以说是通过存储命令来描述图形。

本章主要描述光栅图的基础和展示。

3.1光栅设备(Raster Devices)

在讨论光栅图之前,先看看了解光栅设备的基本操作。先罗列我们熟悉的一些设备。

  • 输出(output)
    • 显示(display)
      • Transmissive:liquid crystal display(LCD,即液晶显示器)
      • Emissive:light-emitting diode (LED) display
    • 纸质?(hardcopy)
      • 二元(Binary):喷墨打印机(ink-jet printer)
      • 连续色调(Continuous tone):热升华打印机(dye sublimation printer)
  • 输入(input)
    • 2维数组传感器(2D array sensor):数码相机(digital camera)
    • 1维数组传感器(1D array sensor):平板扫描仪(flatbed scanner)

由于一些名词难以翻译,直接将英文也写了出来

3.1.1显示设备(Displays)

如上分类,显示设备主要有emissive displaystransmissive displaysemissive display使用能够直接发射可控光源数量的像素进行图像显示,例如LED设备。而transmissive display中像素本身不发光,而是改变允许通过像素点的光进行图像显示,因此transmissiv display需要一个光源,直观上来说就是像素数组后需要背后照明。

以下拿LED(代表emissive display)和LCD(液晶显示器,代表transmissive display)分别说明

LED(代表emissive display)

LED设备中的像素是半导体设备,通过电流控制发光。

在颜色控制上,一个像素被划分为三个独立控制的子像素,分别控制红绿蓝(RGB)。

当从远处看时,我们的眼睛无法区分三个独立的子像素,察觉到的颜色也就是红绿蓝的混合

LCD(液晶设备,代表transmissive display)

LCD ( Liquid Crystal Display 的简称)液晶显示器。
LCD 的构造是在两片平行的玻璃基板当中放置液晶盒,下基板玻璃上设置TFT(薄膜晶体管),上基板玻璃上设置彩色滤光片,通过TFT上的信号与电压改变来控制液晶分子的转动方向,从而达到控制每个像素点偏振光出射与否而达到显示目的。
LCD已经替代CRT成为主流,价格也已经下降了很多,并已充分普及。——摘自百度百科——LCD

如图所示,底部图

中间部分的液晶分子(Liquid crystals)转动后可改变光的偏振,从而决定光是否能透过front polarizer,以此控制光的显示

而对于颜色的控制,其同LED一样,每个相遇也有三个子像素。

而对于一张图片在不同分辨率上,为了适应不同的屏幕,详细的方法于章节本书中放在第九章。

3.1.2打印设备(Hardcopy Devices)

在打印中,原理即是颜料覆盖在纸张或其他媒介上,当光反射在纸上时,显现的就是我们看到的图像。

喷墨打印机(ink-jet printer)

喷墨打印机(ink-jet printer)中,喷墨头中装有颜料墨水,在电流的控制下喷洒非常小滴的墨水。喷墨头在纸张上移动,墨滴被喷洒在应该喷洒的地方。

而颜色的打印则是通过几个喷墨头,每个喷墨头装有不同的颜料。

热升华打印机(dye sublimation printer)

热升华(Thermal Dye Sublimation)打印机的工作原理是将四种颜色(青色、品红色、黄色和黑色,简称CMYK)的固体颜料(称为色卷)设置在一个转鼓上,这个转鼓上面安装有数以万计的半导体加热元件,当这些加热元件的温度升高到一定程度时,就可以将固体颜料直接转化为气态(固态不经过液化就变成气态的过程称为升华,因此这种打印机被称为热升华打印机),然后将气体喷射到打印介质上。每个半导体加热元件都可以调节出256种温度,从而能够调节色彩的比例和浓淡程度,实现连续色调的真彩照片效果。——摘自百度百科——热升华打印机

3.1.3输入设备(Input Devices)

除了某些程序生成的光栅图,多数光栅图的来源就是相机和扫描仪,它们是光栅图的输入设备。

一个光栅输入设备需要对每个像素做光测量(light measurement),同时它们通常是基于若干组传感器。

数码相机就是2维输入设备的一个例子。相机中的图像传感器是一个半导体设备,其中带有网格的,对光敏感的像素。

相机的镜头把场景的图像投影到传感器上,接着每个像素测量在之上的光能(light energy),最终用能够传达给输出设备的数字表示。

3.2 图像、像素和几何(Images, Pixels, and Geometry)

我们知道光栅图是一个大的像素数组,每一个像素都存储着对应点的颜色信息。在了解图像的输入设备与输出设备后,知道它们对图像的输入、输出有不同的实现方式。但在计算机计算中,我们需要一种更加方便、与设备无关的抽象表示,使得我们思考如何解析存储在图像中的值。

当我们测量或者再现图片时,它们均采取光能二维分布的形式:光从显示器射出,正如函数在显示上对各个位置的映射;光落在相机图像传感器上,正如函数在传感器平面上对位置的记录等等。。所以在物理世界中,图像是一个定义在二维区域上的函数。把图像抽象为函数便有:

其中,

R是一个矩形区域,V是可能像素值的集合。

此书中用以下形式表现屏幕坐标系以指向对应的像素点

函数的定义域R也为如下:

3.2.1像素值(Pixel Values)

目前我们知道使用真实的数字描述像素值,表示一个点在图像中的强度(比如RGB)。这表明一张图应该是一个浮点数数组,每个像素用一个(灰度图像)或三个(RGB)32位浮点数表示。但这种形式只有在图像精度和像素值域要求高才被使用,因为太占空间了。如果使用这种形式的话,一张10兆像素的图片就要消耗115MB的RAM了。这种使用浮点数的图像被称为hight dynamic range(HDR) images

更小的值域能够使得图片直接被展示。尽管理论上说光源强度的值域是没有限制的,但是设备中都有给有限的最大强度。所以在许多环境下,给像素值设定边界范围是很高效的,通常这个范围是[0, 1]。举例说,一张8-bits图像的像素值可能有0,1/255,2/255,...,254/255,1。这种使用整数的图像被称为low dynamic range(LDR) images

减少像素值的bit位会对图片造成两种人为的缺陷。第一是解使用固定的值范围码图片会对亮度造成削减效果。比如一张图片的内容是沙滩,其中包含了比白色表面还要亮的反射光。这种效果会被削减掉;第二是当需要向邻近像素值舍入像素值时,低精度解码图片会导致光强和颜色在显示上的跳动。这对动画及视频来说非常影响体验,对静态的图片来说相对不明显,但是在缩放图片时会有对应的效果。

3.2.2显示器强度和Gamma(Monitor Intensities and Gamma)

人类对于光的强度感受并非是线性的图自知乎——色彩校正中的 gamma 值是什么? - 韩世麟的回答)。

为了在显示器上显示正确的图片,有两个重要的点:

  1. 显示器显示输入的像素值并非是线性的
  2. 显示器取得的像素值是离散的(书中写为quantized input values,根据后文表现与离散一致)

以下分别说说两个点

1.显示器显示输入的像素值并非是线性的

假设给显示器0,0.5和1.0三个像素值作为输入,显示器显示的强度对应可能是0,0.25,1.0。

显示器使用γ("gamma")值描述这一非线性表现:

α是像素输入值,大小为0-1。

举个例子,比如γ值是2.0,α是像素值0.5。那么显示的强度便是最大可能强度的1/4,因为0.5^2 = 0.25。

描述展示的非线性使用γ仅仅是一种接近值,同时也没有必要去做大量的工作去达到完全精确。

一个测量非线性度的方法是找到使得显示强度位于黑色与白色中间的α值:

找到α后,根据以上公式可推出γ:

那么我们如何找到α值呢?有一个标准的方法,显示一个棋盘状、黑白相间的图像,相邻一个α值灰色方阵图像。当从远处看时,若两幅图像看起来大致相同,则α值恰好是黑白的中间值。

2.显示器取得的像素值是离散的

之前提到像素值的取值范围是[0, 1],是通过固定大小的int类型操作的。比较通用的便是8bit位用于表示0-255。这意味着像素值取值并不是[0, 1]中的任何一个值,而是如下:

这就意味着所有的显示强度如下:

其中,M代表最大强度(maximum intensity)。

3.3RGB颜色(RGB Color)

多数电脑图形图像均是使用red-green-blue(RGB)定义颜色的。RGB是个简单的空间,对于多数计算机屏幕的控制更为直观。

RGB的基本原理是混合三个原始灯光:红、绿、蓝。

如果用0表示灯光全关,1表示灯光全开,我们可以在计算机屏幕上表现所有的颜色。红、蓝、绿三个颜色可以创建三维的RGB color cube

真实的RGB常常使用量化的形式(quantized form)表现,每一个颜色部分使用一个整型表示。最常用的大小是一个颜色一个字节,所以每一个颜色部分的整型大小范围为0~255。三个整型一共使用3个字节,也就是24bits。同时gamma矫正(gamma correction)也同样适用于RGB

3.4Alpha合成(Alpha Compositing)

图片中,在背景上插入前景图像需要做合成(compositing)。举个例子,对于不透明的前景图像,直接替换背景像素即可;对于完全透明的前景图像,不需要对背景像素做任何修改;对于透明的前景图像来说,就需要注意了。

在合成前景对象和背景对象中,最重要的信息是pixel coverage(。。维基百科找不到词条,谷歌翻译像素覆盖率),它能告诉我们被前景层像素覆背景层的占比。我们可以把这个占比称为α。如果我们想要混合前景颜色cf和背景颜色cb,同时被前景层覆盖率为α,我们可以用如下公式计算:

对于图像的α值,可能储存在分离的灰度图像,然后作为alpha mask或者transparency mask(即遮罩层);也有可能作为RGB的第四个通道,称为alpha channel,接着对应的图像即被称为RGBA图像,每个像素的大小占位也变为32bits。

3.4.1图像存储(Image Storage)

多数RGB图像共有24位bits存储,这导致了一张百万像素的图片就有3兆字节用于存储原信息。为了降低存储需求,许多图片格式允许有一点压缩,压缩有无损压缩和有损压缩。目前常用的几种压缩格式如下:

  • jpeg:有损压缩,同时是基于人类的视觉,适用于自然图像。
  • tiff:无损压缩。
  • ppm:无损压缩。
  • png:无损压缩。

总结

看完本章后有了很多新的认识,比如显示器显示像素、图像如何输入数码设备、人类对光感受的非线性及Alpha合成实现透明效果等等。其中,人类对光感受的非线性中的gamma校正(gamma correction)还可进一步深入发现,有兴趣的同学可以探索。

若有不足还请大佬们指教。

参考资料

光栅图像——百度百科
矢量图——百度百科
色彩校正中的 gamma 值是什么? - 韩世麟的回答 - 知乎