- 实验原理
DCT是目前比较好的图像变换,它有很多优点。DCT是正交变换,它可以将8x8图像空间表达式转换为频率域,只需要用少量的数据点表示图像;DCT产生的系数很容易被量化,因此能获得好的块压缩;DCT算法的性能很好,它有快速算法,如采用快速傅立叶变换可以进行高效的运算,因此它在硬件和软件中都容易实现;而且DCT算法是对称的,所以利用逆DCT算法可以用来解压缩图像。
由于DCT主要应用在数据和图像的压缩,因此希望原信号的能量在变换后能尽量集中在少数系数上,且这些大能量的系数能处在相对集中的位置,这将有利于进一步的量化和编码。但是如果对整段的数据或整幅图像来做DCT,那就很难保证大能量的系数能处在相对集中的位置。因此,在实际应用中,一般都是将数据分成一段一段来做,一般分成8x8或16x16的方块来做。
- 实验要求
利用DCT变换对灰度图像进行压缩,求出压缩比;对比不同压缩比的图像。
- 实验结果
根绝DCT编码原理编写matlab程序如下所示:
% 设置压缩比cr=0.5为2:1压缩;cr=0.25为4:1;cr=0.1250为8:1压缩
cr = 0.125;
initialimage = imread('lena.bmp');
initialimage = double(initialimage)/255;
figure();
subplot(121);
%imshow(initialimage);
%对图像进行DCT变换
t = dctmtx(8);
dctcoe = blkproc(initialimage, [8 8], 'P1*x*P2', t, t');
%将DCT变换后的矩阵转换成列,并按升序排列
coevar = im2col(dctcoe, [8 8], 'distinct');
coe = coevar;
[y, ind] = sort(coevar);
[m, n] = size(coevar);
%舍去不重要的系数
snum = 64-64 * cr;
for i = 1:n
coe(ind(1:snum), i) = 0;
end
%把列变换为二维矩阵
b2 = col2im(coe, [8 8], [512 512], 'distinct');
%逆DCT变换
i2 = blkproc(b2, [8 8], 'P1*x*P2', t', t);
%subplot(122);
imshow(i2);
e = double(initialimage)-double(i2);
[m, n] = size(e);
erms = sqrt(sum(e(:).^2)/(m*n))
图1为原始图,图2为2:1压缩图,图3为4:1压缩图,图4为4:1压缩图:
- 实验总结
DCT为正交变换,将图像从空间域转换到频率来实现图像的压缩,而且DCT产生的系数很容易被量化,因此能获得好的块压缩,而且DCT的算法性能优良,同时从本实验的实验结果中可以看到,压缩比越小,DCT反变换后的图像效果越差。但可以利用人眼对某些图像成分不敏感的特点,来完成既不影响人对画面清晰度的感知,又能达到压缩图像,减少编码量的目的。