离散余弦变换经常被信号处理和图像处理使用,用于对信号和图像(包括静止图像和运动图像)进行有损数据压缩。这是由于离散余弦变换具有很强的"能量集中"特性:大多数的自然信号(包括声音和图像)的能量都集中在离散余弦变换后的低频部分,而且当信号具有接近马尔科夫过程(Markov processes)的统计特性时,离散余弦变换的去相关性接近于K-L变换(Karhunen-Loève 变换--它具有最优的去相关性)的性能。例如,在静止图像编码标准JPEG中,在运动图像编码标准MJPEG和MPEG的各个标准中都使用了离散余弦变换。在这些标准制中都使用了二维的第二种类型离散余弦变换,并将结果进行量化之后进行熵编码。这时对应第二种类型离散余弦变换中的n通常是8,并用该公式对每个8x8块的每行进行变换,然后每列进行变换。得到的是一个8x8的变换系数矩阵。其中(0,0)位置的元素就是直流分量,矩阵中的其他元素根据其位置表示不同频率的交流分量。

% 设置压缩比,cr=0.5为2:1压缩;cr=0.1250为8:1压缩
cr = 0.022;
initialimage = imread('lena.bmp');
initialimage = rgb2gray(initialimage);
initialimage = double(initialimage)/255;
figure();
subplot(121);
imshow(initialimage);title('ORI');

%对图像进行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);title('DCT');

在压缩比为10,20,40情况下实验结果对比,目前只是实现的对于灰度图像的DCT变换压缩编码,彩色图像还没实现,有实现的小伙伴可以分享一下。

1.cr=10

图像压缩之DCT变换_静止图像

2.cr=20

图像压缩之DCT变换_图像处理_02

3.cr=40

图像压缩之DCT变换_静止图像_03