实验截图:
-
原图与其DCT系数图:
-
改变系数进行不同的DCT变换的结果
实验代码:
img=imread('erciyuan.jpg');
img=rgb2gray(img);
img=im2double(img);
matrix=dctmtx(8);
dct = blkproc(img, [8 8], 'P1 * x * P2', matrix, matrix');
figure(1);subplot(1,2,1);imshow(img);title('原图');
subplot(1,2,2);imshow(log(abs(dct)),[]);title('DCT系数');
mask1=[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个
mask2=[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个
mask3=[1 1 1 1 1 1 1 1
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 0 0 0 0 0
1 1 0 0 0 0 0 0
1 0 0 0 0 0 0 0];%保留了左上角36个
mask4=[ 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1];%保留了全部
mask5=[ 0 0 1 1 1 1 1 1
0 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1];%保留了右下角64-3(61)个
mask6=[ 0 0 0 0 1 1 1 1
0 0 0 1 1 1 1 1
0 0 1 1 1 1 1 1
0 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1];%保留了右下右下角64-10(54)个
mask7=[ 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 0 1 1
0 0 0 0 0 1 1 1
0 0 0 0 1 1 1 1
0 0 0 1 1 1 1 1
0 0 1 1 1 1 1 1
0 1 1 1 1 1 1 1];%保留了右下右下角64-36(28)个
y1=blkproc(dct,[8 8],'P1.*x',mask1);
y2=blkproc(dct,[8 8],'P1.*x',mask2);
y3=blkproc(dct,[8 8],'P1.*x',mask3);
y4=blkproc(dct,[8 8],'P1.*x',mask4);
y5=blkproc(dct,[8 8],'P1.*x',mask5);
y6=blkproc(dct,[8 8],'P1.*x',mask6);
y7=blkproc(dct,[8 8],'P1.*x',mask7);
y11=blkproc(y1,[8 8],'P1*x*P2',matrix',matrix);
y22=blkproc(y2,[8 8],'P1*x*P2',matrix',matrix);
y33=blkproc(y3,[8 8],'P1*x*P2',matrix',matrix);
y44=blkproc(y4,[8 8],'P1*x*P2',matrix',matrix);
y55=blkproc(y5,[8 8],'P1*x*P2',matrix',matrix);
y66=blkproc(y6,[8 8],'P1*x*P2',matrix',matrix);
y77=blkproc(y7,[8 8],'P1*x*P2',matrix',matrix);
figure(2);subplot(2,4,1),imshow(img),title('原图');
figure(2);subplot(2,4,2),imshow(y11),title('还原保留左上角3');
figure(2);subplot(2,4,3),imshow(y22),title('还原保留左上角10');
figure(2);subplot(2,4,4),imshow(y33),title('还原保留左上角36');
figure(2);subplot(2,4,5),imshow(y44),title('还原保留全部');
figure(2);subplot(2,4,6),imshow(y55),title('还原保留右下角64-3(61)个');
figure(2);subplot(2,4,7),imshow(y66),title('还原保留右下64-10(54)个');
figure(2);subplot(2,4,8),imshow(y77),title('还原保留右下64-36(28)个');
结果分析:
- DCT变换,即离散余弦变换,是一种广泛应用的变换编码方法,它能够以数据无关的方式解除输入信号之间的相关性,因而应用广泛。我们在进行DCT变换时,可以将原图分割为一个个88的小块,然后再对这些小块分别进行DCT变换。同时可以调用函数dctmtx来得到变换的矩阵matrix,我们让matrixB*matrix’就能实现变换。接着对矩阵块进行量化。同时建立合适的量化矩阵,对矩阵的每个元素进行除以对应的量化值。我们对DCT系数分别进行遮罩,分别对左上角、右上角赋值为0,对小块的元素进行量化。
通过上面的图片可知,只保留左上角三个数据,就可以得到一个相对完整的图片,而如果保留除左上角三个数据外的其他所有数据,也只得到了一些图像的边缘细节信息。