(附Matlab程序)(二)基于DCT编码的图像压缩:对分解后的每个数据小方块进行DCT及IDCT变换

问题一:随机选取一幅图像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*8DCT变换矩阵
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('压缩后的恢复图')

编程结果图如下。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Echoshit8/article/details/112587044