ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:57.96KB ,
资源ID:3635396      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3635396.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(DCT算法的相关知识与原理.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

DCT算法的相关知识与原理.docx

1、DCT算法的相关知识与原理DCT变换后的数据左上角是低频右下角是高频忽略了高频(量化),并且用ZigZag方式排列DCT系数,前几个都是比较大的值,后面都是0这种有规律的排列就可以找出规律压缩(游程编码)对直流分量进行的是Huffman编码DCT和FFT有关联,反正可以变到频域色度和亮度原来也是二进制的,只不过随机一些DCT本身不是用来压缩的,只是把数据组织得便于压缩而已,特别是用于有损压缩。DCT变换后的数据如果不经量化,再反变换后是可以无损还原的。简而言之,DCT变换后的数据,左上角的非常重要,要精确存储,右下角的可以粗略存储,甚至扔掉也没关系。图象压缩(JPEG)编码算法及压缩过程的实现

2、摘要本文首先介绍了静态图像压缩(JPEG)编码算法的基本原理、压缩的实现过程及其重要过程的离散余弦变换(DCT)算法的实现原理及软件实现的例程,其次着重介绍了压缩过程中的DCT、量化和编码三个重要步骤的实现原理。关键词:图像压缩 有损压缩 JPEG 离散余弦变换 DCT 量化 第一章 图像压缩编码的综述1.1 图象压缩的目的和方法 图象的数字化表示使得图象信号可以高质量地传输,并便于图像的检索、分析、处理和存储。但是数字图像的表示需要大量的数据,必须进行数据的压缩。即使采用多种方法对数据进行了压缩,其数据量仍然巨大,对传输介质、传输方法和存储介质的要求较高。因此图象压缩编码技术的研究显得特别有

3、意义,也正是由于图象压缩编码技术及传输技术的不断发展、更新,推动了现代多媒体技术应用的迅速发展。1.1.1 图象压缩的目的 图象采样后,如果对之进行简单的8bit量化和PCM编码,其数据量是巨大的。以CIF(Common Intermediate Format)格式的彩色视频信号为例,若采样速率为25帧/秒,采样样点的Y、U、V分量均为8bit量化,则一秒钟的数据量为: 352288382560.83Mbit要传输或存储这样大的数据量是非常困难的,必需对其进行压缩编码,在满足实际需要的前提下,尽量减少要传输或存储的数据量。虽然数字图象的数据量巨大,但图象数据是高度相关的。一幅图象的内部相邻象素

4、之间,相邻行之间的视频序列中相邻图象之间有大量冗余信息空间相关性和时间相关性,可以使用各种方法尽量去除这些冗余信息,减少图象的数据量。除了时间冗余和空间冗余外,在一般的图象数据中还存在信息熵冗余、结构冗余、知识冗余和视觉冗余。各种冗余就是压缩图象数据的出发点。图象编码的目的就在于采用各种方法去除冗余,以尽量少的数据量来表示个重建图象。1.1.2图象压缩的几种方法1.统计和字典的压缩方法 常规程序和计算机熵的数据对于那些基于利用统计变种的压缩,效果很好,这些统计变种表现在单个符号的频率以及符号或短语字符串的频率等方面,而基于字典的系统实际山就是假扮统计程序。可是遗憾的是,这类压缩对于连续色调图象

5、的作用并不很好。这些程序的主要问题产生于这样的一个事实:照片图象的象素广泛地分布在整个范围。如果将图象中的彩色用频率分布画出,那么频率分布图中,没有我们在统计压缩的成功的情况下所看到的“尖峰”状,实际上,如果延长这个分布图,那么从类似于电视那样的生活图象源中得出的分布图会趋于平展。这意味着,每个象素代码彼此是大约相同的出现机会,决定不存在挖掘熵差的任何机会。基于字典的压缩程序的运行也有类似的问题,基于扫描照片的图象决定没有任何类型的数据特征以产生相同的短语的多次出现。例如,一个栅格化的图象,类似房子墙边的垂直部分,在图片的许多连续的行中可能可以给出相似的字符串。但不幸的是,由于真实世界是变化多

6、端的,每行中的相同的性能将彼此地略有不同,对于20个象素的一个字符串,其中的一两个象素会因扫描而彼此出现一步长的变化,虽然这些不同点小到人眼不能探测或对人眼不起作用,但他们毕竟妨碍了基于字典压缩的工作,对于这类压缩方法来说,字符串必须严格匹配,由于小的变化,而使匹配的字符串长度趋于很小,这就限制了压缩的效率。2.有损压缩类似于音频数据,图形图象也同样有一个比常规计算机数据文件优越的地方:在压缩/扩展的循环中,他们可以被略微改动,而不会影响用户的立即质量。如果仔细修改,那么各处象素的精确灰度可以完全不被注意地进行小的改变。由于计算机栅的图形图象通常来自对真实世界源的扫描,所有他们通常表达一个已经

7、不完美的照片的表达或是不完美的其他打印接着的表达。没有改变图象基本性能的有损压缩程序应该是可行的。假设图形图象的有损压缩是可能的,那么它是如何实现的呢?研究人员最初试验了用于语音信号的同样的技术,如差分编码和自适应编码,虽然这些技术对图象有帮助,但并没有达到所希望的那么好,原因之一是音频数据和视频数据根本不同。用常规格式采样的音频数据是趋于反复的,声音,包括讲话,是由每次几秒的重复的正弦波组成的。虽然计算机上DAC的输入流可能由许多不同的频率叠加在一起而成,但是正弦波通常产生反复的波形。音频反复的本性自然使他利于压缩,线性预言编码和自适应差分脉冲编码调制等技术就利于了这一点,因此将音频数据流压

8、缩了50到95。但开始研究图形压缩时,人们也试图用相似的技术压缩数字化的图象,取得了一些成功。最初,研究人员进行栅格化数据流的压缩,如显示在电视机栅的数据。图形数据栅格化时,图形显示成一个象素流,每次一行地显示在屏幕上,从左到右,从上到下。这样,当完成一行时,图片的一个细片就画出了,直到整个屏幕填满。数字化时,象素可以使用从1位到24位,如今的琢磨图形常常使用8位来定义一个象素。3.差分调制差分调制依赖余模拟数据趋于“平缓”的变化,信号幅度撒谎那个的大的跳变是例外,而不是常规。在音频数据中,只要信号的采样率一定程度地高于信息本身的最大的频率分量,那么大的跳变就不会产生。音频信号的差分调制通过编

9、码一个样点与前一个样点的不同来利用这一个特点。例如,如果单频样点位8位,差分编码系统可能用4位来编码样点之差,这就将输入数据压缩了50。这种压缩方法中所产生的损失是来自于:使用标准的差分方法不可能总是精确地编码。信号的增长可能快于比编码的允许,或者,编码可能太粗而不能容纳下的差别,差分编码的有损性可以很好的处理,以产生出好的信号。当压缩图形数据时,差分调制有很多问题。首先,图形中的象素依赖于平缓的增加或减少时不可靠的,一幅图中不同的分量间的明显界限时常有的事情。这意味着,使用差分编码的系统需要接受样点间的大的不同和小的不同。这就限制了压缩的效率。带有数据长结构的许多图象可以压缩的很好。长结构中

10、的象素,彼此之间没有什么差别或差别很少;但时,带有突变部分的那些图象不可能压缩的很好。通常,图形图象的差分的编码似乎不产生非常强于最好的无损算法的压缩结果,他当然也不会产生所需要的、对压缩的数量级上的改进。4.自适应编码自适应编码(常常于差分编码一同使用)根据前面看到的一些象素而对将要到来的一些象素的信息做预言。例如,如果一幅灰度级照片中的最新的十个象素的值都在45到50之间,那么自适应压缩系统可能预言,下一个象素很大可能也在这个范围中,之后,类似于霍夫曼或算术编码那样的基于熵的编码方案可能给将来到来的各种代码赋以概率值。可以代替地使用压缩扩展方法,将最细的粒度赋给最接近预言猜测的范围。第二章

11、JPEG编码算法2.1JPEG压缩编码基础七十年代末八十年代初,研究工作开始着眼于新的图像压缩类型,希望能够大大地优于前面所讨论过的那些非常一般的压缩技术。到八十年代末,开始可为桌面系统的图像处理而寻找应用的工作,大多是是为UNIX和Macintosh工作站加入的协处理器卡的形式,这些卡的图象质量没有任何可见退化的情况下,可以以95的比率执行图像的有损压缩。同时,另一部分人开始发展一个国际标准,它能够包括这些新的压缩的种类。如果标准允许方便的图形格式的互换,那么,显然,对于各方面都是有利的,关于标准化工作,早期的担心是:它会限制进一步革新的可能性。两个标准化组织,CCITT和ISO,分别从涉及

12、图像压缩的工业和学术两个入手,并且,似乎已经潜在的阻止了工作的负结果。2.2.1JPEG算法于JPEG小组简介JPEG(Joint Photographic Experts Group)是由 ISO/IEC JTC1/SC2/WG8和CCITT VIII/NIC于1986年底联合组成的专家小组。JPEG小组的工组事研究具有连续色调的图像(包括灰度及彩色图像)的压缩算法,并将其制定为适用于大多数图像存储及通信局设备的标准算法,JPEG小组于1990年提出JPEG算法的建议,并决定对建议中的算法不再修改,除非发现了危害压缩算法标准的问题。作为静态图像压缩的标准算法,JPEG算法必须满足以下要求:算

13、法独立于图像的分辨率;具有低于1bit/象素的编码率,并且能够在五秒钟内建立图像,以满足实时要求;在压缩比大约是2的情况下能够无失真地恢复原图像;支持顺序编解码和渐进编解码;以及对各种图像成分及数据精度的自适应能力;最后,要求编解码设备简单易实现。JPEG小组指定了一系列实现静态图像压缩编码的方法,这些方法的选择决定于具体应用的要求及性能价格比的考虑。这些方法基本上可以分为两类:基于离散余弦变换的编码和基于空间域预测编码的方法。前者,即离散余弦变化的方法压缩倍率较高但算法复杂,较难实现;后者,即预测编码的方法虽然压缩倍率较低,但是可以实现无损压缩。JPEG中允许四种编解码模式:(1)基于DCT

14、的顺序模式(sequential DCT-based)(2)基于DCT的渐进模式(progressive DCT-based)(3)无失真模式(Lossless)(4) 层次模式(hierarchical).其中,(1)和(2)是基于DCT的有损压缩;(3)是基于线性预测的无损压缩;(4)可以是DCT与线性预测的分层混合。JPEG算法可分为基本JPEG和扩展,即Baseline System 与Extended System。在Baseline System中生成的编码文件,在Extended System中一定可以正确解码。2.1.2 JPEG压缩JPEG有损压缩算法在三个成功的阶段中操作,

15、见图21DCT Coefficient Lossless Transformation Quantization Compression 这三个步骤形成了一个强有力的压缩器。,可以将连续色调图像压缩到少于原大小的10,同时丢失很少的原始逼真度。2.2 JPEG中的二维DCT本文所讨论的压缩过程的关键是被称为离散余弦变换(Discrete Cosine Transform,DCT)的数学变换。Baseline System中的DCT要求输入数据是一个88的矩阵,且每个矩阵元素具有8bit精度,分为从128到127,故DCT变换前,象素值先要减去128。所谓88的二维DCT是指将88的象素值矩阵变

16、换成88系数矩阵。88象素值矩阵是由输入图像分块得到的,若图像的高或宽不是8的整数倍,必须扩展其下边或右边到8的整数倍。下面(式21)给出了二维DCT的实用公式。式22是反离散余弦变化(IDCT)公式。式中表示的是88个象素值的矩阵进行计算的,产生出88频率系数的矩阵。88的DCT及IDCT 公式如下: 这个公式初看起来让人害怕,但它可以用相当直接的代码段来表示。for ( i = 0 ; i 8 ; i + + ) for ( j = 0 ;j 8 : j + + ) temp 0.0; for ( x = 0 ; x 8 ; x + ) for ( y = 0 ; y 0一旦建立了余弦变换

17、矩阵,我们绕着它的主对角线旋转,将其转置,这个转置矩阵在代码中表示,称作转置余弦变换矩阵。矩阵的建立只需在程序初始化时进行一次,两个矩阵可以用相对短小的循环在同一时刻建立。见下面的代码: for ( j = 0 ;j N;j +) C 0 j = 1.0 / sqrt (N); Ct j 0 = C 0 j ; for ( i = 1 ;i N; i +) for ( j = 0; j N ;j +) C i j = sqrt ( 2.0/N )*cos( ( 2* j + 1 ) * i * pi / ( 2.0 * N ) ; Ct j i = C i j ; 一旦这两个矩阵建立,我们就可

18、以使用DCT函数的替代定义: DCT = C * 象素 * Ct在这个等式中,“*”运算符表示的事矩阵相乘,而不是一般的算术相乘。等式中的每个因子是一个N*N的矩阵,在JPEG算法以及本章所只用的程序中,矩阵为88。进行两个矩阵相乘时,输出矩阵中每个元素的运算代价时N个乘法操作和N个加法操作,由于我们用两个矩阵相乘来建立DCT矩阵,在变换后的DCT矩阵中的每个元素都是用2N个乘法和加大建立起来的,这一点,大大地改进了前面使用嵌套循环的DCT定义。 / * MatrixMultiply( temp , input , Ct )*/ for ( i = 0 ; i N; i + ) for ( j

19、 = 0 ;j N ; j + ) temp i j = 0.0 for ( k = 0 ; k N ; k + ) temp i j + = ( pixel i k * Ct k j ; / * MatrixMultiply( output ,C, temp ); */ for ( i = 0 ; i N ; i + ) for ( j = 0 ; j N ; j + ) temp1 = 0.0; for ( k = 0 ; k N ; k + ) temp1 + = C i j * temp k j ; DCT i j = temp1 ; 上面显示的是通过矩阵运算实现DCT的简单代码片段。

20、值得注意的是,代码中主要是两个三层的嵌套循环,第一个三层嵌套循环是用输入的象素序列于转置余弦变换矩阵相乘,产生临时矩阵;之后,在第二个三层嵌套循环中,临时矩阵于余弦变换矩阵相乘,产生输出的DCT矩阵。 第三章 压缩过程3.1DCT的输出由输入的象素值矩阵及输出的DCT矩阵可已经看出DCT所建立的频谱压缩特性。“直流系数”位于矩阵左上角的位置,这个表示的是输入矩阵的所有幅度的一个平均,它代表了X和Y坐标轴上的DC分量,而且直流系数要比DCT矩阵中任意值都打至少一个数量级。另外,在DCT矩阵中有一个通常的趋势,随着元素离直流系数越来越远,这些元素的幅度上也变的越来越小。这意味着,通过在输入数据中执

21、行DCT,我们已经将图像的表达集中在输出矩阵的左上角的系数上,而DCT矩阵的右下角部分所包含的是没有用的信息。也很有利于数据的压缩。3.2 量化由图21可知JPEG压缩过程分为三个步骤。第一步是DCT变换,这是一个无损压缩变换,它实际上并不实现压缩,是“有损”的准备,即为“量化”处理阶段做准备。DCT输出矩阵比原始象素矩阵占有更多的存贮空间,DCT函数的输入包括8位象素值,但输出值的范围从1024到1023,占用11位,因此,为使DCT矩阵占用较少空间,就需要做些事情。减少DCT矩阵存贮位数的行为称为“量化”(Quantization)。量化只不过是通过减少整数单精度来减少存贮整数值所需要的位

22、数第一个过程。一旦DCT图像压缩,我们可以随着原理原点处的直流系数越来越多的减少系数的精度:离(0,0)点越远,这个元素对于图形图像的贡献就越小,所有我们就越不用注意去维持这个值的精确精度。3.2.1量化的算法描述JPEG算法使用量化矩阵(Quantization Matrix)来实现量化。对于DCT矩阵中的每个元素位置,两个矩阵中的相应位置给出了一个量子值(Quantum Value),量子值指示出图像压缩时元素的步长大小是多少,其范围是1到255。与图像关系最密切的元素用小步长编码,大小为1表示最高精度。随着我们从原点移开,值将变得较高,量化的实际公式相当简单: 量化后的值(i, j) 圆

23、整成最近的整数从公式中可以清楚地看到,大于25或50的量化值可能可以保证素有高频分量实际上将近似到0,只有高频系数达到不寻常大值,才会编码成非0。译码时,逆量化公式为:DCT(i, j) 量化后的值(i,j)*量子(i, j)3.2.2量化矩阵的选择 显然有许多方法可以用来定义两个矩阵中的值,至少有两个试验途径可以测试不同的量化方案。一个是在图像还原以后,测量输入输出图像之间的数学误差;第二个途径试图用人眼来判断还原的结果,它与误差方面的数学差别不可能总是绝对一致。由于量化矩阵可以定义在压缩进行的运行时间,所以JPEG允许使用任何量化矩阵。在运行时间选择量化矩阵的好处之一是在被压缩的图形使用J

24、PEG算法时可以相当简单地“打入”图像的质量值。可以基于突袭拿过需要和存贮容量来选择图像质量。下面的程序所提供的用于测试代码的量化表是使用非常简单的算法卷里起来的。要确定量子步长大小的值,用户输入一个单个的“质量因子”(quality factor),它的范围为1到25。大于25的值是可以工作的,但是值为25时,图像质量已经退化得很厉害,所以任何进一步的实验都是无意义的。 for ( i = 0 ; i N ; i + ) for ( j = 0 ; j N ; j + ) Quantum i j = 1 + ( 1 + i + j ) * quality ) ; 质量等级设置了彼此相邻的相同

25、量化水平带的不同,这些量化水平带是面向横贯矩阵的对角线。所以,一个值的量化水平都与原点有大约相同的距离。由配置的结果看,位置(7,7)处的DCT系数值为16,编码成非零值,在元素值为图像提供任何有意义的信息之前,它为该元素值设定了界限,任何此界限一下的贡献都被扔掉。这就是算法中发生“有损”效果的地方。DCT的第一个步骤中除了数学精度损失外没有任何损失,并且量化之后的步骤也是无所的编码过程,所以我们有机会丢掉数据的唯一地方就在这儿。由将DCT矩阵量化后的量化结果来看,量化/逆量化周期有明显的压缩效果,矩阵的高频部分已大部分截成0,消除了在被还原图像中的影响,矩阵中接近直流系数的系数可能被修改,但

26、与原系数相比修改不大。下图即为量化前和逆量化后的DCT矩阵的结果。DCT Matrix before 92 3 -9 -7 3 -1 0 2Quantization -39 -58 12 17 -2 2 4 2 -84 62 1 -18 3 4 -5 5 -52 -36 -10 14 -10 4 -2 0 -86 -40 49 -7 17 -6 -2 5 -62 65 -12 -2 3 -8 -2 0 -17 14 -36 17 -11 3 3 -1 -54 32 -9 -9 22 0 1 3DCT Matrix after 90 0 -7 0 0 0 0 0Dequantization -3

27、5 -56 9 11 0 0 0 0 -84 54 0 -13 0 0 0 0 -45 -33 0 0 0 0 0 0 -77 -39 45 0 0 0 0 0 -52 60 0 0 0 0 0 0 -15 0 -19 0 0 0 0 0 -51 19 0 0 0 0 0 03.3编码JPEG过程的最后步骤湿编码量化了的图像。JPEG的编码阶段由压缩图像的三个不同步骤组成。(1)第一步是将(0,0)处的直流系数由绝对值变为相对值,因为图像中相邻的块表现出了高度的相关。用与前一个直流元素的差来编码直流元素,就回产生一个非常小的数值。(2)第二步是将图像系数安排成“zig-zag”序列。(3)最后

28、一步是用两种不同的机制编码。第一个机制是0值的行程编码。第二个是JPEG所称作的熵编码(Entropy Coding),这是根据现实者的选择,用霍夫曼代码或算术编码送出系数代码的一步。 3.3.1ZigZag序列JPEG算法压缩如此有效的原因之一是,在量化过程中,DCT图像的大量的系数截断成了0值,有这么多的0值,JPEG委员会就选择了与处理其他系数值不同的方法处理0值。不使用霍夫曼或算术编码来压缩0值,而是使用行程编码算法(RunLength Coding,RLE),所开发的程序代码很简单,只是给出图像中连续0值的计数。由于在许多图像中,近一半的系数已量化成0,这就给杰出的压缩提供了机会。增加行程差功能度的算法是将系数序列重新排序成ZigZag序列。JPEG算法没有象程序员可能进行的那样按照主行的顺序压缩系数,而使沿着对角线路径移动块,首先选择最大的元素值,并向可能是最小的值方向走。ZigZag序列的实际路线显示在图31中。用C实现ZigZag序列可能用简单的查寻表来完成是最好的。本章的样例代码中,序列编码程序成结构的一部分,该结构可以顺序存取以确定要编码的行和列。 struck zigzag int row; int col; Zigzag N * N = 0,0, 0,1,1,0, 2,0,1,

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1