clc;
cr=0.5;
I=imread('cameraman.tif');
I1=double(I)/255;%图像为256级灰度图像,对图像进行归一化操作
figure(1)
subplot(1,2,1);
imshow(I1);
title('原始图像');%显示原始图像
disp('原始图像的大小为:');
whos('I1')
[a,b]=size(I1);
snum=64;
%对图像进行哈达玛变换
T=hadamard(8);%产生8*8的哈达玛矩阵
htcoe=blkproc(I1,[8 8],'P1*x*P2',T,T');%将图像分割为8*8的子图像进行哈达玛变换
coevar=im2col(htcoe,[8 8],'distinct');%将变换系数矩阵重新排列
[y,ind]=sort(htcoe);
[m,n]=size(coevar);%根据压缩比确定要变0的系数个数
snum=snum-snum*cr;
for i=1:n
coevar(ind(1:snum),1)=0;
end %重建图像
re_htcoe=col2im(coevar,[8 8],[a b],'distinct');%将矩阵的列重新组织到块中
re_I=blkproc(re_htcoe,[8 8],'P1*x*P2',T',T);
%进行反哈达玛变换,得到压缩后图像
re_I=double(re_I)/64;
figure(1)
subplot(1,2,2);
imshow(re_I);
title('压缩后图像');%显示原始图像
error=1.^2-re_I.^2;
mse=sum(error(:))/numel(size(re_I));%计算原始图像和压缩后的图像的误差