游程编码(运行长度编码)

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

    原文作者:游程编码问题
    原文地址: https://blog.csdn.net/qq_27925503/article/details/79473106
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞