我们知道,光栅图像是一个大的像素阵列,每一个像素都存储着其网格点上的图像颜色信息。我们已经看到了各种输出设备是如何处理我们发送给它们的图像的,以及输入设备是如何从物理世界中由光形成的图像中得到它们的。但对于计算机中的计算,我们需要一个方便的抽象,它独立于任何设备的具体细节,我们可以用它来推理如何产生或解释存储在图像中的值。
当我们测量或复制图像时,它们采取的是光能的二维分布形式:显示器发出的光是显示器表面位置的函数;落在相机图像传感器上的光是传感器平面上位置的函数;反射率,或反射(相对于吸收)的光的分数是一张纸上位置的函数。因此,在物理世界中,图像是定义在二维区域的函数--几乎总是矩形。因此,我们可以把图像抽象为一个函数
I(x, y) : R → V ,
其中R⊂$ℝ^2$是一个矩形区域,V是可能的像素值的集合。最简单的情况是一个理想化的灰度图像,矩形中的每个点只有亮度(没有颜色),我们可以说V = $ℝ^+$(非负实数)。一个理想化的彩色图像,每个像素都有红、绿、蓝三色的数值,其V=$(ℝ+)^3$。我们将在下一节讨论V的其他可能性。是否有任何非矩形的光栅设备?光栅图像与这个连续图像的抽象概念有什么关系?从具体的例子来看,来自相机或扫描仪的像素是对该像素周围一些小区域的图像的平均颜色的测量。一个具有红、绿、蓝子像素的显示像素被设计成在像素面上的图像的平均颜色由光栅图像中的相应像素值控制。在这两种情况下,像素值都是图像颜色的局部平均值,它被称为图像的点样本。换句话说,当我们在一个像素中找到值x时,意味着 "这个网格点附近的图像值是x。"图像作为函数的采样表示的想法将在第十章进一步探讨。

图3.10. 一个四像素×三像素屏幕的坐标。请注意,在某些API中,Y轴会指向下方。
一个平凡但重要的问题是像素在二维空间中的位置。这只是一个约定俗成的问题,但建立一个一致的约定是很重要的! 在本书中,光栅图像的索引是由一对(i,j)表示像素的列(i)和行(j),从左下方开始计算。如果一幅图像有$n_x$列和$n_y$行的像素,左下角的像素是(0,0),右上角的像素是($n_x$- 1,$n_y$ - 1)。我们需要2D真实屏幕坐标来指定像素的位置。我们将把像素的采样点放在整数坐标上,如图3.10中的4×3屏幕所示。在一些API和许多文件格式中,图像的行是从上到下组织的,所以(0,0)在左上角。这是由于历史原因:模拟电视传输中的行是从顶部开始的。图像的矩形域的宽度为$n_x$,高度为$n_y$,并以这个网格为中心,也就是说,它在每一侧的最后一个采样点之外延伸了半个像素。因此,$n_x$× $n_y$图像的矩形域为
有些系统将坐标移动半个像素,将采样点放在整数的中间位置,但将图像的边缘放在整数上。
R − [−0.5, $n_x$ − 0.5] × [0.5, $n_y$ − 0.5].
同样,这些坐标只是简单的约定,但它们在以后实现摄像机和视图转换时非常重要。像素值
到目前为止,我们已经用实数描述了像素值,表示图像中某一点的强度(可能分别表示红、绿和蓝)。这意味着图像应该是浮点数的数组,每像素存储一个32位浮点数(对于灰度或黑白图像)或三个32位浮点数(对于RGB彩色图像)。当需要它的精度和取值范围时,有时会使用这种格式,但图像有大量的像素,存储和传输图像的内存和带宽总是很少。在这种格式下,仅仅一张一千万像素的照片就会消耗大约115mb的内存。 直接显示的图像所需的范围更小。虽然原则上可能的光强度范围是无界的,但任何给定的设备都有一个明确的有限的最大强度,所以在许多情况下,像素有一个有界的范围是完全足够的,为了简单起见,通常将其设为[0,1]。例如,8位图像中可能的值为0,1/255,2/255,…, 254/255, 1。用浮点数存储的图像(允许大范围的值)通常被称为高动态范围(HDR)图像,以区别于用整数存储的固定范围或低动态范围(LDR)图像。关于高动态范围图像的技术和应用的深入讨论见第20章。 下面是一些具有典型应用的像素格式。为什么是115mb而不是120mb ?
分母是255,而不是256,这很尴尬,但能够准确表示0和1是很重要的。
- 1位 灰度-文本和其他不需要中间灰度的图像(需要高分辨率)。
- 8位 RGB固定范围色彩(每个像素共24位)--网络和电子邮件应用,消费者照片。
- 8位或10位 固定范围RGB(24-30位/像素)--计算机显示器的数字接口。
- 12-14位 的固定范围RGB(36-42位/像素)--专业摄影的原始相机图像。
- 16位 固定范围RGB(48位/像素)--专业摄影和印刷;用于固定范围图像处理的中间格式。
- 16位 固定范围灰度(16位/像素)--放射学和医学成像。
- 16位 "半精度 "浮点RGB-HDR图像;用于实时渲染的中间格式。
- 32位浮点RGB-通用中间格式,用于HDR图像的软件渲染和处理。
显示器的强度和伽玛值
所有的现代显示器都是以数字方式输入一个像素的 "值",并将其转换为强度等级。真正的显示器在关闭时有一些非零强度,因为屏幕会反射一些光线。为了我们的目的,我们可以认为这是 "黑色",而显示器完全打开则是 "白色"。我们假设对像素颜色的数字描述从零到一不等。黑色是零,白色是一,介于黑色和白色之间的灰色是0.5。注意,这里的 "一半 "指的是来自像素的物理光量,而不是外观。人类对强度的感知是非线性的,不会成为本讨论的一部分;更多内容见第19章。 要在显示器上产生正确的图像,有两个关键问题必须了解。第一个问题是,显示器对于输入是非线性的。例如,如果你给显示器的三个像素输入0、0.5和1.0,显示的强度可能是0、0.25和1.0(关闭、四分之一全开和全开)。作为这种非线性的近似表征,显示器通常以γ("gamma")值为特征。这个值是公式中的自由度显示的强度=(最大强度)$a^γ$
其中a是0和1之间的输入像素值。例如,如果显示器的伽玛值为2.0,我们输入a=0.5的值,显示的强度将是最大可能强度的四分之一,因为0.$5^2$=0.25。请注意,a = 0映射到零强度,a = 1映射到最大强度,而不考虑γ的值。用γ来描述显示器的非线性只是一个近似值;我们不需要在估计设备的γ时有很大的准确性。衡量非线性的一个很好的视觉方法是,找到a的哪个值可以得到介于黑色和白色之间的强度。这个a将是0.5 = $a^γ$
如果我们能找到那个a,我们就可以通过对两边取对数来推导出γ。γ = $frac{In 0.5}{Ina}$
我们可以通过一个标准的技术找到这个a,即在输入a的灰色像素的正方形旁边显示一个黑白像素的棋盘图案(图3.11),然后要求用户调整a(例如用滑块),直到两边的平均亮度一致。当你从远处看这幅图时(如果你是近视眼,也可以不戴眼镜),当a产生的强度介于黑色和白色之间时,这幅图的两边看起来是差不多的。这是因为模糊的棋盘混合了偶数的白色和黑色像素,所以整体效果是介于白色和黑色之间的统一颜色。 一旦我们知道了γ,我们就可以对我们的输入进行伽马校正,使a=0.5的值在显示时强度介于黑与白之间。这可以通过变换来实现
图3.11. 从远处看黑白交替的像素,是黑与白的一半。显示器的伽玛值可以通过找到一个看起来与黑白图案强度相同的灰色值来推断。
对于模拟接口的显示器来说,很难沿水平方向快速改变强度,水平黑白条纹的效果比棋盘式更好。