基于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处理后剩下灰度值:
在这里插入图片描述
相同灰度像素的个数(I2):
在这里插入图片描述
由M值可以知,只需要5bit即可表示I2,所以有压缩比:
压缩比=(182* 8+182* 5)/(18* 25* 8)*100%=65.72%

图像恢复结果:
在这里插入图片描述

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

  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 18
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值