跳转至

Graphics and Image Data Representation⚓︎

2324 个字 预计阅读时间 12 分钟

Basic Graphics/Image Types⚓︎

1-Bit Image⚓︎

1 比特图像又称二值图像(binary image) 单色图像(monochrome image)。

特点:

  • 开启和关闭像素组成(像素(pixel):数字图像中的图像元素)
  • 每个像素 1 个比特存储0 表示黑色,1 表示白色

对于一张分辨率(resolution) 640x480 的图像,其存储空间为 640 * 480 / 8 = 38.4 KB

此类图像的用途是作为仅包含简单图形和文本的图片。

8-Bit Grey-Level Image⚓︎

特点:

  • 每个像素由一个字节表示,因此灰度值介于 0 255 之间
  • 整张图像可视为一个二维像素值数组,称为位图(bitmap)

  • 8 比特图像可看作由一组 1 位平面(bitplane) 构成

    • 每个平面包含图像在某一层级上的 1 位表示
    • 所有位平面共同构成一个字节,用于存储 0 255 之间的数值

大小:

  • 分辨率

    • 高分辨率:1600x1200
    • 低分辨率:640x480
    • 宽高比(aspect ratio):4:3
  • 640x480 的灰度图像需要的空间为 640 * 480 = 307,200 字节

  • 存储图像数组的硬件被称为帧缓冲区(framebuffer) 或「视频」卡

Printing⚓︎

用二级(1 比特)打印机打印 8 比特的灰度图像是很复杂的。解决步骤如下:

  • 使用抖动(dithering):将单个像素值替换为更大的模式,例如 2x2 4x4 的网格,使得打印点的数量能够近似模拟半色调印刷(halftone printing)(如报纸照片)中使用的不同大小的墨点
  • 色彩 / 强度分辨率(color/intensity resolution) 转换为空间分辨率(spatial resolution)

    • N * N 的矩阵表示 N^2 + 1 中强度等级,比如 2x2 的模式能表示 5 个等级

    • 首先可以将图像值从 [0, 255] 重新映射到新的范围 [0, 4](通过整除 256 / 5 实现;若像素值为 0,则在打印输出的 2x2 区域内不打印任何点;但若像素值为 4,则打印所有四个点

    • 若强度大于抖动矩阵的对应项,则在该位置打印一个实心点 (an on dot):将每个像素替换为一个 nxn 的点阵
    • 上述方法会增大输出图像大小——如果一个像素使用 4x4 模式处理,那么 NxN 的图像尺寸将变为 4Nx4N,使图像面积扩大 16
  • 一种更好的方法:避免放大输出图像

    • 存储一个整数矩阵(标准模式,值范围仍为 [0, 255]
    • 将灰度图像矩阵与模式进行比较,当值大于灰色值时打印点

下面给出有序抖动算法(采用 nxn 的抖动矩阵

\[ \begin{aligned} \boxed{ &\text{BEGIN} \\ &\quad \text{for } x = 0 \text{ to } x_{max} \quad // \text{ columns} \\ &\quad \quad \text{for } y = 0 \text{ to } y_{max} \quad // \text{ rows} \\ &\quad \quad \quad i = x \bmod n \\ &\quad \quad \quad j = y \bmod n \\ &\quad \quad \quad //\ I(x, y) \text{ is the input, } O(x, y) \text{ is the output,} \\ &\quad \quad \quad //\ D \text{ is the dither matrix.} \\ &\quad \quad \quad \text{if } I(x, y) > D(i, j) \\ &\quad \quad \quad \quad O(x, y) = 1; \\ &\quad \quad \quad \text{else} \\ &\quad \quad \quad \quad O(x, y) = 0; \\ &\text{END} } \end{aligned} \]
例子

在一台 300*300 DPI 的打印机上,将一张图像(240*180*8 位)打印在 12.8*9.6 英寸的纸上,每个像素(点)的大小是多少?

  • (300*12.8) * (300*9.6) = 3480*2880 dots
  • (3840/240) * (2880/180) = 16*16 = 256

使用标准矩阵生成输出图像:

8*6 英寸的纸上打印一张图像(600*450 像素,8 位色深)使用分辨率为 300*300 DPI 的打印机,每个像素点的大小是多少?

  • (300*8) * (300*6) = 2400*1800 dots
  • (2400/600) * (1800/450) = 4*4 => 只有 17 个等级

24-Bit Color Image⚓︎

特点:每个像素使用三个字节,分别代表红绿蓝(RGB,取值范围为 0 255,因此支持 256*256*256 种颜色(共计 16,777,216

大小:

  • 一张 640x480 24 比特彩色图像占 921.6KB(640*480*3)大小
  • 许多 24 位彩色图像实际上以 32 位图像格式存储

    • 每个像素可能还会额外存储 \(\alpha\) ,表示特效信息,比如透明度标志(transparency flag)

    • 半透明图像颜色 = 源图像颜色 * (100% - 透明度 ) + 背景图像颜色 * 透明度

例子

8-Bit Color Image⚓︎

特点:

  • 使用查找表(lookup table, LUT)(调色板(palette))的概念

    • 图像存储的是一组字节,而非实际颜色
    • 字节值作为指向 3 字节颜色表的索引
    • 选择放入表中的颜色至关重要
  • 选取最重要的 256 种颜色,可选的方法有:

    • 通过对 256×256×256 种色彩进行聚类(clustering) 生成
    • 采用中位切分(median-cut) 算法或更精确版本

相比 24 位图像,8 位图像节省了很大的空间。比如一张 640*480 8 位彩色图像仅需 300KB 存储空间,而同等尺寸的彩色图像(同样未应用任何压缩)则需要 921.6KB

例子

Color Lookup Tables⚓︎

8 位彩色图像采用的方法是仅存储每个像素的索引或代码值。例如,若某像素存储值为 25,其含义即指向颜色查找表(LUT)中的第 25 行。

由于 LUT 小于图像,具有速度优势,因此我们可通过调整 LUT 来改变颜色

例子

医学影像(将灰度图转换为彩色图)

How to Devise a Color Lookup Table⚓︎

基本的思路是聚类(clustering),即分析 RGB 色彩的三维直方图,但这是一个计算成本高且耗时的过程,因此不太现实。

24 位色转换为 8 位查找表颜色的最直接的方法是:将 RGB 立方体沿每个维度等分切片。

  • 所得每个小立方体的中心点可作为颜色查找表的条目,而只需将 RGB 范围 [0, 255] 缩放至相应区间即可生成 8 位编码
  • 由于人眼对 R G 的敏感度高于 B,我们可以将 R G 的范围 [0, 255] 压缩至 3 位范围 [0, 7],同时将 B 范围压缩至 2 位范围 [0, 3],从而构成总计 8 位的编码

  • 要压缩 R G 值,只需将 R G 字节值除以 (256/8)=32 后截断取整,这样图像中的每个像素都会被其对应的 8 位索引替换,而颜色查找表则用于还原生成 24 位色彩

例子
  • R: 16, 48, 80, 112, 144, 176, 208, 240
  • G: 16, 48, 80, 112, 144, 176, 208, 240
  • B: 32, 96, 160, 224

因此颜色为 [30, 129, 80] 的像素应转换为 [16, 112, 96]

为取得更好的效果,我们引入了中位切分算法(median-cut algorithm):

  • 该方法旨在对 R 字节值进行排序并找出其中位数;小于中位数的值标记为 0 位,大于中位数的值则标记为 1
  • 这种方案能将比特集中在最需要区分大量相近颜色的区域
  • 通过使用显示 [0, 255] 位置计数的直方图,可以最直观地理解寻找中位数的过程
  • 下图展示了某 bmp 图像中 R 字节值的直方图,并以垂直线标示了这些数值的中位数

GIF⚓︎

GIF(图形交换格式 (Graphics Interchange Format)

  • UNISYS 公司与 Compuserve 1987 年发明
  • 最初通过电话线传输图形图像
  • 不属于任何应用程序,目前几乎所有相关软件均支持此格式
  • 采用 LZW(Lempel-Ziv-Welch)压缩算法

    • 该算法为无损压缩,支持连续色调,压缩率约为 50 %
  • 仅限于 8 位(256 色)彩色图像

    • GIF 图像色彩深度从 1 位到 8 位不等
    • GIF 图像最多支持 256 种颜色
  • 交错(interlacing)

    • 解码速度快
    • 采用交错方式存储
    • 可分四趟(pass) 渐进显示
  • GIF89a 支持动画功能

    • 在单一图像文件中存储多幅彩色图像
例子

一张 120*60 GIF 图像:

JPEG⚓︎

JPEG(联合图像专家组 (Joint Photographic Experts Group)

  • 由国际标准化组织(ISO)的任务小组创建
  • 利用人类视觉系统的某些局限性
  • 实现高压缩率,采用一种有损压缩方法,允许用户设置所需的质量水平或压缩比(输入除以输出)
例子

BMP⚓︎

  • 由微软发明,作为 Windows 的主要图像格式,可存储 1 位、4 位、8 位以及真彩色数据
  • 三种存储形式:

    • 未经压缩的原始数据:最为常见
    • BI-RLE8:用于 8 位图像(256 色)的行程长度编码(run length encoding, RLE)
    • BI_RLE4:用于 4 位图像(16 色)的 RLE
  • BMP 文件由四个部分组成:

    • 文件头(file head):类型及其他信息
    • 位图信息头(information head of bitmap):长度、宽度、压缩算法等
    • 调色板:颜色查找表,24 位真彩色图像无调色板
    • 图像数据:真彩色图像存储 (R, G, B) 三个分量,带调色板的图像存储指向调色板的索引
例子

128*128 的灰度图:

Other Typical Image Formats⚓︎

  • PNG(便携式网络图形 (portable network graphics)
  • TIFF(标记图像文件格式 (tagged image file format)
  • EXIF(可交换图像文件格式 (exchange image file)
  • 其他 ...

评论区

如果大家有什么问题或想法,欢迎在下方留言~