影像算法解析——JPEG 压缩算法

article/2025/9/25 1:34:00

由于视频是由一帧帧图像构成的,研究视频编码首先先要研究图像编码。这篇文章就详细说一下 JPEG 是如何压缩一个图像的。

先简单介绍一下 JPEG(Joint Photographic Experts Group,联合图像专家小组):此团队创立于1986年,其于1992年发布的 JPEG 标准在1994年获得了 ISO 10918-1 的认定,成为了图片压缩标准。

JPEG 压缩为有损压缩,下面介绍一下它的压缩算法。

1 RGB 到 YUV 进行4:2:0色度抽样

首先 JPEG 文件是由 YUV 的色彩空间来表示颜色的,YUV 中 Y 表示明亮度(Luma),U 和 V 表示色度(Chrominance)和浓度(Chroma),UV 分量同时表示色差。

因为人眼对亮度的差异敏感度高于对色彩的变化。考虑到这种感知能力,允许降低色度以及浓度的带宽。YUV 的色彩空间更容易压缩 U、V 分量。

1.1 RGB 到 YUV 的转换 - 无损

RGB 转化 YUV 的公式(经过 PAL制式 CRT伽玛校正)如下:

Y = 0.299R’ + 0.587G’ + 0.114B'

U = -0.147R’ - 0.289G’ + 0.436B'

V = 0.615R’ - 0.515G’ - 0.100B'

未经伽玛校正(计算机色彩空间)的矩阵表示:

1.2 色度抽样-有损

在 YUV 采样的时候可以对 U、V 分量进行色度采样,在 JPEG 压缩算法采用的是 YUV 4:2:0 的色度抽样方法。

4:2:0 并非无 V 分量,它对于每行扫描的像素来说,只有一中色度分量以 2:1 的抽样率储存,相邻行储存不同的色度分量。可以理解为奇数行采样 U,YUV 4:2:0;偶数行采样 V,YUV 4:0:2。

YUV 4:2:0 的码流为:

Yo0 Uo0 Yo1 Yo2 Uo2 Yo3
Ye0 Ve0 Ye1 Ye2 Ve2 Ye3

映射成的四个像素为:

[Yo0 Uo0 Ve0] [Yo1 Uo0 Ve0] [Yo2 Uo2 Ve2] [Yo3 Uo2 Ve2]
[Ye0 Uo0 Ve0] [Ye1 Uo0 Ve0] [Ye2 Uo2 Ve2] [Ye3 Uo2 Ve2]

YUV 4:2:0 的色度抽样率为 4:1,至此经历第一次压缩。

2 离散余弦变化(DCT)- 无损

做好色彩空间转换和 YUV 4:2:0 色彩抽样后,将输入的图片分割成 8*8 像素的单元格。对每个单元格进行离散余弦变化。

以下面的图片作为例子,下图为 8*8 的只有 Y 分量的图形,其中亮度值为矩阵中的值:

数据来自 Wikipedia [1]

由于 DCT 变化需要定义域对称,在做 DCT 变化之前要先将矩阵中的数值左移 128,使得值域落在 -128~127:

到此,DCT 变化的准备工作已经完成。在进行 DCT 变化之前,先说一下 DCT 的原理

信号学中,如果一个信号长度为8字节,则可以用8个不同频率的余弦波去表示它,形成频域编码。在图像中也是如此。

在 JPEG 算法中,图像被分为了 8*8 的像素组,每个像素组用自己的离散余弦变化进行频域编码。

顺带说一句,为什么选用 8*8 的像素组。采用比 8*8 更大的像素组,会大幅增加 DCT 的运算量,且编码质量也不会明显提升;采用比 8*8 更小的像素组会导致分组增多降低精度。所以8*8 的像素组是效率最优的结果。

这些像素组可以被 8*8 个余弦波精确表示,如下图所示有64个基本余弦波:

余弦波

这64个余弦波,可以组合成任意 8*8 的图形。我们只要用系数(系数表示每个单独的余弦波对整体图像所做的贡献)对这64个余弦波进行加权,就可以表示出任何的图形。

这个过程就是离线余弦变化,JPEG 中使用的是 DCT II 的公式。

根据 DTC II 的公式:

 

可以得出该图像在频域上的系数(经过取整,取值范围 -1024~1023):

经过 DCT 转换后的频率系数矩阵分别对应64个余弦波在 8*8 图形中的权重。可以看出,左上部分低频区的系数比较大,右下高频区的系数较小。鉴于人眼对高频区的识别不敏感,所以在下面量化部分可以舍弃一些高频区的数据。这里的 DCT 变化还没开始压缩。

  • 注1:左上角第一个数为直流系数,代表特定像素组的一般强度,其余为交流系数。
  • 注2:此处的系数矩阵与亮度矩阵无对应关系。

3 量化 - 有损

在 DCT 变化后,舍弃高频区数据的过程称为量化。有两份量化表可供选择,分别为亮度量化表和色度量化表:

上表分别为亮度量化表和色彩量化表,表示 50% 的图像质量。这两张表中的数据基于人眼对不同频率的敏感程度制定。

量化表是控制 JPEG 压缩比的关键,可以根据输出图片的质量来自定义量化表,通常自定义量化表与标准量化表呈比例关系,表中数字越大则质量越低,压缩率越高。PhotoShop 有12张量化表。

量化过程为,使用量化矩阵与前面得到的 DCT 矩阵逐项相除并取整。之前为亮度矩阵,顾使用亮度量化表:

量化是有损的,在解码时,反量化会乘回量化表的相应值。由于存在取整,低频段会有所损失,高频段的0字段则会被舍弃,最终导致图像质量降低。

4 熵编码(zigzag scan & 霍夫曼编码)- 无损

得到量化后的矩阵就要开始编码过程了,首先要把二维矩阵变为一维数组,这里采用了 zigzag 排列,将相似频率组在一起:

zigzag [2]

得出的序列为:

霍夫曼编码中,在 JPEG 有个 EOB(End OBlock) 字段,表示从字段开始后面全为0,然后再根据霍夫曼编码再进行压缩。

至此,这个亮度 8*8 的像素组压缩编码完毕。

将图像每个 8*8 像素组进行编码就可以压缩整个图像了。


关于 JPEG 编码的内容就写到这里,如有错误或遗漏,欢迎在评论区指正。

以后也会在这个新分类下写一些其他视频编码,如果大家有其他内容想了解,也可以写在评论里。

没有微信公众号,只在专栏里写些东西,顺便自己也可以学习,欢迎关注。


参考资料:

[1] JPEG-Wikipedia

[2] JPEG 标准 | itu-t81.pdf

编辑于 2018-07-27 19:13


http://chatgpt.dhexx.cn/article/fxeW51yp.shtml

相关文章

数字图像处理(七)图像压缩-无损编码/压缩算法+matlab

要求: 无损编码/压缩算法: 问题1: 实现行程编码压缩, 肉眼观察压缩效果,并计算原图和压缩以后的尺寸,计算压缩率并比较分析;问题2: 实现哈夫曼压缩, 肉眼观察压缩效果,并计算原图和压缩以后的尺寸&#x…

图像压缩原理-JPEG

搬来一个基础啊 给自己看~~ 非技术指正勿扰 图像的格式有很多种,比如PNG,JPEG等等,但当我们把一张图用工具变成各种其他格式时,其在计算机文件系统显示的文件大小各不一样,但是当你打开显示时,从视觉角度…

图像压缩算法简介

理论基础 香农的信息论,在不产生任何失真的前提下,通过合理的编码,对于每个信源符号分配不等长的码字,平均码长可以任意接近于信源的熵。在这个理论框架下产生了几种不同的无失真的信源编码方法:哈夫曼编码&#xff0c…

图像压缩原理

原文网址:http://blog.csdn.net/newchenxf/article/details/51693753 转载请注明出处。 1 图像可压缩的原因 一张原始图像(1920x1080),如果每个像素32bit表示(RGBA),那么,图像需要的内存大小 1920x1080x…

JPEG图像压缩算法详解

转载自 http://www.ibm.com/developerworks/cn/linux/l-cn-jpeg/ JPEG压缩算法之前已有很多前辈详细讲解过,我就不在这里画蛇添足了(主要是我懒。。),转载两篇JPEG压缩算法介绍,拼为一篇。侵删。 JPEG图像压缩算法详解…

图片压缩知识

一、图片压缩算法 有损算法: JPEG,我们最为常用的算法。他是通过离散余弦变换,对图片质量尽量小的时候进行有损压缩,该算法对高中波特率下效果很好,但是对低波特率下,就会出现方格之类的,比如1…

imadjust函数分析一

声明:本文涉及到的行数皆指本文提供的附件imadjust.m的代码中行数 本文只讨论imadjust函数是一种用法,即 J IMADJUST(I,[LOW_IN; HIGH_IN],[LOW_OUT; HIGH_OUT],GAMMA) 处理效果如下图 图像矩阵I要求数据类型uint8、uint16、double、single和int16&…

matlab灰度变换函数imadjust、stretchlim

1、imadjust函数 gimadjust(f,[low_in,high_in],[low_out,high_out],gamma) f为输入灰度图像,将low_in和high_in之间的灰度值映射到low_out到high_out之间 gamma大于1,映射函数下凸;小于1,上凸;gamma默认为1&#x…

Matlab中库函数imadjust()的使用细节

不知道大家有没有使用这个函数时,出现结果异常、过曝的情况我在使用时,发现在官方文档中并未声明的细节。 结合开源的程序源码和实验结果发现该函数对矩阵进行处理时,会对参数指明的处理数据以外的内容进行调整,错误使用会导致图像…

stretchlim matlab,matlab灰阶变换函数imadjust和stretchlim的c++实现

灰阶变换 首先介绍一下灰阶变换,一幅图像数据本身在存储的数据结构上为一个二维的矩阵,即一幅图像为m*n个密密麻麻的像素点构成。 image.png 然后,这些像素点有着一个值,这个值成为灰度值或者亮度值,值的范围为[0,255]…

在OpenCV里实现函数imadjust

imadjust 函数是针对灰度图像进行灰度变换的基本图像。 J = imadjust(f,[low_in; high_in],[low_out; high_out],gamma) 此函数将 f 的灰度值映像到 g 中的新值, 也就是将 low_in 与high in 之间的值映射到 low out 与 high out 之间的值。 low in 以下与 high in 以上的值可…

imadjust使用opencv实现

实现函数功能 J low_out (high_out - low_out).* ((I - low_in)/(high_in - low_in)).^ gamma [cpp] view plain copy print ? IplImage* ImageAdjust(IplImage *src, IplImage *dst, double low_in, double high_in, double low_out, double h…

python实现matlab stretchlim函数和imadjust函数

matlab 代码: [img,map]imread(“/home/zhongjia/test.png”); LOW_HIGHstretchlim(img); Jimadjust(img,[LOW_HIGH(1) LOW_HIGH(2)],[0 1],1); imwrite(J,"/home/zhongjia/test_result.png"); 实现功能是:对16位深度1024*1024大小的test.…

MATLAB图像处理imadjust()函数调节图像的对比度示例

imadjust()函数 Jimadjust(I) 将强度图像为I的值映射到J中的新值,使得1%的数据在低强度和高强度I时饱和。这将增加了输出图像J的对比度。 J imadjust(I,[LOW_IN; HIGH_IN],[LOW_OUT; HIGH_OUT])将强度图…

matlab常用语句imadjust作用,matlab中imadjust函数的作用及应用举例

imadjust简介 imadjust是一个计算机函数,该函数用于调节灰度图像的亮度或彩色图像的颜色矩阵。在matlab的命令窗口中键入: doc imadjust或者help imadjust就行了获得该函数的帮助信息, 键入type imadjust可以查看函数的源码。 调用格式&#…

matlab imadjust函数,imadjust从用法到原理—Matlab灰度变换函数之一

imadjust函数是MATLAB的一个工具箱函数,一般的语法调用格式为: f1=imadjust(f,[low_in high_in],[low_out high_out],gamma) (注:本文所述图像数据均为Uint8,对于Matlab,矩阵中的一个元素即是一个像素点) 该函数的意义如图1所示,把图像f灰度变换到新图像f1的过程中,f…

matlab imadjust函数,浅析matlab中imadjust函数

imadjust imadjust是一个计算机函数,该函数用于调节灰度图像的亮度或彩色图像的颜色矩阵。在matlab的命令窗口中键入: doc imadjust或者help imadjust即可获得该函数的帮助信息, 键入type imadjust可以查看函数的源代码。 函数功能&#xff1…

matlab图像灰度调整——imadjust函数的使用

在MATLAB中,通过函数imadjust()进行图像灰度的调整,该函数调用格式如下: Jimadjust( I ) 对图像I进行灰度调整 Jimadjust( I,[low_in;high_in],[low_out;high_out]) [low_in;high_in]为原图像…

matlab——imadjust函数

作用: 对进行图像的灰度变换,即调节灰度图像的亮度或彩色图像的颜色矩阵。 格式: g imadjust(f,[low_in; high_in],[low_out; high_out]) 将图像I中的亮度值映射到J中的新值。即将low_in至high_in之间的值映射到low_out至high_out之间的值。…

4.3 Python图像处理之图像恢复-无约束滤波器(逆滤波)、有约束滤波器(维纳滤波器)

4.3 Python图像处理之图像恢复-无约束滤波器(逆滤波)、有约束滤波器(维纳滤波器) 文章目录 4.3 Python图像处理之图像恢复-无约束滤波器(逆滤波)、有约束滤波器(维纳滤波器)1 算法原…