![](https://csdnimg.cn/release/download_crawler_static/86643891/bg1.jpg)
function [IMCom, NumPrin] = ImCompressPrin(filename,q)
%读入一副图片,并求图像数据的大小
I = imread(filename);
[nrow,ncol,npage] = size(I);
%确定图像分块的个数
nrow = floor(nrow/16);
ncol = floor(ncol/16);
%确定最多可用的主成分的个数m
n = nrow * ncol;
p = npage*256;
m = floor(n*p/(n+p));
%根据q的取值,确定所用的主成分的个数qid
if q > 0 && q < 1
qid = ceil(m*q);
elseif q >= 1 && q <= m && round(q) ==q
qid = q;
else
error(['q的取值应为(0,1)内的数或不超过', num2str(m),'的正整数'])
end
flag = npage == 3; %真彩图像标签,若为真彩图像flag = 1
%若I的行数和列数不是16的整数倍,将I的大小进行调整
I = imresize(I,[16*nrow,16*ncol]);
%将I转化为取值介于0和1之间的双精度数组
I = double(I)/255;
%显示原始图像
figure(1)
subplot(1,2,1)
imshow(I,[])
xlabel(‘原始图像’);
% 把原始图像分成nrow*ncol个16*16的小块, I_block为nrow*ncol的元数据组
if flag
I_block = mat2cell(I,16*ones(1,nrow),16*ones(1,ncol),npage);
else
I_block = mat2cell(I,16*ones(1,nrow),16*ones(1,ncol));
end
%把I_block转为16*16*npage*(nrow*ncol)的数组
x = cat(4,I_block{:});
% 把 x转为(nrow*ncol)行,(16*16*npage)列的矩阵
x = reshape(x,[16*16*npage,nrow*ncol])';
% 调用pcares的函数重建矩阵x的数据xpr
[resid,xpr] = pcares(x,qid);
% 把矩阵xpr转为(nrow*ncol)*1的元数据组
xpr = mat2cell(xpr,ones(1,nrow*ncol));