要求:
无损编码/压缩算法:
- 问题1: 实现行程编码压缩, 肉眼观察压缩效果,并计算原图和压缩以后的尺寸,计算压缩率并比较分析;
- 问题2: 实现哈夫曼压缩, 肉眼观察压缩效果,并计算原图和压缩以后的尺寸,计算压缩率并比较分析;
- 问题3: 实现一维无损预测压缩, 肉眼观察压缩效果,并计算原图和压缩以后的尺寸,计算压缩率并比较分析.
1、问题及说明
(1)实现行程编码压缩, 肉眼观察压缩效果,并计算原图和压缩以后的尺寸,计算压缩率并比较分析。
基本思路是把数据看成一个线性序列,而这些数据序列组织方式分成两种情况:一种是连续的重复数据块,另一种是连续的不重复数据块。对于连续的重复数据块采用的压缩策略是用一个字节表示数据块重复的次数,然后在这个数据字节后面存储对应的数据字节本身;对于连续不重复的数据序列,表示方法和连续的重复数据块序列的表示方法一样,只不过前面的数据重数属性字节的内容为1。
(2)实现哈夫曼压缩, 肉眼观察压缩效果,并计算原图和压缩以后的尺寸,计算压缩率并比较分析
基本思路是给定有权重的一系列数据(带权重),从中挑选最小权重的两个数据,组成一棵树,得到的父节点再插入到数据系列当中。
(3)实现一维无损预测压缩, 肉眼观察压缩效果,并计算原图和压缩以后的尺寸,计算压缩率并比较分析。
基本思想是通过对每个像素中新增信息进行提取和编码,以此来消除像素间的冗余,这里新增信息是指像素当前实际值和预测值的差。也就是说,如果已知图像一个像素离散幅度的真实值,利用其相邻像素的相关性,预测它的可能数值,再求两者的差。利用这种具有预测性质的差值,再量化、编码传输,其效果更佳,这种方法称为DPCM法。
2、效果展示
(1)行程编码压缩
(2)哈夫曼压缩
(3)一维无损预测压缩
3、实验结果分析
1)RLE压缩方案是一种极其成熟的压缩方案,特点是无损失压缩,既节省了磁盘空间又不损失任何图像数据。RLE有一个缺点,如果内容像ABCABCABC的话使用这种算法文件会增大,就是1A1B1C1A1B1C1A1B1C了,更长,就达不到压缩的效果了。
上面两张图片,由于其内容序列的优劣,它们的压缩比就不同。
2)因为要用额外的位保存和传输Huffman树而消耗掉一些存储位,所以为了编解码的方便,本已经减少的数据量又增加了一些。
如果文件比较大的话,这一点的数据根本不算什么,所占比例很小。但是,如果压缩的文件本来就很小的话,那么这就不少了。一般来说,经典的Huffman算法的压缩比不是很高,这是无损压缩的“通病”。
4.完整代码
(1)RLE
clear
I1=imread('lena.tiff');
%转换为二值图像
J=rgb2gray(I1);
I2=J(:);
I2length=length(I2);
figure,imshow(J);
for i=1:1:I2length
if I2(i)>=127
I2(i)=255;
else I2(i)=0;
end
end
I3=reshape(I2,512,512); %重建二维数组图像
figure,imshow(I3);
%对原图像进行行程编码
X=I3(:); %令X为新建的二值图像的一维数据组
x=1:1:length(X); %显示行程编码之前的图像数据
figure,plot(x,X(x));
j=1;
I4(1)=1;
%行程编码程序段
for z=1:1:(length(X)-1)
if X(z)==X(z+1)
I4(j)=I4(j)+1;
else data(j)=X(z); %data(j)代表相应的像素数据
j=j+1;
I4(j)=1;
end
end
data(j)=X(length(X)); %最后一个像素数据赋值给data
I4length=length(I4); %计算行程编码后的所占字节数
y=1:1:I4length; %显示编码后数据信息
figure,plot(y,I4(y));
CR=I4length/I2length; %比较压缩前后的大小
disp(['原图 Bit: ',num2str(I2length),' bit']);
disp(['压缩图像 Bit: ',num2str(I4length),' bit']);
disp(['压缩率: ',num2str(CR)]);
(2)哈夫曼压缩
clear;
clear all;
A=imread('baboon.tiff');
I=rgb2gray(A);
[M,N] = size(I);
I1 = I(:);
P = zeros(1,256);
%获取各符号的概率;
for i = 0:255
P(i+1) = length(find(I1 == i))/(M*N);
end
k = 0:255;
dict = huffmandict(k,P); %生成字典
enco = huffmanenco(I1,dict); %编码
deco = huffmandeco(enco,dict); %解码
Ide = col2im(deco,[M,N],[M,N],'distinct'); %把向量重新转换成图像块;
decolength=length(deco);
encolength=length(enco);
subplot(1,2,1);imshow(I);title('原图');
subplot(1,2,2);imshow(uint8(Ide));title('压缩');
OB=encolength;
sumcode=decolength;
CR=sumcode/OB;
disp(['原图 Bit: ',num2str(OB),' bit']);
disp(['压缩图像 Bit: ',num2str(sumcode),' bit']);
disp(['压缩率: ',num2str(CR)]);
(3)一维无损预测压缩
I=imread('baboon.tiff');
I=rgb2gray(I);
x=double(I);
y=LPCencode(x);
xx=LPCdecode(y);
figure(1);
subplot(121);
imshow(I);
subplot(122);
imshow(mat2gray(y));
e=double(x)-double(xx);
[m, n]=size(e);
erms=sqrt(sum(e(:).^2)/(m*n))
figure(2);
subplot(121);
[h, f]=hist(x(:));
bar(f, h, 'k');
subplot(122);
[h, f]=hist(y(:));
bar(f, h,'k');