视频压缩编码(二)—— 一文彻底搞懂 JPEG 编码流程

📅 2026/8/14 12:33:52
视频压缩编码(二)—— 一文彻底搞懂 JPEG 编码流程
目录一、案例导入1. 拍照瞬间发生了什么2. 打开照片时发生了什么二、JPEG编码流程1. 整体流程图2. 色域转换——从RGB到YCbCr解耦亮度与色度2.1 转换目的2.2 转换公式标准ITU-R BT.6012.3 关键预处理色度下采样3. DCT变换——从空间域到频域集中能量3.1 DCT变换的核心逻辑3.2 二维DCT变换公式8×8块3.3 变换后效果4. 量化——有损压缩的核心丢弃高频冗余4.1 量化表的设计逻辑4.2 量化过程简单易懂4.3 质量因子QF的影响重点应用5. 熵编码——无损压缩进一步缩减码流5.1 预处理Zigzag扫描DPCMRLE关键铺垫5.2 Huffman编码最终无损压缩六、案例介绍1. 原始数据2. 具体步骤**步骤 1游程编码 RLC****步骤 2数值转换Value → Size 幅值比特串****步骤 3哈夫曼Huffman熵编码**三、参考链接一、案例导入这里有一个问题从我们手机上拍一张照片到我们打开这张照片经历了什么1. 拍照瞬间发生了什么光线进入镜头景物反射的光穿过镜头被镜片聚焦到图像传感器CMOS/CCD上。传感器把光变成电信号传感器上几百万个像素点把光强转换成微弱电流。ISP 图像信号处理器处理手机芯片里的 ISP做对焦、曝光、白平衡、降噪、锐化、HDR、夜景合成 。编码压缩成图片格式一般是 JPEG也可能是 HEIF/HEIC、RAW。把数据压缩体积变小。写入存储生成文件保存到手机内部存储同时记录分辨率、拍摄时间、GPS、光圈快门等 EXIF 信息。2. 打开照片时发生了什么系统找到文件相册 APP 去文件系统里读取该图片的索引、路径、元数据。从闪存读取数据把压缩的图片数据读到内存RAM。解码解压把 JPEG/HEIC 解压还原成原始像素数据。渲染到屏幕按屏幕分辨率缩放、交给 GPU 渲染、逐行显示到屏幕上。你看到画面屏幕的像素点发光形成你看到的照片。二、JPEG编码流程1. 整体流程图JPEG编码流程主要分为四部分分别是色域转换、DCT变换、量化、熵编码接下来将重点梳理整个过程希望看完后能有所收获~2. 色域转换——从RGB到YCbCr解耦亮度与色度我们日常接触的图像如手机拍照、网页图片大多以RGB色彩空间存储即通过红R、绿G、蓝B三原色的叠加呈现所有颜色。但RGB空间存在一个关键问题亮度与色度相互关联无法单独对“人眼不敏感的部分”进行压缩——这也是JPEG第一步要解决的核心问题。2.1 转换目的人眼的视觉特性是对亮度变化的敏感度远高于对色彩变化的敏感度。例如我们能清晰分辨出画面的明暗差异但对轻微的色彩偏差感知较弱。基于这一特性JPEG将RGB转换为YCbCr色彩空间实现亮度与色度分离为后续的针对性压缩奠定基础。YLuminance亮度分量决定明暗程度是人眼最敏感的部分需要尽可能保留细节CbChrominance Blue蓝色色度分量描述图像中蓝色与亮度的偏差CrChrominance Red红色色度分量描述图像中红色与亮度的偏差。2.2 转换公式标准ITU-R BT.601RGB与YCbCr的转换遵循固定公式将8位0~255的RGB像素值转换为同样8位的YCbCr值Cb、Cr需加128偏移避免负数值2.3 关键预处理色度下采样色域转换后JPEG会对Cb、Cr分量进行色度下采样——这是实现高压缩比的关键一步且不会明显影响视觉效果。因为人眼对色度不敏感即使减少色度数据量也不会感觉到图像色彩失真。常用下采样格式重点掌握4:2:04:2:0最主流如JPG、JPEG格式默认每2×2个像素块保留4个Y分量亮度、1个Cb分量和1个Cr分量色度数据量直接减少为原来的1/4原先一个像素需要 3 Bytes 来表示现在仅需要 1.5 Bytes4:2:2每2×1个像素块保留4个Y、2个Cb、2个Cr色度数据量减少为原来的1/24:4:4无下采样保留全部Y、Cb、Cr分量压缩比最低适合对色彩要求极高的场景如专业摄影。下采样后图像会被分割为8×8的像素块后续的DCT变换、量化均以8×8块为单位进行——这是JPEG编码的最小处理单元。3. DCT变换——从空间域到频域集中能量经过色域转换和下采样后我们得到了多个8×8的Y、Cb、Cr像素块空间域数据。但空间域的像素值是离散且分散的直接压缩效率极低。JPEG通过二维离散余弦变换DCT将空间域的像素值转换为频域的系数实现“能量集中”——这是JPEG编码的核心技术之一。3.1 DCT变换的核心逻辑简单来说DCT变换的本质是“将图像的像素值分解为不同频率的余弦波叠加”。就像我们听音乐时能将复杂的声音分解为不同频率的音符再比如下面这幅图如果我们想要复现左边这幅图需要按照色块的数量放置在相应的位置进行组合即可复现。DCT的工作原理和上述类似但使用的不是色块而是如下图所示的8*8张基础图像来线性组合能将一张图像的细节分解为“低频分量”和“高频分量”低频分量对应图像的整体轮廓、大面积色块是人眼必须保留的核心信息高频分量对应图像的细节、边缘、纹理如文字边缘、毛发、噪点是人眼相对不敏感的信息也是后续压缩的重点。3.2 二维DCT变换公式8×8块对于一个8×8的像素块f ( x , y ) f(x,y)f(x,y)正向DCT变换后得到频域系数F ( u , v ) F(u,v)F(u,v)公式如下F ( u , v ) 1 4 C ( u ) C ( v ) ∑ x 0 7 ∑ y 0 7 f ( x , y ) cos ⁡ ( ( 2 x 1 ) u π 16 ) cos ⁡ ( ( 2 y 1 ) v π 16 ) F(u,v) \frac{1}{4} C(u)C(v) \sum_{x0}^{7}\sum_{y0}^{7} f(x,y)\, \cos\left(\frac{(2x1)u\pi}{16}\right) \cos\left(\frac{(2y1)v\pi}{16}\right)F(u,v)41​C(u)C(v)x0∑7​y0∑7​f(x,y)cos(16(2x1)uπ​)cos(16(2y1)vπ​)其中C ( u ) C(u)C(u)和C ( v ) C(v)C(v)为归一化系数定义为C ( k ) { 1 2 , k 0 1 , 1 ≤ k ≤ 7 C(k) \begin{cases} \frac{1}{\sqrt{2}}, k 0 \\ 1, 1 \le k \le 7 \end{cases}C(k){2​1​,1,​k01≤k≤7​左上角的系数是低频分量右下角的系数是高频分量。3.3 变换后效果DCT变换后8×8的频域系数具有如下特点为后续量化奠定基础。需要注意的是DCT变换是“无损变换”——只要保留所有频域系数就能通过逆DCT变换IDCT完全恢复原始像素块没有任何信息损失。损失是在后续的“量化”步骤中产生的。能量高度集中超过90%的能量集中在左上角的低频系数尤其是u0、v0的系数称为DC系数右下角的高频系数大多接近0DC系数u0、v0时的系数代表该8×8块的平均亮度相当于整个块的“基准值”相邻块的DC系数差异很小AC系数除DC系数外的63个系数均为高频分量从左上角到右下角频率逐渐升高系数幅值逐渐减小。4. 量化——有损压缩的核心丢弃高频冗余量化是JPEG编码中唯一的固定有损步骤也是“图像质量与压缩比”的调节核心。其原理是用预设的“量化表”对DCT变换后的频域系数进行“除法取整”通过丢弃高频系数的细节实现大幅压缩。核心逻辑人眼对高频细节不敏感即使将高频系数量化为0也不会明显影响图像的视觉效果但能极大减少数据量。4.1 量化表的设计逻辑JPEG有两个标准量化表亮度量化表针对Y分量和色度量化表针对Cb、Cr分量。量化表的核心特点是低频系数对应较小的量化步长高频系数对应较大的量化步长。以下是JPEG标准亮度量化表8×8质量因子QF50时16 11 10 16 24 40 51 6112 12 14 19 26 58 60 5514 13 16 24 40 57 69 5614 17 22 29 51 87 80 6218 22 37 56 68 109 103 7724 35 55 64 81 104 113 9249 64 78 87 103 121 120 10172 92 95 98 112 100 103 994.2 量化过程简单易懂量化的操作非常简单将每个8×8的DCT频域系数F ( u , v ) F(u,v)F(u,v)除以量化表中对应位置的量化值Q ( u , v ) Q(u,v)Q(u,v)然后对结果取整四舍五入得到量化后的系数F ′ ( u , v ) F(u,v)F′(u,v)。F ′ ( u , v ) r o u n d ( F ( u , v ) / Q ( u , v ) ) F(u,v) round( F(u,v) / Q(u,v) )F′(u,v)round(F(u,v)/Q(u,v))4.3 质量因子QF的影响重点应用量化表的量化步长可通过质量因子QF调节QF的取值范围是1~100直接决定图像质量和压缩比QF100量化表的量化步长最小量化误差最小图像质量最高压缩比最低接近无损QF50默认质量平衡质量与压缩比适合大多数日常场景QF10量化步长最大量化误差最大图像失真明显压缩比最高可达20:1以上。量化是“不可逆的”——一旦量化后系数被取整即使通过逆量化乘以量化表值也无法恢复原始DCT系数这就是JPEG“有损压缩”的本质。5. 熵编码——无损压缩进一步缩减码流经过量化后8×8的系数已经变得非常“稀疏”大量高频系数为0但直接存储这些系数仍有冗余。熵编码的作用是对量化后的系数进行“无损压缩”通过统计概率分配短码给高频出现的符号进一步缩减码流大小最终输出JPEG码流.jpg/.jpeg文件。JPEG的熵编码分为两步先对量化系数进行预处理Zigzag扫描DPCMRLE再进行Huffman编码主流或算术编码高效但复杂。5.1 预处理Zigzag扫描DPCMRLE关键铺垫量化后的8×8系数0值主要集中在右下角高频区域直接按行或按列存储无法高效压缩。预处理的目的是“将连续的0集中起来”为后续编码做准备。1ZigzagZ字形扫描将8×8的量化系数按“Z字形”顺序扫描转换为1×64的一维序列。这样做的核心效果是将右下角连续的0集中到序列的尾部形成“大量连续0少量非0系数”的结构。扫描顺序示例从左上角DC系数开始依次扫描2DC系数DPCM差分编码相邻8×8块的DC系数平均亮度差异很小比如前一块DC100后一块DC102如果直接存储每个DC系数会有大量冗余。DPCM差分脉冲编码调制的原理是不存储DC系数本身只存储当前块DC系数与前一块DC系数的差值。示例前一块DC100当前块DC102差值2——只需存储“2”而非“102”大幅减少数据量。3AC系数RLE游程编码Zigzag扫描后AC系数的序列呈现“非0系数连续0”的结构如5, 0, 0, 3, 0, 0, 0, 2, 0, …, 0。RLE游程编码的原理是用连续0的个数非0系数值的形式表示AC系数序列压缩连续0的冗余。 示例序列“5, 0, 0, 3, 0, 0, 0, 2, 0, …, 0”用RLE表示为(0,5), (2,3), (3,2), (0,0)——其中(0,0)是结束标志代表后续全为0。5.2 Huffman编码最终无损压缩Huffman编码是一种基于“统计概率”的无损编码方式核心逻辑是对出现频率高的符号分配更短的二进制码对出现频率低的符号分配更长的二进制码从而减少整体码长。JPEG中Huffman编码针对两类数据分别进行DC系数的差值统计所有DC差值的出现频率构建Huffman树分配对应短码AC系数的游程幅值对统计所有游程幅值对的出现频率构建另一棵Huffman树分配对应短码。六、案例介绍1. 原始数据8×8 块经 Z 字形扫描后得到 AC 系数序列57450000230-30-16001后续大量0说明序列末尾连续大量 0JPEG 使用 EOB 标记终止无需逐个记录。2. 具体步骤步骤 1游程编码 RLC规则统计非零系数前面连续 0 的个数 (Run)搭配系数值 (Value)格式(Run, Value) 遍历序列 57前面 0 个 0 → (0, 57) 45前面 0 个 0 → (0, 45) 23前面 4 个 0 → (4, 23) -30前面 1 个 0 → (1, -30) -16前面 0 个 0 → (0, -16) 1前面 2 个 0 → (2, 1) 后面全部为 0 → 结束标记 (0, 0)【EOB 块结束】 RLC 结果 (0,57),(0,45),(4,23),(1,-30),(0,-16),(2,1),(0,0)步骤 2数值转换Value → Size 幅值比特串规则Size系数绝对值所需二进制位数正数直接写绝对值二进制负数|V|-1 再转二进制保证相同幅值正负长度一致逐个换算57|57|57 → 6bit 111001 → (Run,Size)(0,6)幅值 11100145|45|45 → 6bit 101101 → (0,6)幅值 10110123|23|23 → 5bit 10111 → (4,5)幅值 10111-30|-30|3030-129 →5bit 00001 → (1,5)幅值 00001-16|-16|1616-115 →4bit 0111 → (0,4)幅值 01111|1|1 →1bit 1 → (2,1)幅值 1(0,0) EOB无数值比特整理结构(0,6) 111001(0,6) 101101(4,5) 10111(1,5) 00001(0,4) 0111(2,1) 1(0,0)关键(Run, Size) 是哈夫曼编码符号幅值比特串不参与哈夫曼查表直接原样拼接。步骤 3哈夫曼Huffman熵编码JPEG 内置AC 哈夫曼表使用(Run,Size)查表得到变长二进制码字示例查表结果标准 JPEG AC 表(0,6) → 111000(4,5) → 1111111110011001(1,5) → 11111110110(0,4)、(2,1)、(0,0) 查表得到对应码字依次拼接码字(Run,Size) 幅值比特串组合码流片段111000 111001111000 1011011111111110011001 1011111111110110 00001…… 后续继续拼接最后追加 EOB 码字三、参考链接强烈推荐: 【中英双字】JPEG算法原理 jpeg图片是如何压缩的重点推荐: 【中配】JPEG为何如此神奇从信号处理角度揭秘 - Reducible简单科普JPEG 有损压缩 离散余弦变换 DCT 一条视频讲清楚哈夫曼编码学习【杜克大学——图像与视频处理】P10-图像压缩哈夫曼编码与信息熵信息熵如何理解信息熵