问题一:随机选取一幅图像x.jpg,先将图像分解为8x8个数据块,然后分别对分解后的每个数据小方块进行DCT及IDCT变换,分别保留左上角3、10、15、32个系数进行处理,并对结果进行对比分析。
clear
close all
clc%清理Matlab窗口
A=imread('D:\x.jpg');%读取图像x.jpg(引号内是图像在计算机内的存储路径)
I=rgb2gray(A);%RGB图像转灰度图像
I=im2double(I);
T=dctmtx(8);%得到一个8*8的离散余弦变化矩阵
B=blkproc(I,[8 8],'P1*x*P2',T,T');
%x是每一个分成的8*8大小的块
%P1*x*P2相当于像素块的处理函数
%p1=T,p2=T’,fun=p1*x*p2'=T*x*T'是进行离散余弦变换
%%
m=[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
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0];%保留左上角3个系数
B2=blkproc(B,[8 8],'P1.*x',m);%舍弃每个块中的高频系数,达到图像压缩的目的
I2=blkproc(B2,[8 8],'P1*x*P2',T',T);%进行反余弦变换,得到压缩后的图象
miss=abs(I-I2);
figure(1);
imshow(I),title('原始图像','Fontsize',18);
figure(2);
subplot(2,2,1);
imshow(I2),title('压缩(解压缩)图像(3个系数)','Fontsize',18);
%%
m3=[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];%保留左上角10个系数
B3=blkproc(B,[8 8],'P1.*x',m3);%舍弃每个块中的高频系数,达到图像压缩的目的
I3=blkproc(B3,[8 8],'P1*x*P2',T',T);%进行反余弦变换,得到压缩后的图象
miss3=abs(I-I3);
subplot(2,2,2);
imshow(I3),title('压缩(解压缩)图像(10个系数)','Fontsize',18);
%%
m4=[1 1 1 1 1 0 0 0
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];%保留左上角15个系数
B4=blkproc(B,[8 8],'P1.*x',m4);%舍弃每个块中的高频系数,达到图像压缩的目的
I4=blkproc(B4,[8 8],'P1*x*P2',T',T);%进行反余弦变换,得到压缩后的图象
miss4=abs(I-I4);
subplot(2,2,3);
imshow(I4),title('压缩(解压缩)图像(15个系数)','Fontsize',18);
%%
m5=[1 1 1 1 1 1 1 0
1 1 1 1 1 1 0 0
1 1 1 1 1 0 0 0
1 1 1 1 0 0 0 0
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];%保留左上角32个系数
B5=blkproc(B,[8 8],'P1.*x',m5);%舍弃每个块中的高频系数,达到图像压缩的目的
I5=blkproc(B5,[8 8],'P1*x*P2',T',T);%进行反余弦变换,得到压缩后的图象
miss5=abs(I-I5);
subplot(2,2,4);
imshow(I5),title('压缩(解压缩)图像(32个系数)','Fontsize',18);
编程结果如下,根据编程结果对比,可以明显看出,分别保留左上角32、15、10、3个系数进行处理时,图像恢复效果依次变差。
其中,保留左上角3个系数时恢复图像中,出现了明显的图像模糊现象和“块效应”现象。
问题二:随机选取一幅图像x.jpg,先将图像分解为16x16个数据块,然后分别对分解后的每个数据小方块进行DCT及IDCT变换,分别保留左上角3、10个系数进行处理,并对结果与将图像分解为16*16个数据块时的结果进行对比分析。
clear
close all
clc%清理Matlab窗口
A=imread('D:\x.jpg');%读取图像x.jpg(引号内是图像在计算机内的存储路径)
I=rgb2gray(A);%RGB图像转灰度图像
I=im2double(I);
T=dctmtx(16);%得到一个16*16的离散余弦变化矩阵
B=blkproc(I,[16 16],'P1*x*P2',T,T');
%x是每一个分成的16*16大小的块
%P1*x*P2相当于像素块的处理函数
%p1=T,p2=T’,fun=p1*x*p2'=T*x*T',是进行离散余弦变换
%%
m=[1 1 0 0 0 0 0 0 0 0 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 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 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 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 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 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 0 0 0 0 0];
B2=blkproc(B,[16 16],'P1.*x',m);%舍弃每个块中的高频系数,达到图像压缩的目的
I2=blkproc(B2,[16 16],'P1*x*P2',T',T);%进行反余弦变换,得到压缩后的图象
figure(1);
imshow(I),title('原始图像','Fontsize',18);
figure(2);
subplot(2,2,1);
imshow(I2),title('16*16解压缩图像(3个系数)','Fontsize',18);
%%
m3=[1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0 0 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 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 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 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 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 0 0 0 0 0 0 0 0 0 0 0 0];%保留左上角10个系数
B3=blkproc(B,[16 16],'P1.*x',m3);%舍弃每个块中的高频系数,达到图像压缩的目的
I3=blkproc(B3,[16 16],'P1*x*P2',T',T);%进行反余弦变换,得到压缩后的图象
subplot(2,2,2);
imshow(I3),title('16*16解压缩图像(10个系数)','Fontsize',18);
%%
TT=dctmtx(8);%得到一个8*8的离散余弦变化矩阵
BB=blkproc(I,[8 8],'P1*x*P2',TT,TT');
m4=[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
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0];%保留左上角3个系数
BB2=blkproc(BB,[8 8],'P1.*x',m4);%舍弃每个块中的高频系数,达到图像压缩的目的
II2=blkproc(BB2,[8 8],'P1*x*P2',TT',TT);%进行反余弦变换,得到压缩后的图象
figure(2);
subplot(2,2,3);
imshow(II2),title('8*8解压缩图像(3个系数)','Fontsize',18);
%%
m5=[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];%保留左上角10个系数
BB3=blkproc(BB,[8 8],'P1.*x',m5);%舍弃每个块中的高频系数,达到图像压缩的目的
II3=blkproc(BB3,[8 8],'P1*x*P2',TT',TT);%进行反余弦变换,得到压缩后的图象
subplot(2,2,4);
imshow(II3),title('8*8解压缩图像(10个系数)','Fontsize',18);
编程结果如下,根据编程结果对比,可以明显看出,将图像分解为8x8个数据块后恢复图像的效果优于将图像分解为16x16个数据块恢复图像的效果。
问题三:对彩色图像进行分块压缩处理。
close all
clc%清理Matlab窗口
RGB=imread('D:\x.jpg');%读取图像x.jpg(引号内是图像在计算机内的存储路径)
gary=rgb2gray(RGB);%RGB图像转灰度图像
%亮度量化表
m=[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];
%RGB图分层处理得到3个分量图
R = RGB(:,:,1);
G = RGB(:,:,2);
B = RGB(:,:,3);
%转换为双精度
IR =im2double(R);
IG =im2double(G);
IB =im2double(B);
%建立8*8的DCT变换矩阵
T=dctmtx(8);
%进行DCT变换
RR = blkproc(IR,[8,8],'P1*x*P2',T,T');
GG = blkproc(IG,[8,8],'P1*x*P2',T,T');
BB = blkproc(IB,[8,8],'P1*x*P2',T,T');
RR2=blkproc(RR,[8 8],'P1.*x',m);%舍弃每个块中的高频系数,达到图像压缩的目的
RRR=blkproc(RR2,[8 8],'P1*x*P2',T',T);%进行反余弦变换,得到压缩后的图象
GG2=blkproc(GG,[8 8],'P1.*x',m);%舍弃每个块中的高频系数,达到图像压缩的目的
GGG=blkproc(GG2,[8 8],'P1*x*P2',T',T);%进行反余弦变换,得到压缩后的图象
BB2=blkproc(BB,[8 8],'P1.*x',m);%舍弃每个块中的高频系数,达到图像压缩的目的
BBB=blkproc(BB2,[8 8],'P1*x*P2',T',T);%进行反余弦变换,得到压缩后的图象
D2=cat(3,RRR,GGG,BBB);
subplot(2,2,1);imshow(RRR);title('压缩后R分量图像')
subplot(2,2,2);imshow(GGG);title('压缩后G分量图像')
subplot(2,2,3);imshow(BBB);title('压缩后B分量图像')
subplot(2,2,4);imshow(D2);title('压缩后的恢复图')