显示图像
数字图像的原始形式只是一个数值数组。为了能够直观地感知,这些抽象的数值必须被映射为显示设备产生的物理光强度。
现代数字显示器由像素网格构成,每个像素通常由三个主要的发光元件或荧光体组成:一个红色(R)、一个绿色(G)和一个蓝色(B)。通过改变这三种基色的各自强度,单个像素可以产生多种多样的颜色。
将像素的数值数据转换为屏幕上特定颜色或灰度强度的过程由一个映射规则控制。这个规则通常通过**颜色映射表(colormap)或查找表(Look-Up Table, LUT)**来实现。
显示技术:从CRT到LCD¶
虽然像素网格是一个抽象概念,但其物理实现已经历了显著的演变。几十年来,主流的显示技术是阴极射线管(Cathode-Ray Tube, CRT),它使用聚焦的电子束撞击磷光屏,使单个点发光。

Figure 1:阴极射线管(CRT)示意图。
现代显示器主要是平板技术,其中液晶显示器(Liquid Crystal Display, LCD)是最常见的类型之一。与自发光的CRT不同,LCD是一种透射式显示器。它本身不发光,而是通过调制来自独立背光的光线来工作。

Figure 2:典型LCD面板的层状组件。
LCD的工作原理基于其分层结构,如 Figure 3 所示。其关键原理如下:
背光:一个均匀的白光源放置在显示器的后部。
偏振片:两片偏振滤光片放置在液晶层的两侧。它们的偏振轴相互垂直(90度)。仅凭这对偏振片会阻挡所有光线。
液晶层:该层填充有液晶,通过施加电压可以使其分子“扭曲”或“不扭曲”。
无电压(像素亮):液晶处于扭曲状态。当来自第一个偏振片的光线通过时,液晶会将其偏振轴旋转90度。这使得光线能够穿过第二个偏振片,像素看起来是亮的。
施加电压(像素暗):液晶分子解开扭曲并自行对齐。它们不再旋转光线,因此光线被第二个偏振片阻挡,像素看起来是暗的。像素的亮度通过改变电压来控制。
彩色滤光片:一个由微小的红、绿、蓝滤光片组成的阵列被放置在子像素之上。通过控制每个R、G、B子像素的亮度,就能形成一幅全彩图像。

Figure 3:LCD像素的工作原理。来自背光的光线通过偏振片和电压控制的液晶层的组合,被阻挡或通过。
显示二维灰度图像¶
二维灰度图像是单通道图像(),其中每个像素的值代表一个强度。显示这类图像最直接的方法是将其强度范围[0, 255]映射到从黑到白的灰度级别范围。这可以通过灰度颜色映射表实现。
然而,我们也可以使用其他颜色映射表来可视化相同的强度数据。这种技术被称为伪彩色或假彩色,它为每个强度值分配一个特定的颜色。虽然底层数据仍然是灰度图像,但可视化利用颜色来增强对微小强度变化的感知。Figure 4 展示了这一概念。
Figure 4:巴兹·奥尔德林的一张灰度图像,使用不同的颜色映射表显示。三种可视化的底层像素数据完全相同。
请注意,尽管 Figure 4 中最右侧的图像以彩色显示,但它本质上仍然是单通道灰度图像的一种表示。
伪彩色是一种强大的分析工具,尤其在科学和医学成像领域,它可以使感兴趣的特征更加突出。下面的代码演示了jet颜色映射表如何揭示在使用标准gray颜色映射表时几乎看不见的微弱斑点。在显示前对强度值应用非线性变换(如对数变换),对于增强暗部区域的对比度也非常有效,这在直方图变换一章中有更详细的讨论。
import numpy as np
import skimage.io as io
import matplotlib.pyplot as plt
# Load the image
img = io.imread("../_static/figs/spots.png")
# Prepare the figure with three images
fig, axs = plt.subplots(1, 3, figsize=(15, 7))
# Arguments for colorbar
kwargs = { "orientation":"horizontal", "pad": 0.05, "shrink": 1.0 }
# Display the image with colormap gray
im = axs[0].imshow(img, cmap="gray")
axs[0].set_title("Colormap 'gray'")
fig.colorbar(im, ax=axs[0], ticks=[0, 64, 128, 192, 255], **kwargs)
# Display the image with colormap jet
im = axs[1].imshow(img, cmap="jet" )
axs[1].set_title("Colormap 'jet'")
fig.colorbar(im, ax=axs[1], ticks=[0, 64, 128, 192, 255], **kwargs)
# Display the logarithm of the image
img_log = np.log(1. + img)
im = axs[2].imshow(img_log, cmap="gray")
axs[2].set_title("Logarithm with colormap 'gray'")
fig.colorbar(im, ax=axs[2], ticks=np.arange(6), **kwargs)
# Show the figure
plt.show()
显示二维彩色图像:RGB颜色模型¶
与灰度图像不同,真彩色图像在多个通道()中包含明确的颜色信息。数字颜色的主导标准是RGB颜色模型,这是一种加色模型。
在此模型中,每个像素由一个三元组值 表示,分别对应红、绿、蓝三种基色的强度。显示RGB图像时,这些值直接控制屏幕上相应红、绿、蓝荧光体的强度。像素最终呈现的颜色是这三种基色光相加混合的结果。例如:
产生黑色(无光)。
产生白色(所有基色均为最大强度)。
产生纯红色。
产生黄色(红色和绿色的混合)。
因为每个通道的值都直接映射到对应的基色,所以标准的RGB图像显示时不需要颜色映射表。像素值本身已经以与显示硬件直接兼容的方式编码了颜色信息。
显示多通道和体数据图像¶
对于非标准灰度或RGB的图像,可视化需要特定的策略,将其高维数据映射成可在二维屏幕上渲染的格式。
多通道图像 (B > 3)¶
对于超过三个通道的图像,如多光谱或高光谱数据,没有直接的方法可以同时显示所有信息。常见的可视化技术包括:
通道选择: 从可用通道中选择三个,并将它们映射到显示的R、G、B通道。这在遥感中常用于创建假彩色合成图,以突出特定地物。例如,将近红外(NIR)通道映射为红色,可以使健康的植被呈现鲜红色,因为它在近红外波段反射率很高。
降维: 使用主成分分析(PCA)等技术,将高维通道数据转换为三个能捕捉最大方差的新分量。然后,这三个主成分可以作为RGB图像显示。
体数据图像 (d=3)¶
可视化三维体数据,如MRI或CT扫描数据,也需要将数据映射到二维。常用方法包括:
切片: 沿其中一个轴(轴向、矢状或冠状)显示体积的单个二维切片。这是医学成像软件中最常用的方法。
体绘制: 这是一种更先进的技术,将体积视为半透明对象。光线投射穿过体积,沿每条光线累积颜色和不透明度,形成二维投影。这可以提供更整体、更具三维感的数据视图。