status
type
tags
category
slug
summary
date
finished_date
icon
password
成像技术
色彩空间
Color Space
人眼如何感知颜色?
我们能看到东西是因为光进入了人眼。光是一种电磁波。自然界中,人类熟知的电磁波的波长可以从 ( 射线)到 (无线电)。从电磁波的角度来看,可见光是电磁波谱中人眼可以感知的部分。人眼能感知的大约只有 至 范围内的电磁波。这部分电磁波谱也被称为人的可见光谱 (Visible Spectrum)。
光线通过眼睛的角膜和晶状体进入眼球。
在眼球内部的视网膜上,有两种主要类型的感光细胞:
- 杆状细胞:负责感知光线的强度
- 锥状细胞:负责感知颜色
- 具体还分为三种 —— 红色/绿色/蓝色锥状细胞。
- 它们对不同波长的光线有不同的敏感度。
不同波长的电磁波刺激视锥细胞,产生不同强度的电信号;
三个不同强度的电信号输入给大脑,产生不同颜色的感觉。
电磁波(客观)→ 颜色(主观)
图像本质上是对可见光的记录与还原。这一过程利用红、绿、蓝三种光的叠加。
- CIE XYZ 色彩空间首次采用数学方式定义,将波长分别为 的红色、 的绿色以及 的蓝色作为光学三原色,构建了现今常用的 RGB 色彩模型。
- 感兴趣的朋友可以查阅:为什么会有颜料三原色和光学三原色?
图片结构
计算机中的图片到底是什么?
“原子” 被视为物质的最小单位——物理学上喜欢将一件物体往无限最小方向分解,直到分解不了为止。而在计算机图形学中,图片分解到最后,只剩下一个点,这个点就叫像素 (Pixel) 。一张图片,由大量像素点组成。
- 图片的尺寸就是图片的高度 () 和宽度 () 上的像素数。
- 像素越多,说明图片的分辨率 (Resolution ratio) 越高。图片更清晰,细节更丰富。
- 一个手机摄像头是1200万像素,说明它生成的照片有1200万个像素点。
每个像素都有对应的一个值,表示它颜色的强度。
假设我们有一个图片,其宽度为 个像素,高度为 个像素。那么可以用一个 的矩阵来表示这张图片,其中每个元素表示一个像素的值。
本质上,计算机中的图片都可以看作一个或者多个矩阵。该矩阵也称为通道 (Channel)。
这个矩阵可以用以下形式表示(:图片在第 行第 列的像素值)
对于灰色图片, 就是范围是 0 到255。
- 当计算机刚开始出现时,存储和处理能力都非常有限,因此 8 位的二进制数被广泛应用于表示数据 ( )。
对于彩色图片, 一般由以下线性亮度 (Linear Luminance) 公式叠加计算:
- 这个公式是根据人眼对不同颜色的敏感度而设计的,能更好地模拟人眼对颜色的感知。
- 人眼对绿色最为敏感,对红色次之,而对蓝色的感知最弱。
RGB 色彩模型能描述出 种不同的色值,即 1670 万色。
物理显示
一个像素值怎么对应现实中具体的颜色?
不同种类显示器原理不同,本篇以 LCD (Liquid Crystal Display) 为例,目前常见的电视或电脑屏幕等都是这个材质。
LCD 的结构最里面是背光,然后是两片偏振片,这两片偏振片中间夹着液晶和滤光片:
- 背光可以用于模拟自然光。
- 滤光片可以把白色的背光分解为红/绿/蓝三种颜色。
- 液晶可以改变光的偏振角度。给液晶加不同电压会有不同偏转角度,对应不同亮度。
- 通过液晶后的光偏振方向和最外面偏振片的偏振方向平行时亮度最高,方向垂直时最低。
LCD 的每个像素对应三个“亚像素”。每一个亚像素,相当于一个由电信号控制的小开关。这个开关可以控制出光量的大小。如果信号强,让通过这个开关的光多一点;信号弱,让光出来少一点。
简单来说,比如当前像素储存的颜色数据为
rgb (255, 0, 0)
,那么相关的控制电路会发送一个较高的电压给红色通道,实现红色发出最亮的光,而绿色和蓝色不发光。压缩算法
假设我们有一个像素矩阵,如果将图片的原始数字数据直接存储到文件中将会非常大。
比如一张 的彩色图片,其大小将会为 ,不适合存储和传输。
所以,各种存储格式的图片出现了。
最早出现的格式之一 “JEPG” 由联合图像专家组 (Joint Photographic Experts Group) 在1992 年制定。为了兼容 DOS、Windows 95 等早期系统采用的 8.3 命名规则(文件名的主体部分最多只能包含8个字符,文件扩展名最多只能包含3个字符),
.jpeg
采用了 .jpg
,二者可以相互替换。因历史习惯和兼容性考虑,后者目前更流行。色彩空间转换
人类视觉系统对图片的亮度变化更加敏感,而对色彩变化的敏感度较低。
例如上图的 和 实际上是同一种颜色,但我们的第一反应是它们并不相同。
因此,JPEG 算法根据人眼的特性,第一步将 RGB 颜色空间转换为 YCbCr 颜色空间。
YCbCr 颜色空间将图片分成亮度和色度两个分量,可以更加有效地利用压缩算法。
- :图片的亮度信息;:蓝色的色度(Chroma) 信息;:红色的色度信息
转化的过程保留了亮度 分量的全部信息,而对色度 分量进行了采样 (Subsample),即将多个小块作为一个新整体,进行平均化处理,从而减少数据量。
转化后,部分色度信息丢失,图片出现 “杂色”,但文件大小确实被有效压缩了。
扫描
Scan
在进行下一步压缩前,JEPG 算法将图像分成多个大小相等的 像素块,用于提高后续压缩效率,即每个小块都可以独立地进行后续的处理,从而降低整个过程的复杂度。
不同的扫描手段,也会造成最后生成的 JEPG 显示方式不同。
Baseline JPEG:将图片按照从左到右、从上到下的顺序一次性扫描和分块
Progressive JPEG:将图片分成多个扫描(或称为 “passes”)后再逐帧分块
离散余弦变换
Discrete Cosine Transform,DCT
图片本身可以视为一种信号,且倾向于由低频率的信号构成。
任何信号都可以表示为不同频率的余弦函数组合。因此,JEPG 算法对每个小块进行 DCT 处理。
- 具体的处理过程涉及复杂的数学知识,这里暂时不展开说明
DCT 将图像从像素域转换到频率域。在频率域中,图像的信息以频率分量的形式表示,而不是像素值。
变换目的是将图像中的高频部分(即变化较快的部分,如边缘和细节)与低频部分(即变化较慢的部分,如平滑区域和背景)分离开来。
量化
Quantization
量化 DCT 变换后的频域系数,即我们需要保留低频信息,抛弃一部分高频信息。
这个转换的过程实际上就是通过除以一个固定的量化矩阵来实现的,实现将图像中的频率分量转换成更小的数值。
我们可以发现在上方最右边转化后的图中,很多高频率分量会被量化为零或接近零的值。
这个量化矩阵的选择是有技巧的,不同的量化矩阵会影响到压缩后图像的质量。
- JPEG 标准会定义一些通用的量化表,但是根据具体的需求,也可以进行定制化设计。
- 一些应用场景可能更关注压缩率,可以选择较大的量化步长来实现更高程度的压缩,而牺牲一定的图像质量。
- 一些对图像质量要求较高的场景,可以选择较小的量化步长,以保留更多的细节信息,但同时会增加文件大小。
熵编码
Entropy Encode
前面的频域系数仍需一种有效的方式便于计算机存储或传输。
首先利用游程编码 (ZigZag) 进行处理。它是一种特殊的扫描顺序,旨在将频率系数重新排列成一个线性序列,以便于后续的处理。
总结
为什么在某些系统上会不兼容某些图片格式?
- 前面介绍的步骤是图片储存在计算机中的压缩过程,但是当我们打开一张图片的时候,还需要“解压缩”才能让它恢复显示,可以理解为上面的步骤反过来。
- 如果系统没有支持相关的解码器,就会无法显示。
为什么 JPEG、PNG 等直接修改文件后缀名,图片也能正常被打开查看?
- 图片通常会在文件头部包含一些标识信息,从而能被文件查看器识别,确定文件的类型。尽管文件后缀名可能不同,但是如果文件头标识符合某种格式的标准,软件会尝试以该格式来解析和显示图片。
- 文件头是在图片被压缩之前就提前确定并写入的,它们不仅用于描述图片,还用于指导相关压缩器在处理图片时的操作。除了文件格式标识符,其还包含图片的尺寸等信息。