【数据压缩】JPEG标准与原理解析

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

CSDN-勿在浮沙筑高台

为了满足不同应用的需求,JPEG标准包括两种基本的压缩方法:1.基于DCT的有损压缩算法;2.基于预测方法的无损压缩算法。基于DCT的基线系统有损压缩技术是到目前为止应用最为广泛的一种压缩方法,本文将详细解析此算法。

1.基于DCT有损压缩原理

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

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行程编码,即记录此数值前的连续非零数值个数。下面是个对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.

时间: 2024-08-02 18:43:15

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

JSONP跨域的原理解析

JSONP跨域的原理解析 一种脚本注入行为 在 2011年10月27日 那天写的     已经有 99238 次阅读了 感谢 参考或原文 JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为"Same-Origin Policy"(同源策略).这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档在同一域下的内容. JavaScript这个安全策略在进

Servlet 工作原理解析

-----转自许令波老师Servlet 工作原理解析  感觉写的很不错,保存下来,留着以后温习 从 Servlet 容器说起 要介绍 Servlet 必须要先把 Servlet 容器说清楚,Servlet 与 Servlet 容器的关系有点像枪和子弹的关系,枪是为子弹而生,而子弹又让枪有了杀伤力.虽然它们是彼此依存的,但是又相互独立发展,这一切都是为了适应工业化生产的结果.从技术角度来说是为了解耦,通过标准化接口来相互协作.既然接口是连接 Servlet 与 Servlet 容器的关键,那我们就

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

一.背景 1.1概念定义 我们这里想要实现的图像拼接,既不是如题图1和2这样的"图片艺术拼接",也不是如图3这样的"显示拼接",而是实现类似"BaiDU全景"这样的全部的或者部分的实际场景的重新回放. 对于图像拼接的流程有很多定义方式,本教程中主要介绍实现主流方法,总结梳理如下: 图像采集->投影变换->特征点匹配->拼接对准->融合->反投影 图像采集不仅仅指的是普通的图像数据的获取.为了能够拼接过程能够顺利进行.

Java类加载原理解析

1       基本信息 摘要: 每个java开发人员对java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这背后就涉及到了java技术体系中的类加载.Java的类加载机制是java技术体系中比较核心的部分,虽然和大部分开发人员直接打交道不多,但是对其背后的机理有一定理解有助于排查程序中出现的类加载失败等技术问题,对理解java虚拟机的连接模型和java语言的动态性都有很大帮助. 由于关于java类加载的内容较多,所以打算分三篇文章简述一下: 第一篇:java类

Spring?IOC设计原理解析:本文乃学习整理参考而来

Spring IOC设计原理解析:本文乃学习整理参考而来 一. 什么是Ioc/DI? 二. Spring IOC体系结构 (1) BeanFactory (2) BeanDefinition 三. IoC容器的初始化 1. XmlBeanFactory(屌丝IOC)的整个流程 2. FileSystemXmlApplicationContext 的IOC容器流程 1.高富帅IOC解剖 2. 设置资源加载器和资源定位 3.AbstractApplicationContext的refresh函数载入

【Java】Servlet 工作原理解析

Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础.因而掌握 Servlet 的工作原理是成为一名合格的 Java Web 技术开发人员的基本要求.本文将带你认识 Java Web 技术是如何基于 Servlet 工作,你将知道:以 Tomcat 为例了解 Servlet 容器是如何工作的?一个 Web 工程在 Servlet 容器中是如何启动的? Servlet 容器如何解析你在 web.xml 中定义的 Servlet ?用户的请

Protocol Buffer 序列化原理解析 - 为什么Protocol Buffer性能这么好?

前言 习惯用 Json.XML 数据存储格式的你们,相信大多都没听过Protocol Buffer Protocol Buffer 其实 是 Google出品的一种轻量 & 高效的结构化数据存储格式,性能比 Json.XML 真的强!太!多! 由于 Google出品,我相信Protocol Buffer已经具备足够的吸引力 今天,我将讲解为什么Protocol Buffer的性能如此的好: a. 序列化速度 & 反序列化速度快 b. 数据压缩效果好,即序列化后的数据量体积小 阅读本文前请先

Jetty的工作原理解析以及与Tomcat的比较

Jetty 的基本架构 Jetty 目前的是一个比较被看好的 Servlet 引擎,它的架构比较简单,也是一个可扩展性和非常灵活的应用服务器,它有一个基本数据模型,这个数据模型就是 Handler,所有可以被扩展的组件都可以作为一个 Handler,添加到 Server 中,Jetty 就是帮你管理这些 Handler. Jetty 的基本架构 下图是 Jetty 的基本架构图,整个 Jetty 的核心组件由 Server 和 Connector 两个组件构成,整个 Server 组件是基于 H

Java系统工具jps原理解析

Java系统工具jps原理解析 简介 当我们需要获取当前正在运行的Java进程时,我们可以通过操作系统自带的工具来筛选,如ps和netstat等.不过Java也提供了通用的工具来实现该功能,而且能够提供更加详细的信息.jps是Java Virtual Machine Process Status Too的简称,可以用来获取当前用户系统中的Java进程. 使用 jps的命令格式为 jps [ options ] [ hostid ],具体形式如下: usage: jps [-help] jps [