3 光栅图像

大多数计算机图形图像以某种光栅显示方式呈现给用户。光栅显示将图像显示为像素的矩形阵列。普通像素是“图片元素”的缩写。例如,平板电脑显示器或电视,它有一个发光像素的矩形阵列,可以单独设置为不同的颜色,用于创建任何所需的图像。通过混合不同强度的红光、绿光和蓝光,可以获得不同的颜色。大多数打印机,如激光打印机和喷墨打印机都是光栅设备。它们通过扫描没有像素的物理网格,通过在网格上的选定点沉积墨水按顺序排列形成图片。

光栅也普遍存在于图像输入设备中。数码相机包含一个图像传感器,该传感器由感光像素组成,每个像素记录落在其上的光的颜色和强度。桌面扫描仪包含一个像素线性阵列,扫描页面时,每秒进行多次测量以生成像素网格。

由于光栅在设备中非常普遍,因此光栅图像是存储和处理图像的最常用方式。光栅图像只是一个2D数组,用于存储每个像素的像素值,通常是存储为三个数字的颜色,分别为红色、绿色和蓝色。存储在存储器中的光栅图像可以通过使用存储图像中的每个像素来控制显示器的一个像素的颜色来显示。

但是我们并不总是希望以这种方式显示图像。 我们可能想要更改图像的大小或方向、校正颜色,甚至显示粘贴在移动的 3 维表面上的图像。 即使在电视中,显示器的像素数也很少与所显示的图像相同。 诸如此类的考虑破坏了图像像素和显示像素之间的直接联系。 最好将光栅图像视为要显示的图像的独立于设备的描述,而显示设备则是近似理想图像的一种方式。

除了使用像素阵列之外,还有其他描述图像的方法。矢量图像是不参考任何特定的像素网格,通过存储形状的描述(由线条或曲线界定的颜色区域)来描述。 从本质上讲,这相当于存储显示图像的指令,而不是显示它所需的像素。 矢量图像的主要优点是它们与分辨率无关,并且可以在非常高分辨率的设备上很好地显示。 相应的缺点是它们必须经过光栅化才能显示。 矢量图像通常用于文本、图表、机械绘图和其他应用,在这些应用中,清晰度和精度很重要,不需要摄影图像和复杂的阴影。

在本章中,我们讨论光栅图像和显示的基础知识,特别关注标准显示的非线性。 当我们在后面的章节中讨论计算图像时,必须注意像素值与光强度相关的细节。

3.1 光栅设备

在抽象地讨论光栅图像之前,请先了解使用这些图像的某些特定设备的基本操作。一些常见的光栅设备可分为简单的层次结构:

  • 输出
    • 显示

    • 透射式:液晶显示(LCD)

    • 发射型:发光二极管(LED)显示

    • 硬拷贝

    • 二进制:喷墨打印机

    • 连续色调:热升华打印机
  • 输入

    • 二维阵列传感器:数码相机
    • 一维阵列传感器:平板扫描仪

3.1.1 显示

当前的显示器,包括电视和数字电影放映机,以及计算机显示器和放映机,几乎都是基于固定的像素阵列。它们可以分为发射型显示器和透射型显示器,发射型显示器使用直接发射可控光量的像素,透射型显示器中像素本身不发光,而是改变允许通过它们的光量。透射式显示器需要光源照明,在直视显示器中,这是阵列后面的背光;在投影仪中,它是一种发出光线的灯,光线通过阵列后投射到屏幕上。发射显示器是它自己的光源。

发光二极管 (LED) 显示器是发射型的一个例子。 每个像素由一个或多个 LED 组成,这些 LED 是半导体器件(基于无机或有机半导体),其发光强度取决于通过它们的电流(见图 3.1)

彩色显示器中的像素分为三个独立控制的子像素:一个红色、一个绿色和一个蓝色,每个子像素都有自己的LED,使用不同的材料制成,以便它们发射不同颜色的光(图3.2)。当从远处观看显示器时,人眼无法将各个子像素分开,感知的颜色是红色、绿色和蓝色的混合色。

液晶显示器(LCD)是透射型的一个示例。液晶是一种材料,其分子结构使其能够旋转通过它的光的偏振,并且旋转的程度可以通过施加电压来调节。LCD像素(图3.3)后面有一层偏振膜,所以它被偏振光照亮——假设它是水平偏振的。

像素前面的第二层偏振膜定向为仅传输垂直偏振光。如果施加的电压被设置为使中间的液晶层不改变偏振,则所有光被阻挡,并且像素处于“关闭”(最小强度)状态。如果电压设置为使液晶将偏振旋转90度,那么所有从像素背面射入的光都将从正面逃逸,并且像素完全“打开”——它具有最大强度。中间电压将部分旋转偏振,使前偏振器部分阻挡光,导致强度介于最小值和最大值之间(图3.4)。与彩色LED显示器一样,彩色LCD在每个像素内都有红色、绿色和蓝色子像素,它们是三个独立的像素,上面有红色、绿色和蓝色滤光片。

具有固定像素网格的任何类型的显示器,包括这些和其他技术,其分辨率基本上是固定的,由网格的大小决定。对于显示器和图像,分辨率只是指像素网格的尺寸:如果桌面显示器的分辨率为1920×1200像素,这意味着它有2304000像素,排列在1920列和1200行中。

不同分辨率的图像要填满屏幕,必须使用第 9 章的方法转换为 1920 × 1200 的图像。

3.1.2 硬拷贝设备

在纸上永久记录图像的过程与在显示器上马上显示图像的限制非常不同。 在印刷中,颜料分布在纸或其他介质上,以便当光线从纸反射形成所需的图像。 打印机是像显示器一样的光栅设备,但许多打印机只能打印二进制图像,颜料在每个网格位置要么沉积要么不沉积,不可能有中间选择。

喷墨打印机(图3.5)是通过扫描形成光栅图像的设备示例。喷墨打印头包含带有颜料的液体墨水,可以在电子控制下以非常小的液滴喷射颜料。磁头在纸张上移动,当它经过应该接收墨水的网格位置时,水滴会发射出来;在空白的区域不排放墨水。每次扫完后,纸张稍微向前推进,然后处理下一行网格。彩色打印是使用几个打印头进行的,每个打印头都会喷洒不同颜料的墨水,因此每个网格位置都可以接收不同颜色滴的任意组合。因为所有滴都是相同的,喷墨打印机打印二进制图像:在每个网格点上有滴或没有滴;没有中间色调。

喷墨打印机没有物理像素阵列;分辨率取决于水滴的大小以及每次扫描后纸张的前进距离。许多喷墨打印机在打印头上有多个喷嘴,可以在一次扫描中进行多次扫描,但最终决定行间距的是纸张前进间距,而不是喷嘴间距。

热染料转移过程是连续色调打印过程的一个例子,这意味着可以在每个像素上沉积不同数量的染料——它不像喷墨打印机那样全有或全无(图 3.6)。 包含彩色染料的供体色带被压在纸或染料接收器和包含线性阵列加热元件的打印头之间,每个加热元件用于图像中的每一列像素。 当纸和色带经过打印头时,加热元件会打开和关闭,在需要染色的区域加热色带,让染料从色带扩散到纸张上。 对几种染料颜色中的每一种都重复此过程。 由于较高的温度会导致更多的染料转移,因此可以控制沉积在每个网格位置的每种染料的量,从而可以产生连续范围的颜色。 打印头中加热元件的数量在整个页面的方向上建立了固定的分辨率,但沿页面的分辨率由加热和冷却速率与纸张速度相比决定。

与显示器不同,打印机的分辨率是根据像素密度而不是像素总数来描述的。 因此,在具有每英寸 300 个元素打印头的热染料转移打印机在整个页面上具有每英寸 300 个像素 (ppi) 的分辨率。 如果选择沿页面的分辨率相同,我们可以简单地说打印机的分辨率为 300 ppi。 将点放置在每英寸 1200 个网格点的网格上的喷墨打印机被描述为具有每英寸 1200 个点 (dpi) 的分辨率。 由于喷墨打印机是二进制设备,因此至少出于两个原因需要更精细的网格。 由于边缘是黑/白边界,因此需要非常高的分辨率以避免出现阶梯状步进或混叠(参见第 8.3 节)。 打印连续色调图像时,需要通过打印称为半色调的不同密度点图案来模拟中间色的高分辨率。

3.1.3 输入设备

光栅图像必须来自某个地方,任何不是由某种算法计算的图像都必须由某种光栅输入设备测量,最常见的是相机或扫描仪。 即使在渲染 3D 场景图像时,照片也经常用作纹理贴图(参见第 11 章)。 光栅输入设备必须对每个像素进行光测量,并且(与输出设备一样)它们通常基于传感器阵列。

数码相机是二维阵列输入设备的一个例子。 相机中的图像传感器是具有光敏像素网格的半导体器件。 两种常见类型的阵列称为 CCD(电荷耦合器件)和 CMOS(互补金属氧化物半导体)图像传感器。 相机的镜头将要拍摄的场景图像投射到传感器上,然后每个像素测量落在其上的光能,最终产生一个数字,并进入输出图像(图 3.7)。 与彩色显示器使用红色、绿色和蓝色子像素的方式大致相同,大多数彩色相机通过使用滤色器阵列或马赛克来工作,让每个像素只能看到红色、绿色或蓝色光,而让图像处理软件 在称为去马赛克的过程中填充缺失值(图 3.8)。

其他相机使用三个独立的阵列或阵列中的三个独立层来测量每个像素的独立红色、绿色和蓝色值,无需进一步处理即可生成可用的彩色图像。 相机的分辨率由阵列中的固定像素数决定,通常使用像素总数来引用:具有 3000 列和 2000 行的阵列的相机产生分辨率为 3000 × 2000 的图像,其中有 6 百万像素,称为 6 兆像素 (MP) 相机。 重要的是要记住,马赛克传感器不能测量完整的彩色图像,因此,与使用马赛克传感器的相机相比,测量相同像素数但具有独立的红色、绿色和蓝色测量值的相机记录的有关图像的信息更多。

平板扫描仪还测量每个像素网格的红色、绿色和蓝色值,但与热染料转移打印机一样,它使用一维阵列扫过被扫描页面,每秒进行多次测量。 页面上的分辨率由阵列的大小决定,页面上的分辨率由测量频率与扫描头移动速度的比较决定。 彩色扫描仪有一个 3 × nx 阵列,其中 nx 是整个页面的像素数,其中三行由红色、绿色和蓝色过滤器覆盖。 通过测量三种颜色的时间之间的适当延迟,这允许在每个网格点进行三个独立的颜色测量。 与连续色调打印机一样,扫描仪的分辨率以每英寸像素 (ppi) 为单位报告。

有了这些关于我们的图像来自哪里以及它们将去哪里的具体信息,我们现在将更抽象地讨论图像,就像我们在图形算法中使用它们的方式。

3.2 图像,像素和几何

我们知道光栅图像是一个大的像素阵列,每个像素都存储有关图像在其网格点处的颜色信息。 我们已经看到了各种输出设备如何处理我们发送给它们的图像,以及输入设备如何从物理世界中光形成的图像中获取它们。 但是对于计算机中的计算,我们需要一个方便的抽象,它独立于任何设备的细节,我们可以用它来推理如何产生或解释存储在图像中的值。

当我们测量或再现图像时,它们采用光能的二维分布形式:显示器发出的光是显示器表面上位置的函数; 落在相机图像传感器上的光线是传感器平面上位置的函数; 作为一张纸上位置的函数的反射率或反射光的分数(与吸收相反)。 因此,在物理世界中,图像是在二维区域(几乎总是矩形)上定义的函数。 所以我们可以将图像抽象为一个函数:

$I\left ( x, y\right) :R\to V,其中R\subset R^{2} 是矩形区域,V是像素点的集合。最简单的情况是一个理想化的灰度图像,其中矩形中的每个点只有一个亮度(没有颜色),然后我们可以说V = R^{+} 。一个理想化的彩色图像,在每个像素处都有红色、绿色和蓝色的值,V = R^{+} 。我们将在下一节讨论V的其他可能性。

栅格图像与连续图像的抽象概念有什么关系?从具体的例子来看,来自相机或扫描仪的像素是对像素周围某个小区域上图像的平均颜色的测量。显示像素(包括其红色、绿色和蓝色的子像素)的设计使该像素表面上的图像的平均颜色由光栅图像中相应的像素值控制。在这两种情况下,像素值都是图像颜色的局部平均值,它被称为图像的点样本。换句话说,当我们在一个像素中找到x值时,这意味着“在这个网格点附近的图像的值是x”。图像作为函数的采样表示的思想将在第9章中进一步探讨。

一个普通但重要的问题是像素在2D空间中的位置。这只是一个惯例,但建立一个一致的惯例是重要的。在这本书中,光栅图像是由表示像素的列(i)和行(j)的对(i, j)索引的,从左下角开始计数。如果图像有nx列和ny行像素,则左下角像素为(0,0),右上角像素为(nx−1,ny−1)。我们需要2D真实屏幕坐标来指定像素位置。我们将像素的采样点放置在整数坐标上,如图3.10中的4 × 3屏幕所示。

图像的矩形域的宽度为nx,高度为ny,并以网格为中心,这意味着它在每边的最后一个采样点之外扩展了半个像素。所以nx × ny的矩形域是R = \left [ -0.5,n_{x}-0.5 \right ] \times \left [ -0.5,n_{y} -0.5 \right ]$

同样,这些坐标只是约定,但是在以后实现摄像机和视图转换时记住它们很重要。

3.2.1 像素值

到目前为止,我们已经用实数来描述像素的值,表示图像中某一点的强度(可能分别表示红色、绿色和蓝色)。这表明图像应该是浮点数数组,每个像素存储一个(用于灰度或黑白图像)或三个(用于RGB彩色图像)32位浮点数。当需要它的精度和值的范围时,有时会使用这种格式,但图像有很多像素,存储和传输图像的内存和带宽总是很少。在这种格式下,一张1000万像素的照片就需要115 MB的内存。

对于直接显示的图像,需要更小的范围。虽然可能的光强度范围在原则上是无界的,但任何给定的设备都有一个绝对有限的最大强度,所以在许多情况下,像素有一个有界的范围是完全足够的,通常为简单起见,取为[0,1]。例如,一个8位图像的可能值是0,1/255,2/255,…, 254/255, 1。使用浮点数存储的图像允许使用大范围的值,通常称为高动态范围(HDR)图像,以区别于使用整数存储的固定范围或低动态范围(LDR)图像。参见第21章,深入讨论高动态范围图像的技术和应用。

以下是一些典型应用中的像素格式:

  • 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图像的通用中间格式。

减少用于存储每个像素的比特数会导致图像中出现两种不同类型的伪影,或人为引入缺陷。首先,当将亮度大于最大值的像素设置为最大可表示值时,使用固定范围值对图像进行编码产生裁剪。例如,一张阳光场景的照片可能包含比白色表面更亮的反射;当图像被转换到要显示的固定范围时,这些将被剪辑(即使它们是由相机测量的)。其次,当需要将像素值四舍五入到最接近的可表示值时,编码精度有限的图像会导致量化伪影或条带,从而在强度或颜色上引入可见的跳跃。在动画和视频中,条带可能是特别阴险的,在静态图像中,条带可能不是令人反感的,但当它们来回移动时,就变得非常明显。

3.2.2 监测强度和伽玛

所有现代显示器都采用数字输入的像素“值”,并将其转换为强度级别。真正的显示器在关闭时有一些非零的强度,因为屏幕反射一些光。出于我们的目的,我们可以将此“黑色”和完全打开的显示器视为“白色”。我们假设像素颜色的数值描述范围从0到1。黑色是0,白色是1,介于黑色和白色之间的灰色是0.5。注意,这里的“中间”指的是来自像素的物理量,而不是外观。人类对强度的感知是非线性的,目前不讨论这个问题,详见第20章。

要想在监视器上生成正确的图像,必须了解两个关键问题。第一,监视器对于输入是非线性的。例如,如果给一个显示器0、0.5和1.0作为三个像素的输入,显示的强度可能是0、0.25和1.0(关闭,四分之一完全打开,和完全打开)。作为这种非线性的近似表征,监视器通常用\gamma(“gamma”)值来表征。这个值就是公式中的自由度:

$\text { displayed intensity }=(\text { maximum intensity }) a^{\gamma}其中a为0到1之间的输入像素值。例如,如果显示器的伽玛值为2.0,而我们输入值a = 0.5,则显示的强度将是最大可能强度的四分之一,因为0.5^{2} = 0.25。注意,a = 0映射到零强度,a = 1映射到最大强度,与\gamma 值无关。用\gamma 描述显示器的非线性只是一个近似值;我们不需要很精确地估计一个装置的\gamma 值。衡量非线性的一个很好的视觉方法是找到a在黑白之间的强度值。a将会是:0.5 = a^{\gamma }如果我们能找到a,我们可以通过两边取对数来推导\gamma :\gamma = \frac{ln0.5}{lna}我们可以通过标准技术找到这个a,我们在输入a的灰色像素正方形旁边显示一个黑白像素的棋盘图案(图 3.11),然后要求用户调整 a(例如,使用滑块) 直到两侧的平均亮度匹配。 当您从远处观看此图像时(如果您近视,则不戴眼镜),当 a产生介于黑白之间的强度时,图像的两侧看起来大致相同。这是因为模糊的棋盘混合了偶数个白色和黑色像素,因此整体效果是介于白色和黑色之间的均匀颜色。

一旦我们知道\gamma ,我们就可以对输入进行\gamma 校正,以便显示a=0.5的值,强度介于黑白之间。这是通过转换完成的:a^{\prime } = a^{\frac{1}{\gamma } }$

当这个公式插入方程(3.1)时,我们得到:

\begin{aligned}
\text { displayed intensity } &=\left(a^{\prime}\right)^{\gamma}=\left(a^{\frac{1}{\gamma}}\right)^{\gamma} \text { (maximum intensity) } \\
&=a(\text { maximum intensity })
\end{aligned}

真实显示器的另一个重要特征是它们采用量化的输入值。 因此,虽然我们可以在浮点范围 [0, 1] 内操纵强度,但监视器的详细输入是固定大小的整数。 这个整数最常见的范围是 0-255,它可以保存在 8 位存储中。 这意味着 a 的可能值不是 [0, 1] 中的任何数字,而是

\text { possible values for } a=\left\{\frac{0}{255}, \frac{1}{255}, \frac{2}{255}, \ldots, \frac{254}{255}, \frac{255}{255}\right\}

这意味着可能的显示强度值大约是:

\left\{M\left(\frac{0}{255}\right)^{\gamma}, M\left(\frac{1}{255}\right)^{\gamma}, M\left(\frac{2}{255}\right)^{\gamma}, \ldots, M\left(\frac{254}{255}\right)^{\gamma}, M\left(\frac{255}{255}\right)^{\gamma}\right\}

其中 M 是最大强度。 在需要控制精确强度的应用中,我们必须实际测量 256 种可能的强度,这些强度在屏幕上的不同点可能会有所不同,尤其是对于 CRT。 它们也可能随视角而变化。 幸运的是,很少有应用需要如此精确的校准。

3.3 RGB颜色

大多数计算机图形图像是根据红绿蓝 (RGB) 颜色定义的。 RGB 颜色是一个简单的空间,可以直接转换为大多数计算机屏幕的控件。 在本节中,从用户的角度讨论 RGB 颜色,以操作便利为目标。 第 19 章对颜色进行了更深入的讨论,但 RGB 颜色空间的机制将使我们能够编写大多数图形程序。 RGB色彩空间的基本思想是通过混合三种原色光来显示颜色:红绿蓝。 灯光以加法方式混合。

在RGB加色混合中,我们有(图3.12):

\begin{aligned}
\text { red }+\text { green } &=\text { yellow }, \\
\text { green }+\text { blue } &=\text { cyan }, \\
\text { blue }+\text { red } &=\text { magenta }, \\
\text { red }+\text { green }+\text { blue } &=\text { white } .
\end{aligned}

“青色”是蓝绿色,“洋红”是紫色。

如果允许我们将主灯光从完全关闭(由像素值0指示)变暗到完全打开(由1指示),我们可以创建可在RGB监视器上显示的所有颜色。红色、绿色和蓝色像素值创建具有红色、绿色和蓝色轴的三维RGB颜色立方体。轴的坐标范围为0到1。颜色立方体如图3.13所示。

立方体角落的颜色是:

\begin{aligned}
\text { black } &=(0,0,0) \\
\text { red } &=(1,0,0) \\
\text { green } &=(0,1,0) \\
\text { blue } &=(0,0,1) \\
\text { yellow } &=(1,1,0) \\
\text { magenta } &=(1,0,1) \\
\text { cyan } &=(0,1,1) \\
\text { white } &=(1,1,1)
\end{aligned}

实际的 RGB 级别通常以量化形式给出,就像第 3.2.2 节中讨论的灰度一样。 每个组件都用一个整数指定。 这些整数最常见的大小是每个一个字节,因此三个 RGB 分量中的每一个都是 0 到 255 之间的整数。三个整数一起占用三个字节,即 24 位。 因此,具有“24 位颜色”的系统对于三种原色中的每一种都有 256 种可能的级别。 第 3.2.2 节中讨论的伽马校正问题也分别适用于每个 RGB 分量。

3.4 透明度合成

通常我们只想部分覆盖像素的内容。 一个常见的例子发生在合成中,我们有一个背景,并想在它上面插入一个前景图像。 对于前景中的不透明像素,我们只需替换背景像素。 对于完全透明的前景像素,我们不会更改背景像素。 对于部分透明的像素,必须小心。 当前景对象具有部分透明区域(例如玻璃)时,可能会出现部分透明像素。 但是,必须混合前景和背景的最常见情况是当前景对象仅部分覆盖像素时,要么位于前景对象的边缘,要么存在子像素孔,例如远处树的叶子之间。

将前景对象与背景对象混合所需的最重要信息是像素覆盖率,它告诉前景层覆盖的像素所占的比例。 我们可以称这个分数为\alpha。如果我们想要在背景色c_{b}上合成前景色c_{f},并且前景覆盖的像素部分是\alpha,那么我们可以使用公式:

\mathbf{c}=\alpha \mathbf{c}_{f}+(1-\alpha) \mathbf{c}_{b}

对于不透明的前景层,解释为前景对象覆盖像素矩形内的区域 \alpha,背景对象覆盖剩余区域,即 (1 -\alpha )。 对于透明层(想想在玻璃或描图纸上绘制的图像,使用半透明涂料),解释是前景层阻挡了来自背景的光的分数 (1 -\alpha ) 并贡献了分数 \alpha 用它自己的颜色来代替被移除的东西。 图 3.14 显示了使用公式 (3.2) 的示例。

图像中所有像素的 \alpha值可能存储在单独的灰度图像中,然后称为 alpha 蒙版或透明度蒙版。或者信息可以存储为RGB图像中的第四个通道,在这种情况下,它被称为alpha通道,该图像可以被称为RGBA图像。对于 8 位图像,每个像素占用 32 位,这在许多计算机体系结构中是一个方便大小的块。

虽然方程式(3.2)是通常使用的,但在各种情况下,α的使用方式不同(Porter&Duff,1984)。

3.4.1 图像存储

大多数 RGB 图像格式的红色、绿色和蓝色通道各使用 8 位。 这导致单个百万像素图像的原始信息大约为 3 兆字节。 为了减少存储需求,大多数图像格式都允许进行某种压缩。 在较高级别上,这种压缩要么是无损的,要么是有损的。 在无损压缩中没有信息被丢弃,而在有损系统中一些信息会不可恢复地丢失。 流行的图像存储格式包括:

  • jpeg:这种有损格式根据人类视觉系统中的阈值压缩图像块。 这种格式适用于自然图像。
  • tiff:尽管存在许多其他选项,但此格式最常用于保存二进制图像或无损压缩的 8 位或 16 位 RGB。
  • ppm:尽管存在许多选项,但这种非常简单的无损、未压缩格式最常用于 8 位 RGB 图像。
  • png:这是一种有一套良好的开源管理工具的无损格式。

由于压缩和变体,可能需要编写图像的输入/输出例程。幸运的是,人们通常可以依靠库例程来读写标准文件格式。对于那些简单性高于效率的快速脏应用程序,一个简单的选择是使用原始ppm文件,通常只需将存储在内存中的图像的数组转储到一个文件中,并在适当的头之前加上前缀,即可编写原始ppm文件。

常见问题

他们为什么不让显示器线性化并避免所有这些伽马业务?

理想情况下,监视器的 256 种可能强度看起来应该均匀分布,而不是在能量上呈线性分布。 由于人类对强度的感知本身是非线性的,因此 1.5 到 3 之间的伽玛值(取决于观看条件)将使主观意义上的强度大致均匀。 这样,伽马就是一个特征。 否则制造商会使显示器线性化。