离散余弦变换
DCT的定义
离散余弦变换(DCT)将图像表示为不同大小和频率的正弦信号的和。的dct2
函数计算图像的二维离散余弦变换(DCT)。DCT的特性是,对于典型的图像,图像的大部分视觉上的重要信息集中在DCT的几个系数中。因此,DCT常用于图像压缩应用中。例如,DCT是国际标准有损图像压缩算法JPEG的核心。(这个名字来自制定该标准的工作组:联合摄影专家组。)
m × n矩阵的二维DCT一个
定义如下。
的值B魁人党被称为“DCT系数的一个
.(注意矩阵索引在MATLAB®总是从1开始,而不是0;因此,MATLAB矩阵元素(1)
而且B (1,1)
对应数学量一个00而且B00分别)。
DCT是一个可逆变换,它的逆变换由
DCT逆方程可以解释为任何m × n矩阵一个
可以写成的和吗锰表单的功能
这些函数称为基函数DCT。DCT系数B魁人党,则可视为权重应用于每个基函数。对于8 × 8矩阵,64基函数由该图表示。
8 × 8矩阵的64基函数
水平频率从左到右增加,垂直频率从上到下增加。左上角的常值基函数通常被称为直流基函数,对应的DCT系数B00通常被称为直流系数.
DCT变换矩阵
使用图像处理工具箱™软件有两种计算DCT的方法。第一种方法是使用dct2
函数。dct2
使用基于fft的算法进行大输入的快速计算。第二种方法是使用DCT变换矩阵,由函数返回dctmtx
对于较小的正方形输入,如8 × 8或16 × 16,可能更有效。m × m变换矩阵T
是由
对于m × m矩阵一个
,T *
是一个m × m矩阵,其列包含的列的一维DCT一个
.的二维DCT一个
可以计算为B = T * * T '
.自T
是一个实标准正交矩阵,它的逆和它的转置是一样的。因此,反二维DCTB
是由T ' * B * T
.
基于离散余弦变换的图像压缩
这个例子展示了如何使用离散余弦变换(DCT)压缩图像。该示例计算输入图像中8 × 8块的二维DCT,丢弃(设置为零)每个块中的64个DCT系数中的10个,然后使用每个块的二维逆DCT重建图像。算例采用变换矩阵计算方法。
JPEG图像压缩算法中采用了DCT算法。将输入图像分成8 × 8或16 × 16的块,并对每个块计算二维DCT。然后对DCT系数进行量化、编码和传输。JPEG接收器(或JPEG文件读取器)解码量化的DCT系数,计算每个块的二维DCT逆,然后将这些块重新组合成单个图像。对于典型的图像,许多DCT系数的值接近于零。这些系数可以被丢弃,而不会严重影响重建图像的质量。
将图像读入工作区并将其转换为类双
.
我= imread (“cameraman.tif”);I = im2double(我);
计算图像中8 × 8块的二维DCT。这个函数dctmtx
返回n × n DCT变换矩阵。
T = dctmtx (8);dct = @(block_struct) T * block_struct。数据* T ';B = blockproc(I,[8 8],dct);
在每个块中除去64个DCT系数中的10个。
掩码= [1 1 1 1 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 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;B2 = blockproc(B,[8 8],@(block_struct)掩码。* block_struct.data);
利用每个块的二维逆DCT重构图像。
invdct = @(block_struct) T' * block_struct. invdct = @(block_struct)数据* T;I2 = blockproc(B2,[8 8],invdct);
显示原始图像和重建图像,并排。尽管重建图像的质量有所下降,但仍然可以清晰地识别,尽管将近85%的DCT系数被丢弃了。
imshow(我)
图imshow (I2)