close all; clear all; clc;
I=imread('lena.bmp');
I=im2double(I); %转换图像矩阵为双精度型。
T=dctmtx(8);%产生二维DCT变换矩阵
figure;
imshow(I);
title('原始图像');
for m=1:4
A=quanmatrix(m);%调用函数生成量化矩阵
for i=1:8:512
for j=1:8:512
P=I(i:i+7,j:j+7);%分块 8*8
K=T*P*T';%每一小块DCT变换
I2(i:i+7,j:j+7)=K;%DCT变换后的参数矩阵
K=K./A;
K(abs(K)<0.03)=0;%只是去除小的系数,实现压缩功能
I3(i:i+7,j:j+7)=K;
end
end
for i=1:8:512
for j=1:8:512
P=I3(i:i+7,j:j+7).*A;%反量化
K=T'*P*T;%DCT反变换
I4(i:i+7,j:j+7)=K;
end
end
figure;
imshow(I4);
title(['复原图像',num2str(m),' quotiety=',num2str(m)]);
%imwrite(I4,'复原图像',,'.jpg');
end
%imwrite(I44,'复原图像66.jpg');
% B=blkproc(I,[8,8],'P1*x*P2',T,T') ;
% mask=[1 1 1 1 0 0 0 0
% 1 1 1 0 0 0 0 0
% 1 1 0 0 0 0 0 0
% 1 0 0 0 0 0 0 0
% 0 0 0 0 0 0 0 0
% 0 0 0 0 0 0 0 0
% 0 0 0 0 0 0 0 0
% 0 0 0 0 0 0 0 0 ];
% B2=blkproc(B,[8 8],'P1.*x',mask); %二值掩模,用来压缩DCT系数,只留下DCT系数中左上角的10个
%
% I2=blkproc(B2,[8 8],'P1*x*P2',T',T); %重构图像,DCT反变换
% figure;
% imshow(I);
% title('原始图像');
% figure;
% imshow(I2);
% title('压缩图像');
% figure;
% imshow(dct2(I));
% figure;
% plot(dct2(I));
% %colorbar('horiz');