一、JPEG的引入

JPEG属于一种图片压缩格式,之前我们通过对YUV420图像格式的学习,了解了怎么计算一帧YUV图像的大小。假设这里一帧图片的分辨率为1080p,像素格式为YUV420,那么它的大小就应该为192010803/2,大约为3M大小。那么如果帧率为10fps时,一秒钟的大小就为30M。显然,耗费的内存过于庞大。这个时候就应该引入图像压缩的概念,JPEG就是一种最常用的图像压缩格式。

二、JPEG压缩原理简述

在日常生活中所见的压缩有分为有损压缩无损压缩,JPEG压缩属于有损压缩的一种。有损压缩的原理也就是把原始数据中不重要的部分去掉,这样就可以节省它的内存占用。比如说“3.141592653”这个小数,我们计算的时候可以取“3.14”,这便是一种有损压缩的形式。JPEG压缩的简单原理亦是如此,将图像数据分为重要数据和不重要数据,这里的不重要数据就是人眼不易观察的部分,这里可以适当地去除。如上,便是JPEG压缩设计的简单原理。

三、JPEG压缩的具体步骤

步骤一:图像分割

JPEG算法的第一步,会将一帧完整的图片切割为8*8大小的小块。被切割的这些小块在JPEG压缩的过程中被当作最小处理单元。

步骤二:图片像素格式由RGB转YUV

之前的文章中讲解过RGB转YUV,这里简单说明一下为什么要转成YUV格式。对于我们而言,压缩最重要的是将重要的信息和不重要的信息分开来,YUV格式的图像格式恰好能做到这一点。对于人眼来说,明暗的变化更容易感知,这里相关生物学的知识就不班门弄斧了,因为本人也不是专业的。这里,YUV格式的图片将亮度和色度进行了分离,这样可以方便我们分离开数据的重要程度,从而进行下一步骤的处理。这就是为什么要转成YUV格式。

步骤三:离散余弦变换

下面我们来介绍一下JPEG压缩的核心技术,离散余弦变换(DCT变换)。具体的故事背景感兴趣的自己百度。
前面在步骤一中,我们对图像进行了分割,分成了一个个小块。每一小块中,像素的数值的变化是平滑的。假设这一小块的像素值在79-81之间变化,如果这里用cos函数去模拟这段变化的轨迹,由于块的大小特别小,所以这里cos函数的频率是特别大的,这些变化被称为高频信息
人眼对于这些高频信息是不敏感的,对低频信息比较敏感。假如将8*8的图像块和你的电脑背景作为对比,这样像素值会出现不平滑的变化,变化很大,这时要用函数组合去拟合这段离散数值时, 就会出现低频信息
因此, 再结合图像压缩的核心思想, 要用较少的不同数值来表示图像, 就需要找到一种变换, 将图像高频的信息和低频的信息区分开来, 并将人眼不敏感的信息映射到接近或等于0。
当我们要处理的是一堆离散的数据时,并且这些数据是对称的话,那么傅里叶变化出来的函数只含有余弦项,这种变换称为离散余弦变换。举个例子,有一组一维数据[x0,x1,x2,…,xn-1],那么可以通过DCT变换得到n个变换级数Fi

这个变换是可逆的,原始数据Xi可以通过离散余弦变换变化的逆变换(IDCT)表达出来。

经过DCT变换,可以把一个数组分解成数个数组的和,如果我们数组视为一个一维矩阵,那么可以把结果看做是一系列矩阵的和

经过DCT,杂乱的数据会被转换成几个工整变化的数据。DCT转换后的数组中第一个是一个直线数据,因此又被称为“直流数据”,简称DC,后面的数据被称为“交流数据”,简称AC,这个称呼起源于信号分析中的术语
在JPEG压缩过程中,经过颜色空间的转换,每一个8X8的图像块,在数据上表现为3个8X8的矩阵,紧接着我们对这三个矩阵做一个二维的DCT转换,二维的DCT转换公式为

下面我们做一个实际的测试,比如一个所有数值都一样的矩阵,经过DCT转换后,将所有级数组合成一个新的矩阵

可以看到,经过DCT转换,矩阵的“能量”被全部集中在左上角上的直流分量F(0,0)上,其他位置都变成了0。
在实际的JPEG压缩过程中,由于图像本身的连贯性,一个8X8的图像中的数值一般不会出现大的跳跃,经过DCT转换会有类似的效果,左上角的直流分量保存了一个大的数值,其他分量都接近于0,我们以刚刚那张图片的左上角第一块图像的Y分量为例,经过变换的矩阵为

可以看到,数据经过DCT变化后,被明显分成了直流分量和交流分量两部分,为后面的进一步压缩起到了充分的铺垫作用,可以说是整个JPEG中最重要的一步,后面我们会介绍数据量化。

步骤四:数据量化

刚刚将数据进行了离散余弦变换,并从刚刚的讲述中可以得知,离散余弦变换是有逆过程的。所以上一个步骤是无损的, 真正有损的步骤是在这一步的数据量化。
经过刚刚的格式转换和离散余弦变换后,每一个小图块都变成了3个8*8的浮点矩阵,为什么是3个,因为每个像素点由Y,U,V三个分量组成。它的数据如下

接下来,我要在可以损失一部分精度的情况下,用更小的空间来存储这些数。这个时候我们用到了数据量化。何为量化,就像我们在看小电影的时候,每次快进没有按帧快进,而是按照10s一次往前进。忽略了一些不太必要的细节,从而达到要求,这里就叫量化。JPEG提供的量化算法如下:

其中G是我们需要处理的图像矩阵,Q称作量化系数矩阵,JPEG算法提供了两张标准的量化系数矩阵,分别用于处理亮度数据Y和色度数据U以及V。


亮度量化表

色度量化表

其中round函数是取整函数,但考虑到了四舍五入,也就是说

比如上面数据,以左上角的-415.38为例,对应的量子化系数是16,那么round(-415.38/16)=round(-25.96125)=-26。最终得到的量子化后的结果为

可以看到,一大部分数据变成了0,这非常有利于后面的压缩存储。这两张神奇的量化表也是有讲究的,有损压缩就是把数据中重要的数据和不重要的数据分开,然后分别处理。DCT系数矩阵中的不同位置的值代表了图像数据中不同频率的分量,这两张表中的数据时人们根据人眼对不不同频率的敏感程度的差别所积累下的经验制定的,一般来说人眼对于低频的分量必高频分量更加敏感,所以两张量化系数矩阵左上角的数值明显小于右下角区域。在实际的压缩过程中,还可以根据需要在这些系数的基础上再乘以一个系数,以使更多或更少的数据变成0,我们平时使用的图像处理软件在生成jpg文件时,在控制压缩质量的时候,就是控制的这个系数。
在进入下一节之前,矩阵的量化还有最后一步要做,就是把量化后的二维矩阵转变成一个一维数组,以方便后面的霍夫曼压缩,但在做这个顺序转换时,需要按照一个特定的取值顺序。

这么做的目的只有一个,就是尽可能把0放在一起,由于0大部分集中在右下角,所以才去这种由左上角到右下角的顺序,经过这种顺序变换,最终矩阵变成一个整数数组

-26,-3,0,-3,-2,-6,2,-4,1,-3,0,1,5,1,2,-1,1,-1,2,0,0,0,0,0,-1,-1,0,0,0,0,…,0,0

步骤五:编码

JPEG最后一步是对变换,量化后的图像进行编码. 用huffman编码或者其他编码方式, 可以显著节省存储空间。

音视频入门(四)-JPEG压缩算法原理相关推荐

  1. 音视频入门-11-PNG文件格式详解

    音视频入门文章目录 PNG 文件格式解析 PNG 图像格式文件由一个 8 字节的 PNG 文件署名域和 3 个以上的后续数据块(IHDR.IDAT.IEND)组成. PNG 文件包括 8 字节文件署名 ...

  2. 音视频入门-17-GIF文件格式详解

    * 音视频入门文章目录 * GIF 文件格式解析 图像互换格式主要分为两个版本,即图像互换格式 87a 和图像互换格式 89a. 图像互换格式 87a:是在 1987 年制定的版本. 图像互换格式 8 ...

  3. 安卓音视频入门难,老司机分享音视频开发学习技巧与痛点

    最近在写文章的时候,发现很多读者给我私信提问,想了解安卓音视频这块, 很多同学也对音视频开发有点浓厚的兴趣,但奈何没有系统的学习知识,仅靠自己苦苦钻研确实力不从心,今天就借这个机会分享一下我学习音视频 ...

  4. Android 音视频入门/进阶教程

    后续的音视频文章,都会在这里更新 作为安卓开发仔,对音视频这块,一直是比较感兴趣的,所以,本着学习和记录的态度,我也把我所学的知识记录起来,希望对想音视频感兴趣的小伙伴有所帮忙. 一. 基础文章系列 ...

  5. IOS音视频(四十六)离线在线语音识别方案

    IOS音视频(四十六)离线在线语音识别方案 IOS音视频(四十六)离线在线语音识别方案 方案一:Siri语音识别 Siri语音识别简介 Siri语音识别功能类介绍 Siri语音识别功能集成 方案二:百 ...

  6. 吹爆系列:教科书级别的Android音视频入门进阶学习手册,学完我成功“挤进”了抖音音视频开发岗

    Android开发工作两年,真的是感觉Android应用层开发没什么前景了,于是打算在网络安全,智能硬件,音视频这几个方向发展,考虑了一段时间,最终决定选择音视频.理由就不说了,既然选择了就要好好深耕 ...

  7. 堪称教科书级别的Android音视频入门进阶学习手册,开源分享

    概述 随着整个互联网的崛起,数据传递的形式也在不断升级变化,总的流行趋势如下: 纯文本的短信,QQ -> 空间,微博,朋友圈的图片文字结合 -> 微信语音 -> 各大直播软件 -&g ...

  8. 音视频入门之如何绘制一张图片

    Android 的音视频入门学习,首先了解一下绘制图片.在 Android 平台绘制一张图片,使用至少 3 种不同的 API,ImageView,SurfaceView,自定义 View作绘制图片.下 ...

  9. 音视频入门-20-BMP、PNG、JPG、GIF静态图生成GIF动态图

    * 音视频入门文章目录 * 静态图 -> 动态图 前面 [18-手动生成一张GIF图片] 和 [19-使用giflib处理GIF图片] 生成的 GIF 每一帧都是一个颜色,平时用到的 GIF 每 ...

  10. 音视频入门系列-音视频基础知识篇(录播、点播、直播)

    在学习音视频技术前,笔者还是希望可以分享给小伙伴们一些音视频方便的基本概念,掌握这些概念,有助于大家对于音视频有一个更直观和清晰的了解. 话不多说,今天笔者给大家分享下:录播.点播和直播. 录播:录播 ...

最新文章

  1. asp.net ajax控件工具集 AutoCompleteExtender控件
  2. 基本机器学习面试问题 --- 理论/算法2
  3. Linux下程序开机启动
  4. mac下php的坑,MAC下安装laravel时遇到的坑
  5. HDU 2829 Lawrence
  6. windows上配置新的conda env+torch
  7. Qt 判断集合中的元素是否全部相同
  8. vue开发app端使用H5+下载文件流
  9. pandas 按列 tolist
  10. html自动排版 vs,Visual Stidio Code (vscode)自定义HTML页面自动生成格式
  11. Grouping BP has not been assigned to any customer accounts groupMessage no. FSBP_ECC004
  12. 小米平板1刷LineageOS16
  13. 全国各地知名互联网公司内推QQ群
  14. 【无中生有】---14---用户行为监控系统嵌入
  15. 如何处理Java异常及常见异常
  16. vue3实现电子实时时钟(动态时钟)
  17. 百度智能云在线活体检测
  18. Axure 中继器表格背景颜色交替不成功
  19. 未来高清显示器发展新趋势及代表技术解析
  20. 【C#】数据类型(sbyte,byte,short,ushort,int,uint,long,ulong和char。、、、)

热门文章

  1. 技术篇——使用 Junit 实现单元测试
  2. typora快捷键修改
  3. php 上传图片 ftp,ftp文件上传_php ftp文件上传
  4. 如何抠图换背景?介绍两个抠图换背景的方法
  5. ConfigReader(四十五)—— ReadSelectHeroConfig
  6. 1100家企业角逐,分秒帧入选腾讯SaaS加速器第三期TOP45席位
  7. 国内-eks-nlb+ nginx-ingress-controller部署
  8. php 四舍五入,PHP 四舍五入,不四舍五入,四舍六入五成双(银行家舍入)
  9. 怀旧服服务器荣誉系统是啥,魔兽世界怀旧服荣誉系统上线 荣誉有何作用
  10. 思科路由器OSPF动态路由配置