来源
:Reducible

主讲人
:Eric Tang

内容整理
:张雨虹

本视频对 JPEG 算法的核心部分进行了讲解,重点讲解色彩空间、YCbCr、色度二次采样、离散余弦变换、量化和无损编码。从数学和信号处理的角度解释了图像压缩算法的发展历程。
目录
  • 介绍
  • 技术一:色度的二次采样、下采样
  • 技术二:DCT 变换
    • 玩转 DCT
    • 逆 DCT
    • 二维 DCT
    • 从 2D DCT 构建图像
  • 技术三:量化
  • 技术四:游程、哈夫曼编码

介绍

计算机通常的颜色空间是 RGB 模型,每个像素由三个 0-255 的值表示。每个值由 8 位/1 字节来存储,则图像的每个像素需要占用 3 个字节的存储空间。因此,对于一张 2592×1944 的图片,其占用内存空间可达 15M 字节,但是使用 JPEG 压缩后,其只需要 0.8M 字节,并且不会影响图像的视觉效果。
JPEG 采用了有损压缩的形式。JPEG 利用编码器将图像转换成一种数据存储起来;然后利用解码器,可以将这些数据重新渲染成相应的图片。之所以称之为有损压缩,是因为解码器得到的图片与编码器并不完全一样,在编码过程中,我们丢失了一些相对无效的信息来进行压缩。研究发现,人眼对亮度的敏感度大于对颜色的敏感度,JPEG 正是利用这一点来进行压缩的。

技术一:色度的二次采样、下采样

RGB 色彩空间是红色(R)、绿色(G)、蓝色(B)三通道的组合。YCbCr 的想法是把颜色的亮度分量分离出来,YCbCr 中 Y 是指亮度分量,Cb 指蓝色色度分量,而Cr 指红色色度分量。JPEG 压缩的思想就是充分利用人类更敏感的那部分亮度色彩,核心技术有色度下采样。
假设一个 8×8 图像,其包含相应的 Y、Cb、Cr 分量,色度下采样或二次采样的关键思想是减少 Cb 分量,因为人眼对其不敏感。所谓 4:2:0 的下采样方案就是在原始的图像里划分 2×2 的小块,然后取 4 个像素的平均值作为 4 个像素的共享值。色度子采样是相同的做法,但是只选择一个样本(通常是左上角的像素)作为整个 2×2 块的颜色,而非平均值。把这些采样后的色度分量与原始的零度分量进行组合就可以得到子采样后的图像了。这样处理可以节省空间且不会影响视觉效果。

技术二:DCT 变换

玩转 DCT

另一个进行压缩的关键是对定义灰度图像的 Y 通道进行处理。JPEG 的思想是把图像表示成信号的形式,对图像进行切片,得到一行像素,每个像素的值在 0-255 之间,把这些值画成一条曲线就得到了图像的信号形式。从频率的角度去看待图像,高频分量对应于像素之间的快速变化部分,低频分量对应图像的平稳部分。图像的频率对于图像压缩是至关重要的现实世界的图像往往含有更多的低频分量,同时人类视觉系统对高频分量不敏感。因此 JPEG 的想法是删除不必要的高频分量。
DCT变换适用于任何大小,我们还是以 8 个像素为例进行介绍。
DCT 的想法是把不同像素的值映射到不同频率的余弦波上去。DCT 以原始信号的采样点作为输入,输出相应的 DCT 系数。这些系数不同频率余弦波的权重。这样就把一个复杂信号转换成了简单余弦波的组合。
当反转输入的相位时,输入的系数会乘 -1;当输入幅度改变时,权重也相应的变化;向上向下移动余弦波只会影响第零个系数;改变频率就会改变对应频率的系数。
数学表示如下图所示:
数学表示1
数学表示2
DCT 系数本质上对应的是余弦波和输入的相似度,这就是为什么输入某一个频率的余弦波,会得到特定的 DCT 系数。同时 DCT 变换可以看做一个线性变换,且所有的行向量都是正交的,这就是为什么输入某个特定频率的余弦波并不会影响其他的系数

逆 DCT

DCT 变换是可逆的,逆变换对应的矩阵是逆矩阵。
DCT 变换和逆变换
逆 DCT 变换的含义就是根据相应的系数对余弦波加权求和获得原始输入。

二维 DCT

JPEG 获取图像并将其划分为 8×8 块,然后减去 128,使其值集中在 0 附近;然后对每一行进行 DCT 变换得到 8 组 DCT 系数;再对 每一列进行 DCT 变换;这样就得到了 64 个系数,对应于 64 个基本模式。
二维 DCT
经过 DCT 变换后,会发现图像信号大部分集中在低频处,称之为能量压缩

从 2D DCT 构建图像

从零系数开始逐步重建,在一个系数之后慢慢建立图形,基本上得到一个模糊的原始图像,逐步增加系数的分量,图像会逐步清晰。当加入 <25% 的分量时,就几乎无法分辨原始图像和重建图像的差异了。

技术三:量化

所谓量化就是给定来自 DCY 的频率系数的 8×8 矩阵元素的值除以某个值并四舍五入为整数。对应的值是由量化表规定的。
量化和反量化
可以看到量化和反量化以后两个矩阵相差甚远,这意味着量化操作其实是故意丢失了信息的。这里的思想就是利用 DCT 的能量压缩属性,保留低频分量。

技术四:游程、哈夫曼编码

JPEG 采用 ZigZag 方式对系数进行扫描,以最大限度地增加大量零序列的机会以便经典的游程长度编码可以更容易的进行压缩,将每个零序列压缩为连续序列中出现的计数。JEPG 定义了一个三元组来进行一些更复杂的操作。这个三元组对前面的 0 的数量以及编码所需的位数、系数以及块结束的值进行编码。哈夫曼编码的思想就是频繁使用的数据用更少的比特进行编码。
综上,JPEG 就是一种充分利用数据冗余来进行压缩的一种方法。
附上演讲视频:
继续阅读
阅读原文