✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知。
更多Matlab仿真内容点击👇
⛄ 内容介绍
随着海量数据进入我们的生活,数据压缩成为计算机科学领域中十分活跃的论题,游程编码与哈夫曼编码是两种典型的无损压缩编码的方法.本文介绍基于游程编码实现图像压缩算法附matlab代码
⛄ 代码
clc;
clear all;
I = imread('F:\数字图像处理作业\实验四\lena.tif');%读入图像
figure,subplot(121),imshow(I),title('原图像');
%二值化阈值0.3
BW = imbinarize(I,0.2);%二值化
[zipped,info]=RLEencode(BW);%进行游程编码
unzipped = RLEdencode(zipped,info);%进行游程解码
subplot(122),imshow(uint8(unzipped)*255),title('经游程编解码后的图像');
cr1 = info.ratio;%压缩比
%游程编码函数
function [zipped,info]=RLEencode(vector)
[m,n]=size(vector);
vector=uint8(vector(:));
L=length(vector);
c=vector(1);
% e(1,1)=c;
%原始代码,这样会使 e 矩阵变成unit8(0-255),但e(:,2)中有大于255的数据,所以
%必须是double类型
e(1,1)=double(c);%必须是double类型,否则会使 e 矩阵变成uint类型,从而导致错误
e(1,2)=0;
t1=1;
for j=1:L
if (vector(j)==c)
e(t1,2) = e(t1,2)+1;%double类型
else
c=vector(j);
t1=t1+1;
e(t1,1)=double(c);%uint类型转换成double类型
e(t1,2)=1;
end
end
zipped=e;
info.rows=m;
info.cols=n;
[m,n]=size(e);
info.ratio=(info.rows*info.cols)/m*n;
end
%游程编码的解码函数
function unzipped=RLEdencode(zip,info)
% zip=uint8(zip);
%本处错误,不能将zip中的数据(double类型)转变成uint8(0-255)
%因为zip中的数据(double类型)有超过255的数据
[m,n]=size(zip);
unzipped=[];
for i=1:m
section=repmat(zip(i,1),1,zip(i,2));
unzipped=[unzipped section];
end
unzipped=reshape(unzipped,info.rows,info.cols);
end
⛄ 运行结果
⛄ 参考文献
[1] WEI Jia-yuan, 魏佳圆, WEN Yuan-yuan,等. 二值图像游程-Huffman编码方法研究及Matlab实现[C]// 中国电子学会空间电子学分会;中国宇航学会空间电子学专业委员会;中国工程院信息与电子工程学部. 中国电子学会空间电子学分会;中国宇航学会空间电子学专业委员会;中国工程院信息与电子工程学部, 2014.
[2] 赵婷婷. 基于游程编码的图像处理系统设计[J]. 经营管理者, 2010(11X):1.
[3] 李金泉, 臧淼, 李亮,等. 基于MATLAB的JPEG图像压缩编解码的设计与实现[J]. 中国信息化, 2012.