作业一: 无损编码/压缩算法实验
问题1: 选择灰度图像,按照行的方式展开像得到一维的向量。按照一维预测的公式:
,自行设计预测算法实现一维无损预测压缩。将预测压缩后的一维向量(由预测误差组成),进行一维行程/游程编码。计算原图、最终行程/游程编码压缩后数据所需要的存储空间,计算压缩率。
I=imread('D:\testpho\testpho.jpeg');
[m1, n1]=size(I);
I=rgb2gray(I);
x=double(I);
y=LPCencode(x); %得到一维无损预测压缩并一维行程编码后的矩阵(一维)
[m2, n2]=size(y);
%xx=LPCdecode(y);
fprintf('%d',(m2*n2)/(m1*n1));
%编码器
%LPCencode函数用一维无损预测编码压缩图像x,a为预测系数,如果a默认,则默认a=1,就是前值预测。
function y=LPCencode(x, a)
error(nargchk(1, 2, nargin));
if nargin<2
a=1;
end
x=double(x);
[m, n]=size(x);
p=zeros(m, n); %存放预测值
xs=x;
zc=zeros(m, 1);
for i=1:length(a)
xs=[zc xs(:, 1:end-1)];
p=p+a(i)*xs;
end
sig = p(:); % 转化为一维数据
enco = runlengthenco(sig); % 编码
y=enco;
%y=x-round(p);
% 编码
function enco = runlengthenco(sig)
enco = zeros(1);
k = 1;
enco(k) = sig(1);
enco(k+1) = 1;
i = 2;
while (i<=length(sig))
if (sig(i)==enco(k))
enco(k+1) = enco(k+1)+1;
else
k = k+2;
enco(k) = sig(i);
enco(k+1) = 1;
end
i = i+1;
end
enco = enco';
end
实验结果
作业二: 有损压缩算法实验
查阅JPEG编码的有关资料,对图像进行JPEG压缩,算法步骤必须包括如下几个部分:图像分块,离散余弦变换,量化,ac和dc系数的Z字形编排。
问题1: 质量因子分别选为20,60,80,显示原图与不同质量因子下解码后的图像;
问题2: 计算图像压缩前后的压缩比,计算原图与解压图之间的均方根误差。
clear;
close all;
factor = 20
I=imread('1.jpg');
subplot(121);imshow(I);title('原图');
imwrite(I,'lena1.jpg','quality', factor);
x1=imread('lena1.jpg');
k1=imfinfo('lena1.jpg')
s1=k1.FileSize/1024;
e1=I(:)-x1(:);
[m1,n1]=size(e1);
erms1=sqrt(sum(e1(:)).^2/(m1*n1));%求均方根误差
i_size1=k1.Width*k1.Height*k1.BitDepth/8;
i_compress1=k1.FileSize;
ratio1=i_size1/i_compress1;
subplot(122);imshow(I);title('压缩后');
fprintf('质量因子:%d\n',factor);
fprintf('均方根误差:%f\n',erms1);
fprintf('压缩比:%f\n',ratio1);
fprintf('压缩后图像大小:%f\n',i_compress1);