FCG-Chapter-3


3. 栅格图像

栅格显示器将图像显示为长方形像素阵列。一个常见的例子是平板电脑显示器或电视机,激光打印机、喷墨打印机也是栅格设备。它们基于扫描的原理:没有物理的像素网格,但通过依次地为每一个网格点留下墨水而展示出图像。

栅格在图像输入设备中也很普遍,例如数码摄像机、桌面扫描仪。

栅格图像被简化为储存像素值的二维阵列——通常将一个颜色存为红、绿、蓝三个数字。通过内存中的像素值控制显示器的像素颜色,就以将栅格图像显示出来。

但我们通常不想以这种方式显示图像,我们想要改变其尺寸或方位、校正其颜色,甚至在一个运动的3D表面上显示。即使是电视机也很少会与要显示的图像具有相同的像素数目。
因此最好将栅格图像看成是“设备无关”的图像描述方式,将显示设备看成一种近似显示理想图像的方式。

除了像素阵列,也有其它描述图像的方式。
矢量图像是一种不依赖任何特定像素网格的图像存储方式——其中有颜色的区域被直线和曲线所包围。这意味着存储要显示图像的“指令”而非像素。其好处是与分辨率无关,可以被显示在极高分辨率的设备上。与此相关的坏处是,必须经过光栅化才能被显示出来。
矢量图经常用于文字、图表、机械制图,以其它对清晰度要求较高、且不需要照片般图像和复杂阴影效果的应用场景,

在本章中,我们讨论栅格图像及其显示,特别关注标准显示器的非线性。
像素值如何与光线强度相关联等重要细节将在后续计算图像的章节中讨论。

3.1 栅格设备

栅格设备分类层次:

  • 输出
    • 显示
      • 透射型(Transmissive):液晶显示器(LCD)
      • 自发光型(Emissive):发光二极管显示器(LED)
    • 硬拷贝
      • 二值的(Binary, 译注:指有墨/无墨):喷墨打印机
      • 连续色调的(Continuous tone):染料升华打印机
  • 输入
    • 2D阵列传感器:数码相机
    • 1D阵列传感器:平板扫描仪
3.1.1 显示器

主要介绍了LED、LCD的原理。

3.1.2 硬拷贝设备

介绍了喷墨打印机、热敏染料打印机的原理。

打印机通常使用像素密度而非像素数量来描述其分辨率,有以下两个单位:

  • ppi:pixels per inch,主要用于描述显示器、图像分辨率
  • dpi:dots per inch,主要用于描述打印机设备的分辨率
3.1.3 输入设备

介绍了数码相机的原理。

相机传感器只能感受光线强度而非颜色,所以需要使用滤光片阵列,使得传感器分开接收R/G/B三色光,再进行“去马赛克(demosaick)”操作,得到正常图像。

3.2 图像,像素与几何

图像可抽象表示为函数:

$$I(x,y):R\to{V},$$

其中\(R\subset{\mathbb{R}^{2}}\)是一个矩形区域,\(V\)是像素值。
这个简化的例子是理想灰度图像(其每个点仅有一个亮度值),我们说\(V=\mathbb{R}^{+}\)。 一个具有红、绿、蓝像素的理想彩色图像,有\(V=(\mathbb{R}^{+})^{3}\)。我们将在下一节讨论其它可能的\(V\)。

栅格图像如何与这个抽象的连续图像概念建立了联系呢? 看一下离散的例子。相机或扫描仪上的像素,测量的是像素周围区域的平均颜色;而显示器上的像素,显示的是栅格图像对应像素的平均颜色。两种情况下,像素值都是彩色图像的局部平均值,它叫做图像的点采样

在一些API以及许多文件格式中,图像的行被组织成从上至下的顺序,(0, 0)位于左上角。这是由于历史原因:模拟电视的像素行从上方开始向下传播(transmission)。

有些系统将坐标移动半个像素,为了让采样点位于整数坐标的正中间,而把网格的边置于整位坐标线上。

屏幕坐标系

屏幕坐标系

本书中统一约定,栅格图像通过*(i,j)对来索引,表示第i列以及第j行,从像素阵列的左下方数起。最左下元素索引为(0,0)*。如图所示。

一张\(n_{x} \times n_{y}\)图像矩形区域范围为:

$$R=[-0.5,n_{x}-0.5]\times[-0.5,n_{y}-0.5]$$

这只是简单的约定,但在实施相机和视角变换时十分重要。

3.2.1 像素值

HDR:high dynamic range。HDR图像是指以浮点数保存、具有很宽颜色范围的图像。
LDR:low dynamic range。以整数保存,颜色范围有限。

像素格式类型:

  • 1位灰度:不需要中间灰度的文本或图像。
  • 8位RGB(每个像素占24比特位):网磁,照片
  • 8或10位RGB:计算机显示器用的数字接口
  • 12到14位RGB:相机原生图像、专业摄影图像
  • 16位RGB:专业摄影、打印;图像处理过程中间格式
  • 16位灰度:医学影像
  • 16位半精度浮点数RGB:HDR图像、实时渲染的中间格式
  • 32位浮点RGB:软件渲染、处理图像时使用的中间格式

降低位数会导致:

  1. 亮度截断:极大值被截断为有限范围内的上限
  2. 条带化:平滑过渡的颜色被量化为有明显界限的色块
3.2.2 显示器亮度与伽马值

人类视觉感知存在的非线性不在本节内容讨论,请参考第19章。

显示器输入与输出存在非线性。例如给显示器输入0, 0.5, 1.0,它显示的亮度可能是0, 0.025, 1.0。
通常用gamma值来衡量显示器的非线性:

$$显示亮度 = (最大亮度)a^{\gamma}$$

其中a是输入像素值(0到1)。

使用gamma值来衡量显示器的非线性只是一种近似,我们不需要获得显示器精确的gamma值。

一个很棒的测量方法是找到那个使亮度等于一半的那个a,从而可求gamma:

$$\gamma=\frac{ln0.5}{lna}$$

我们可以显示一个测试图像,该图像中黑白像素与输入为a的灰色像素相邻。然后要求用户调整a值,直到两侧在平均亮度上相等。
当你把a调到了使显示亮度降为最大值的一半的值时,你在远处看这张图(或者如果你近视的话,摘掉眼镜看),两侧的图像会看起来一样。

gamma值测试图片

gamma值测试图片

一旦我们知道了gamma,我们可以校正我们参数:

$$a'=a^{\frac{1}{\gamma}}$$

(译注:a是我们想要的真实亮度,而a’是显示器的输入亮度。)

另一个要注意的重要特性是,显示器需要量化的输入值。你需要将亮度[0,1]转换为定长整数值,比如[0-255]。

3.3 RGB颜色

RGB颜色空间的基本思想:不同颜色借助红、绿、蓝三种原色光的混合而显示。这些光以“加性”的行为混合。

你可能在小学学过三原色是红、黄、蓝,这是一种“减性”的混合方式,与显示的“加性”混合有根本上的不同。

每种原色光强度范围从0到1,我们可以组合出所有能在RGB显示器中展示的颜色。

实际的RGB等级经常以量化形式提供,每个分量是一个0到255的整数,三个整数一共占用24位。因此,一个24位彩色系统中的每种原色共有256个等级。

3.4 Alpha合成

我们经常会想要对一个像素进行部分地覆写,比例在合成中一个常见的例子,我们想在一个背景中插入前景图像。

在背景上混合一个前景物体时,所需要的最重要的一部分信息是pxel coverage,它指示了一个像素被前景图层覆盖掉的比例,我们称之为\(\alpha\)。

如果我们想在背景色\(c_{b}\)上对前景色\(c_{f}\)进行混合,像素被前景遮盖的比例为\(\alpha\),我们可以使用这个公式:

$$c=\alpha c_{f}+(1-\alpha)c_{b}$$

这个\(\alpha\)值可能被存储在一张独立的灰度图中,这个灰度图叫做"alpha蒙版(alpha mask)“或者”transparency mask"。或者,这个信息也可存储为RGB图像的第四个分量,它叫做"alpha通道(alpha channel)"。

3.4.1 图像存储

为减少存储占用,许多图像格式允许进行一些压缩,这样的压缩是“有损”或“无损”的。

常见的图像格式有:

  • jpeg:有损,通过阈值对图像块进行压缩。
  • tiff:最常用于二值图像,或无损压缩的8/16位RGB图像。
  • ppm:无压缩、无损格式。
  • png:无损格式,有许多开源管理工具。

标准格式的图像输入/输出通常可使用代码库实现,对于简洁大于性能的小应用,使用原生ppm文件会很简单,通过直接将内存数据写入文件,追加上合适的文件头即可。