1、运行长度编码(RLE)
游程长度编码是栅格数据压缩的重要编码方法,它的基本思路是:对于一幅栅格图像,常常有行(或列)方向上相邻的若干点具有相同的属性代码,因而可采取某种方法压缩那些重复的记录内容。其编码方案是,只在各行(或列)数据的代码发生变化时依次记录该代码以及相同代码重复的个数,从而实现数据的压缩。
游程长度编码在栅格加密时,数据量没有明显增加,压缩效率较高,且易于检索,叠加合并等操作,运算简单,适用于机器存贮容量小,数据需大量压缩,而又要避免复杂的编码解码运算增加处理和操作时间的情况。
例如:5555557777733322221111111
行程编码为:(5,6)(7,5)(3,3)(2,4)(l,7)。
2、代码
function S=RLC(I)
%======================================================================================================
% 游程长度编码是栅格数据压缩的重要编码方法,它的基本思路是:对于一幅栅格图像,常常有行(或列)方向上相邻的若干点
% 具有相同的属性代码,因而可采取某种方法压缩那些重复的记录内容。其编码方案是,只在各行(或列)数据的代码发生变化
% 时依次记录该代码以及相同代码重复的个数,从而实现数据的压缩。
%------------------------------------------------------------------------------------------------------
% 例如:5555557777733322221111111
% 行程编码为:(5,6)(7,5)(3,3)(2,4)(l,7)。
%===================================================================================================
[m,n]=size(I);
if m~=1&&n~=1
I=I';
I=reshape(I,1,m*n);
end
j=1;
count=1;
% 对第一个到第m*n个进行一般化处理
for i=1:m*n-1
if I(i+1)==I(i)
count=count+1;
else
S(j,1)=I(i);
S(j,2)=count;
j=j+1;
count=1;
end
end
% 最后一个元素处理有两种情况。其一,和前一个元素相等,其二,和前一个元素不等。
% 无论属于哪一种情况都没有在S中记录。
if I(m*n)==I(m*n-1)
S(j,1)=I(i);
S(j,2)=count;
else
S(j,1)=I(m*n);
S(j,2)=1;
end
% I为字符串
% if m==1||n==1
% S(:,1)=S(:,1)-'0';
% S=double(S);
% end
end
3、示例
### 字符串(使用时需将处理字符串代码注释取消)
>> a=’5555557777733322221111111 ‘
a =
5555557777733322221111111
>> RLC(a)
ans =
5 6
7 5
3 3
2 4
1 7
### 一般矩阵
>> a=randint(3,4)
Warning: This is an obsolete function and may be removed in the future. Please use RANDI instead.
> In randint at 41
a =
0 0 1 1
0 0 0 0
1 0 1 1
>> RLC(a)
ans =
0 2
1 2
0 4
1 1
0 1
1 2