基于RLE的matlab图像无损压缩实现

这两天老师上课讲到了RLE无损压缩的方法,随后布置了作业,编程对不同图像使用rle压缩,并分析。然后我使用matlab就开干了,然而由于对RLE方法了解不多,上课老师好像也没提这种方法是针对二值图的,然后我就用来做灰度图了,不过感觉差不多,下面是matlab代码:

clear
[a,b]=imread('hardware.gif');
I=ind2gray(a,b);
[x y]=size(I);
I1=zeros(x,y);
I2=zeros(x,y);
k1=1;
k2=1;
I3=zeros(x,1);%压缩后每一行数据个数
all=0;%像素总个数
for i=1:1:x
    n=1;
    for j=1:1:y
        X=I(i,j);
        if j~=y%防止超出边界
            if X==I(i,j+1)%判断是否与下一个像素值灰度大小是否相等
                n=n+1;
            else
                I1(i,k1)=I(i,j);%该部分是在上面不相等时候将灰度值保存在I1,同时将个数保存在I2
                I2(i,k1)=n;
                k1=k1+1;
                n=1;
                I3(i,1)=I3(i,1)+1;
            end
        end
        if j==y%最后一个像素单独计算
                I1(i,k1)=I(i,j);
                I2(i,k1)=n;
                k1=k1+1;
                n=1;
                I3(i,1)=I3(i,1)+1;
        end
    end
    all=all+I3(i,1);%求总像素个数
    k1=1;
end
M=max(max(I2));%求取重复像素个数最大值,以便确定其最大需要个bit位大小

%图像恢复过程
I4=zeros(x,y);%定义恢复后图像矩阵
m=1;
for i=1:1:x
    for k=1:1:I3(i,1)
        for j=1:1:I2(i,k)
            I4(i,m)=I1(i,k);
            m=m+1;
        end
    end
    m=1;
end
I4=uint8(I4);
subplot(1,2,1)
imshow(I);
title('原始图像');
subplot(1,2,2)
imshow(I4);
title('无损压缩后恢复出来的图像');
            

        

以下为一个例子(由于实际图片太大,故实际跑程序时用的是横坐标像素个数为25图片)
基于RLE的matlab图像无损压缩实现_第1张图片
像素值:
基于RLE的matlab图像无损压缩实现_第2张图片
RLE处理后剩下灰度值:
基于RLE的matlab图像无损压缩实现_第3张图片
相同灰度像素的个数(I2):
基于RLE的matlab图像无损压缩实现_第4张图片
由M值可以知,只需要5bit即可表示I2,所以有压缩比:
压缩比=(182* 8+182* 5)/(18* 25* 8)*100%=65.72%

图像恢复结果:
基于RLE的matlab图像无损压缩实现_第5张图片

虽然RLE是针对二值图的,但是我感觉其实其他类型图也一样,只不过可能二值图效果更好些,因为没有那么多灰度等级。

你可能感兴趣的:(图像处理)