游程长度编码

绪论

信息时代人们对使用计算机获取信息、处理信息的依赖性越来越高。多媒体计算机系统面临的是数值、文字、语言、音乐、图形、动画、静图像、电视视频图像等多种媒体承载的由模拟量转化成数字量信息的吞吐、存储和传输的问题。数字化了的视频和音频信号的数量之大是惊人的,与硬件技术所能提供的计算机存储资源和网络带宽之间有很大差距。这样,对多媒体信息的存储和传输造成了很大困难,成为阻碍人们有效获取和利用信息的一个瓶颈问题。多媒体信息使用的前提是进行有效的压缩。例如一段时间长度为1 min,图像尺寸为640×480 pixete,每秒播放30帧的非压缩彩色24位真彩色视频的信息量为:640×480×3×30×601658880000Bytes,约为1.6GB(未含音频信息的容量),如果用650 MBCD-R来存放,需要3张。由此可见,在视频信息的处理及应用过程中压缩及解压缩技术是十分必要的。

数据压缩技术主要采用两种方法:一种是“保真率”较高的无损压缩法;另一种是以损失信息细节而换取较高压缩比的有损压缩法。无损压缩虽然压缩比不是很高,但还原后的文件与原数据文件完全相同,从而保证了信息细节的不失真,常用的方法有统计式压缩法和字典式压缩法,统计式压缩法的编码方案主要是霍夫曼(Hufman)编码、算术编码(AC)和游程长度编码(RLC)。其中,游程长度编码是一种十分简单的压缩方法,编码/解码的速度也非常快,因此得到了广泛的应用。许多图形和视频文件,如.BMP.TIF.AVI等,都采用了这种压缩方法,尤其适用于文本(文件)数据压缩,它主要是去除文本中的冗余字符或字节中的冗余位以达到减少数据文件所占的存储空间的目的。

飞速发展的数据压缩和图像编码技术,给多媒体数据传输和数据存储带来极大的快捷和便利。但在某些数据安全性要求比较苛刻的领域,现在比较流行和压缩效果好的压缩算法几乎都属于有损范畴,对原始数据压缩处理后有不同程度的损伤,无法完全恢复,以至于不能满足技术要求,现有的无损压缩方法,如HuffmanLZ 系列、算术编码等压缩方法尽管在某些方面各有优点,但压缩效果比较差或者算法实现比较困难,因此十分有必要对无损压缩算法进行研究。通过对游程编码(Run LengthEncoding,RLE)进行研究,最后提出一种实现相对简单、压缩效果比较好的算法,采用该算法可以收到比较理想的效果,基本克服由于RLE自身特点而引起的数据扩张的现象。

本文主要介绍了游程长度编码的原理和实现的技术,对游程长度编码技术做了较为全面地研究。包括游程压缩模型、数据压缩、解压缩过程,并给出了流程图和相应的程序。本文把数据压缩、解压缩分别应用在文本压缩和图象压缩两个大的分支上,分别对两个方面进行优化设计,同时也给出了大部分程序代码的算法设计的注释和MFC编程控件的详细设计方法。其次对程序压缩能力作了一个测试,并对测试结果进行对比、综合讨论。


第一章 游程长度编码算法概述

飞速发展的数据压缩和图像编码技术,给多媒体数据传输和数据存储带来极大的快捷和便利。但在某些数据安全性要求比较苛刻的领域,现在比较流行和压缩效果好的压缩算法几乎都属于有损范畴,对原始数据压缩处理后有不同程度的损伤,无法完全恢复,以至于不能满足技术要求。现有的无损压缩方法,如HuffmanLZ 系列、算术编码等压缩方法尽管在某些方面各有优点,但压缩效果比较差或者算法实现比较困难,因此十分有必要对无损压缩算法进行研究。

1.1 信源编码原理[1][2][3][4]

定义一象元的M层,其灰度值 的平均信息量或熵为:

                (1.1)

其中 为每一个灰度等级 出现的概率,熵值可以在0~ 之间变化,即编码后的码长平均起来不得少于熵值 。对于游程编码,设定一个象元出现边缘的概率为P,而象元间是相对独立的,则边缘间游程长度Z的概率分布可用下式表示:

                      (1.2)

式中 。当游程长度 时,表示两个相邻边缘的情况。在这种简单的统计假设条件下,边缘长度的均值 为:

            (1.3)

而边缘间游程长度Z的熵为:

    (1.4)

假如游程的最大长度为M个象元,则对应的边缘间的熵,可近似得出:

           (1.5)

把对应边缘间游程的熵除以游程长度的均值,就可以得到每个象元的熵为:

                   (1.6)

以上各式的推导参见[1]。由以上公式可以得出对于黑白灰度的二值图象,使用二维游程编码,可以使压缩比达到101

1.2 游程长度

游程长度RL(Run-Length),简称游程或游长,指的是由字符(或信号取样值)构成的数据流中各个字符重复出现而形成的字符的长度。如果给出了形成串的字符,串的长度以及串的位置,就能恢复出原来的数据流,游程长度编码(RLC)就是用二进制码字给出这些信息的一类方法。

1.3 游程长度编码的基本原理[5][6]

在二元序列中,只有两种符号,即“0”和“1”,这些符号可连续出现,连“0”这一段称为“0”游程,连“1”这一段称为“1”游程。它们的长度分别称为游程长度L(0)L(l)。“0”游程和“l”游程总是交替出现的。如果规定二元序列是以“0”开始,第一个游程是“0”游程,第二个必为“1”游程,第三个又是“0”游程等等。对于随机的二元序列,各游程长度将是随机变量,其取值可为123,…,直到无限。

将任何(二元)序列变换成一一对应的游程长度序列,再按哈夫曼编码或其他方法处理以达到压缩码率的目的

游程长度编码的主要思想是将一个相同值的连续申用其值和申长(重复的个数)的数对二元组来替代。例如,在图像编码中,可以定义沿特定方向上具有相同灰度值的相邻像素为一轮,其延续的长度称之为延续的行程,即游程。游程终点位置由前一游程终点的相对距离确定,这样就可以由灰度游程串来表示图像数据。例如,若沿水平方向有一串M 个像素具有相同的灰度N,则按游程长度编码后,只传递两个值(NM)就可以代替这M 个像素的M个灰度值NJ简单来说,游程长度编码的主要任务是统计连续相同字符的个数,解码时要根据字符及连续相同字符的个数,恢复原来的数据。

1.3.1 文本游程压缩的原理

对重复字段采用3符号标识法:

(1) 重复提示符,比如@#等;

(2) 游程长度参数或重复次数,若用一个字节表示,最大长度可为255个重复字;

(3) 重复字符。

以上三部分合称为重复因子。可见要获得压缩效益,重复字符应在3个以上。对于非重复字段则直接拷贝字段,不做任何处理。

1.3.2 图象游程压缩的原理

对于二值图像,原始数据为零一矩阵,压缩时逐行处理该矩阵:

(1) 连续n1,表示为+n

(2) 连续n0,表示为-n

在游程长度编码(RLC)中用3个字节表示一个字符申:第一个字节是压缩指示字符,第二个字节记录连续出现的字符,第三个字节记录重复字符出现的次数。可见,只有当RL>3时进行数据压缩才有意义,因此,编码时首先要判断RL值,然后再决定是否进行游程长度编码(RLC);解码时则需根据每一字符后是否为,再决定其下一字符的含义,如下图所示:

例如:设一幅二维黑白图像F(i,j)的各像素的灰度值如下所示,规定沿水平方向从左到右扫描,则扫描后得到的游程为右边的13个二元数组。

1.1 游程长度编码模型

1.2 黑白图象传送实例

由上例可见:

(1)该图像是由8行、8列共64个像素组成;

(2)像素的灰度值变化范围是:08

由于是黑白图,颜色过渡只是黑一灰一白,按人眼分辨率,用8 bit即得

(3)第一行8个像素灰度值相同,只传(88);第二行只传(84) (74);第三行只传(78);第四行只传(64)(54);第五行时只传(55) (33);第六行只传(38);第七行只传(33) (25);第八行只传(14)(04)。这样,64个像素只需传13个数据对即可, 比一个个像素传送要节省很多时间.

一般情况下,编码时间为2~4倍的解码时间。


第二章 开发环境

2.1 Microsoft Visual C++ 6.0 中文版[7]

2.1.1 简介

Microsoft Visual C++是一种从C语言的基础上逐步发展和完善起来的,而C是吸收了其他语言的一些优点逐步成为实用性很强的一种语言。

C++并不是对C语言的简单的改进和扩充,而是一种本质性革新。C++C语言的一个超集,大多书的C程序代码略做修改和不做修改就可以在C++的集成环境下调试。C++是面向对象的程序设计语言,它似的程序的各个模块的独立性更强,程序可读性和可理解性更好。C++的扩充性强,具有封装性,继承派生性,重载性和多态性。

Microsoft Visual C++ 6.0 中文版为用户开放C++程序提供了一个集成的环境,而这个集成环境包括:源程序的输入,编辑和修改,源程序的编译和连接,程序运行间的调试和跟踪,项目的自动管理,为程序的开放提供工具,窗口管理,联机帮助。正是由于这个继承的环境功能齐全,故选择了Microsoft Visual C++ 6.0 中文版作为界面,图象文本压缩的开放工具。

2.1.2 主要特点

2.1 Microsoft Visual C++ 6.0界面

Windows 98XP下启动VC++的集成环境,则产生下图所示的组合窗口。

窗口的最上面部分为标题。第二部分为菜单条,其中包括“文件(File)编辑(edit)”等菜单。第三部分是功能按钮,类同于Word,有“打开”文件等等按扭。

当要建立一个新的源程序文件时,选择“file”菜单中的“new”命令,这时弹出一个子窗口,在子窗口中选择“file”按扭,在弹出的信息窗口中再选择“c++ source file”,这时光标进入源程序编辑子窗口,就可以输入源程序了。

当正确输入源程序文件后,可以选择“file”菜单中的“open”命令,然后按照提示的信息,选择相应的源程序文件名。由系统将指定的源程序文件调入源程序编辑子窗口,就可以对源程序文件进行编辑。

当正确地输入源程序文件后,先存盘,然后可选择“build”菜单中的“build”命令来编译源程序和连接目标程序,最后选择“build”菜单中的“execute”来执行程序。


第三章 实现算法

3.1 数据压缩算法流程[8][9]

用游程长度编码压缩数据时,首先要计算每次连续相同字符的个数,然后将每次连续相同的字符及个数保存起来。这种压缩数据的方法,连续相同的字符及出现连续相同的次数越多,压缩比就越大,反之,压缩比就越小。

(1)打开源数据文件和压缩后的数据文件;

(2)从源数据文件中读取字符,并把它放人一个寄存器中,然后再循环读取后面的字符,并与寄存器中的字符相比较。如果相等,则计数器加1,否则,把寄存器中的字符和计数器中数写入压缩数据文件中,然后再把寄存器中字符不相等的字符放入寄存器中,并把计数器置1

3.1 RLC数据压缩算法流程图

3.2 数据解压算法流程

(1)打开压缩数据文件和恢复文件;

(2)从压缩文件中循环读出字符和该字符连续的个数,在恢复文件中连续写入从压缩文件中读出的字符,写的次数等于该字符连续的个数。

3.2 RLC数据解压缩算法流程图

3.3 文本游程压缩的算法

3.3.1 文本压缩部分

初始化计数变量(已读字符数C,重复字符数R);

       如果待压缩文本m_cOriginalText没有结束{

             

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值