当前位置:首页 > 代码 > 正文

游程编码代码(游程编码的实现)

admin 发布:2022-12-19 02:42 128


本篇文章给大家谈谈游程编码代码,以及游程编码的实现对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

什么是游程编码?原理是?其有什么特点或缺点?

游程编码又称“运行长度编码”或“行程编码”,是一种统计编码,该编码属于无损压缩编码,是栅格数据压缩的重要编码方法。对于二值图有效。

行程编码的基本原理是:用一个符号值或串长代替具有相同值的连续符号(连续符号构成了一段连续的“行程”。行程编码因此而得名),使符号长度少于原始数据的长度。只在各行或者各列数据的代码发生变化时,一次记录该代码及相同代码重复的个数,从而实现数据的压缩。

常见的游程编码格式包括TGA,Packbits,PCX以及ILBM。

行程编码是连续精确的编码,在传输过程中,如果其中一位符号发生错误,即可影响整个编码序列,使行程编码无法还原回原始数据。

游程长度在栅格加密时,数据量没有明显增加,压缩效率较高,且易于检索、叠加合并等操作,运算简单,适用于机器存储容量小,数据需大量压缩,而又要避免复杂的编码和解码运算,增加处理和操作时间的情况。

游程编码的介绍

游程编码(RLC, Run Length Coding),又称“运行长度编码”或“行程编码”,是一种统计编码,该编码属于无损压缩编码,是栅格数据压缩的重要编码方法。对于二值图有效。游程编码,又称行程长度编码或变动长度编码法,是一种与资料性质无关的无损数据压缩技术。变动长度编码法为一种“使用固定长度的码来取代连续重复出现的原始资料”的压缩技术。

游程长度编码的介绍

游程长度编码(run-length code)游程长度编码是栅格数据压缩的重要编码方法,它的基本思路是:对于一幅栅格图像,常常有行(或列)方向上相邻的若干点具有相同的属性代码,因而可采取某种方法压缩那些重复的记录内容。其编码方案是,只在各行(或列)数据的代码发生变化时依次记录该代码以及相同代码重复的个数,从而实现数据的压缩。

游程编码的基本原理

行程编码的基本原理是:用一个符号值或串长代替具有相同值的连续符号(连续符号构成了一段连续的“行程”。行程编码因此而得名),使符号长度少于原始数据的长度。只在各行或者各列数据的代码发生变化时,一次记录该代码及相同代码重复的个数,从而实现数据的压缩。

常见的游程编码格式包括TGA,Packbits,PCX以及ILBM。

例如:5555557777733322221111111

行程编码为:(5,6)(7,5)(3,3)(2,4)(1,7)。可见,行程编码的位数远远少于原始字符串的位数。

并不是所有的行程编码都远远少于原始字符串的位数,但行程编码也成为了一种压缩工具。

例如:555555 是6个字符 而(5,6)是5个字符,这也存在压缩量的问题,自然也会出现其他方式的压缩工具。

在对图像数据进行编码时,沿一定方向排列的具有相同灰度值的像素可看成是连续符号,用字串代替这些连续符号,可大幅度减少数据量。

游程编码记录方式有两种:①逐行记录每个游程的终点列号:②逐行记录每个游程的长度(像元数)

第一种方式: A A A B B A C C C A 这个栅格图形就记为:

A,3,B,5

A,1,C,4,A,5

第二种就记作:

A,3,B,2

A,1,C,3,A,1

行程编码是连续精确的编码,在传输过程中,如果其中一位符号发生错误,即可影响整个编码序列,使行程编码无法还原回原始数据。

游程长度在栅格加密时,数据量没有明显增加,压缩效率较高,且易于检索、叠加合并等操作,运算简单,适用于机器存储容量小,数据需大量压缩,而又要避免复杂的编码和解码运算,增加处理和操作时间的情况。

举例来说,一组资料串"AAAABBBCCDEEEE",由4个A、3个B、2个C、1个D、4个E组成,经过变动长度编码法可将资料压缩为4A3B2C1D4E(由14个单位转成10个单位)。

简言之,其优点在于将重复性高的资料量压缩成小单位;然而,其缺点在于─若该资料出现频率不高,可能导致压缩结果资料量比原始资料大,例如:原始资料"ABCDE",压缩结果为"1A1B1C1D1E"(由5个单位转成10个单位)。

双游程编码

#include iostream

#include string.h

using namespace std;

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

void DRLC(char *s) { //双游程编码

int i=0,j=0;

char code='1',ending='0',t;//初始化 '0'为结束符,'1'为编码符

while(*s) {

if(*s==code) {

for(;j0;j--) printf("0");//ending没有累积到9个,输出 j 个 0

i++;

if(i==9) {

printf("%d",i);

i=0;

}

} else if(*s==ending) {

if(i0) {

printf("%d",i);

i=0;

} else if(++j==9) { //翻转编码

printf("%d",j);

t=code;

code=ending;

ending=t;

j=0;

}

}

s++;

}

if(j0) printf("%d",j);//输出末尾可能存在的 ending 个数

printf("\n");

system("pause");

}

int main(int argc, char** argv) {

char s[]="10 111111111 111110 1110 000000000 001 11";

DRLC(s);

return 0;

}

关于游程编码代码和游程编码的实现的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/1131.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载