转载请注明出处:http://blog.csdn.net/luoshixian099/article/details/50392230

CSDN-勿在浮沙筑高台

为了满足不同应用的需求,JPEG标准包含两种主要的压缩方法:1.基于DCT的有损压缩算法;2.基于预測方法的无损压缩算法。

基于DCT的基线系统有损压缩技术是到眼下为止应用最为广泛的一种压缩方法,本文将具体解析此算法。

1.基于DCT有损压缩原理

以下是编码器和解码器的流程图。压缩过程:原图分成8×8的子块,分别进行正向离散余弦变换(FDCT)。对每一个8×8子块的系数採用量化表进行量化。Zig-Zag扫描,最后使用熵编码。输出比特流。解码器是完整的逆过程。本文章不再赘述!

1.1离散余弦变换(DCT)

首先把原始图像切割成8×8的子块(假设宽或高不是8的整数倍,能够用黑色边框填充),每一个子块进行独立编码处理。

在进行FDCT变换之前,把64个无符号整型灰度值[0,255]平移到[-128,+127]范围中。

通过DCT变换,8×8个灰度值被转换为8×8个频率谱值,分别相应不同频率。

DCT变换系数值均为实数。

低频谱值位于左上部分,高频谱值位于右下部分。通过下述公式可知。左上角F(0,0)相应频率为0,被称为DC系数,其它63个系数称为AC系数。

至于为什么子块大小选择8×8。因为当时制定JPEG标准时,8×8是集成电路所能支持的最大尺寸,同一时候8×8的大小效果非常好。

下述定义的b[x,y]为DCT的基函数。以下画出了6个基函数在8×8的子块上的幅值b[x,y]。当中,x,y为空间域的坐标,u,v相应频率域的坐标。

1.2 量化

注意:图像信息损失是在量化阶段而不是DCT阶段。经过上述FDCT,生成了64个频率系数,通过抑制高频成分,来达到压缩的目的。一个主要原因是因为人眼对高频成分不敏感,故能够移除部分高频成分。而对图像感官质量影响非常小;还有一个原因是大多数图像中的灰度值是个渐变的过程。而频率高的部分携带的信息非常少。

通过使用量化矩阵Q(u,v)对F(u,v)进行量化,大部分高频系数会被量化成0。JPEG标准没有指定量化矩阵的数值,能够依据须要自定义,以下是JPEG标准提供的两种量化矩阵作为參考。一种为低压缩,还有一个为高压缩。

1.3 熵编码

☆ Zig-Zag扫描

通过上述量化矩阵,大部分高频系数被量化为0。为了方便进行熵编码,把8×8的系数矩阵转化为1×64的一维数据,并且採用的方式为Zig-Zag扫描法,採用Z字型的优点是能够把低频系数和高频系数分别集中在一起。而随着频率的添加,高频系数基本上都是0,方便採用0行程编码从而压缩数据。

☆Huffman编码----->Huffman具体原理

1.DC系数-DPCM

因为DC系数是整个8×8块的均值。所以相邻块的DC系数有非常大的相关性,同一时候DC系数通常比AC系数要大得多,JPEG标准对DC系数採用相邻DC差分(DPCM)。通常Diff具有非常小的数值,然后进行Huffman编码。

例如以下图所看到的(第一个块的DC定义为0)。

2.AC系数-行程编码

採用Zig-Zag扫描后,高频成分被量化为0,并且基本集中在一起,能够对AC系数採用0行程编码。即记录此数值前的连续数值0的个数。

以下是个对AC系数压缩的样例。

2. An example--JPEG压缩&解压缩

以下是一个压缩算法过程,对彩色图像,採用分层处理,即对不同通道分别压缩。解压缩是一个逆向的过程:

---------------------------------------------------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------------------------------------------------------

參考:

The JPEG Still Picture Compression Standard,IEEE Transactions on Consumer Electronics,1991.

Basic Image Compression Algorithm and Introduction to JPEG Standard,Pao-Yen Lin.

【数据压缩】JPEG标准与原理解析的更多相关文章

  1. 标准Trie字典树学习一:原理解析

    特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! 系列文章: 1. 字典树Trie学习一:原理解析 2.字典树Tr ...

  2. Batik - 将svg转换成其他格式图片或PDF - [导出服务器配置] 导出服务器原理解析

    导出服务器原理解析 Highcharts图表导出(或下载)本质上是将SVG代码转换为不同文件格式的过程,用到的工具是batik,所以所谓导出服务器,只不过是调用batik,将SVG代码转换并下载.下图 ...

  3. [原][Docker]特性与原理解析

    Docker特性与原理解析 文章假设你已经熟悉了Docker的基本命令和基本知识 首先看看Docker提供了哪些特性: 交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上, ...

  4. JSONP跨域的原理解析

    JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为“Same- Origin Policy”(同源策略).这一策略对于Jav ...

  5. 爱加密Android APk 原理解析

    转载请标明出处:http://blog.csdn.net/u011546655/article/details/45921025 爱加密Android APK加壳原理解析 一.什么是加壳? 加壳是在二 ...

  6. JSONP跨域的原理解析及其实现介绍

    JSONP跨域的原理解析及其实现介绍 作者: 字体:[增加 减小] 类型:转载 时间:2014-03-22 JSONP跨域GET请求是一个常用的解决方案,下面我们来看一下JSONP跨域是如何实现的,并 ...

  7. Java Web每天学之Servlet的原理解析

    Java Web每天学之Servlet的工作原理解析,上海尚学堂Java技术文章Java Web系列之二上一篇文章Java Web每天学之Servlet的工作原理解析是之一,欢迎点击阅读. Servl ...

  8. 基于OpenCV进行图像拼接原理解析和编码实现(提纲 代码和具体内容在课件中)

    一.背景 1.1概念定义 我们这里想要实现的图像拼接,既不是如题图1和2这样的"图片艺术拼接",也不是如图3这样的"显示拼接",而是实现类似"BaiD ...

  9. (转)Apache和Nginx运行原理解析

    Apache和Nginx运行原理解析 原文:https://www.server110.com/nginx/201402/6543.html Web服务器 Web服务器也称为WWW(WORLD WID ...

随机推荐

  1. Python:Fatal error in launcher: Unable to create process using 问题排查

    cmd> django-admin 回车Fatal error in launcher: Unable to create process using '"c:\users\admin ...

  2. java内存管理之内存模型

    1,运行时数据区域 1. 程序计数器 (program counter register) 2. Java虚拟机栈 (jvm stack) 3. 本地方法栈 (native method stack) ...

  3. we标签

    功能: ·        辅助标签.配合其它标签使用,防止与标准html标签冲突 ·        别名为test 使用方法: <we [name=key]>[value]</we& ...

  4. Hibernate的多种关系映射(oto、otm、mtm)

    前提:使用注解映射 一.一对一(夫妻关系表) 两个表:hus1和wife1表,外键为id,各自有名字hname和wname 映射得到两个类:Hus1和Wife1类 Hus1类(主表): package ...

  5. Java获取项目路径下的方法(全)

    平时敲代码的时候,非常多时候提示文件找不到,而抛出了异常,如今整理例如以下 一 相对路径的获得 说明:相对路径(即不写明时候究竟相对谁)均可通过下面方式获得(不论是一般的java项目还是web项目) ...

  6. 使用Dagger2创建的第一个小样例

    将Dagger系列的咖啡壶样例再做一下简化,作为Dagger2的入门的第一个小样例. 场景描写叙述:有一个电水壶,它使用一个加热器来烧水.电水壶具备的功能有:開始加热(on方法),结束加热(off方法 ...

  7. Sobel算子及C++实现

    Sobel 算子是一个离散的一阶微分算子,用来计算图像灰度函数的近似梯度. 在空间域上Sobel算子很容易实现,执行速度快,对部分噪声具有平滑作用,还能够提供较为精确的边缘方向信息,缺点是边缘定位精度 ...

  8. javascript对象的深度克隆

    在做项目的时候需要向对象里面添加新属性,又不想修改原对象.于是就写: var newObj = oldObj,但是新对象属性改变后就对象也会跟着改变,这是因为无论是新对象还是旧对象,指向的内存地址都是 ...

  9. Windows 10 Mobile 演示:系统输入法功能演示

    笔者近期会发布多篇<Windows 10 Mobile 演示>文章,帮助想买 Windows 10 手机的朋友了解 Windows 10 Mobile 系统特色.今天给大家带来 Windo ...

  10. IE6 css fixed

    .fixed-top{position:fixed;bottom:auto;top:0px;} .fixed-bottom{position:fixed;bottom:0px;top:auto;} . ...