主要内容

离散余弦变换

DCT的定义

离散余弦变换(DCT)将图像表示为不同幅度和频率的正弦信号的和。的dct2函数计算图像的二维离散余弦变换(DCT)。DCT的特点是,对于一个典型的图像,关于图像的大部分视觉上重要的信息都集中在DCT的几个系数中。由于这个原因,DCT经常用于图像压缩应用程序。例如,DCT是国际标准有损图像压缩算法JPEG的核心。(这个名字来自制定该标准的工作组:联合摄影专家组。)

m × n矩阵的二维DCT一个定义如下。

B p α p α 0 1 n 0 N 1 一个 n 因为 π 2 + 1 p 2 因为 π 2 n + 1 2 N 0 p 1 0 N 1 α p 1 / 2 / p 0 1 p 1 α 1 / N 2 / N 0 1 N 1

的值B魁人党被称为“DCT系数一个.(注意MATLAB中的矩阵指标®总是从1而不是0开始;因此,MATLAB的矩阵元素(1)B (1,1)对应于数学上的数量一个00B00分别)。

DCT是一个可逆变换,它的逆是

一个 n p 0 1 0 N 1 α p α B p 因为 π 2 + 1 p 2 因为 π 2 n + 1 2 N 0 1 0 n N 1 α p 1 / 2 / p 0 1 p 1 α 1 / N 2 / N 0 1 N 1

逆DCT方程可以解释为任意m × n矩阵一个可以写成的和表单的功能

α p α 因为 π 2 + 1 p 2 因为 π 2 n + 1 2 N 0 p 1 0 N 1

这些函数称为基函数DCT。DCT系数B魁人党,则可视为权重应用于每个基函数。对于8 × 8矩阵,64个基函数由这幅图表示。

8 × 8矩阵的64个基函数

水平频率从左到右增加,垂直频率从上到下增加。左上方的常值基函数通常称为直流基函数,以及相应的DCT系数B00经常被称为直流系数

DCT变换矩阵

使用Image Processing Toolbox™软件有两种方法来计算DCT。第一种方法是使用dct2函数。dct2使用基于fft的算法,在大量输入的情况下实现快速计算。第二种方法是使用DCT变换矩阵,由函数返回dctmtx对于小的方形输入,比如8 × 8或16 × 16,可能更有效。m × m变换矩阵T是由

T p 1 2 因为 π 2 + 1 p 2 p 0 1 p 1 0 1 0 1

对于m × m矩阵一个T *是一个m × m矩阵,它的列包含的列的一维DCT一个.二维DCT一个可以计算为B = T * * T '.自T是一个实标准正交矩阵,它的逆等于它的转置。因此,二维DCT的逆B是由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. dct =数据* T ';B = blockproc(I,[8 8],dct);

丢弃每个区块中64个DCT系数中的10个。

掩码= [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];B2 = blockproc(B,[8 8],@(block_struct) mask .* block_struct.data);

使用每个块的二维逆DCT重建图像。

invdct = @(block_struct) T'数据* T;I2 = blockproc(B2,[8 8],invdct);

并排显示原始图像和重建图像。尽管在重建图像中有一些质量损失,但它是清晰可识别的,即使几乎85%的DCT系数被丢弃。

imshow(我)

图中包含一个轴对象。axis对象包含一个image类型的对象。

图imshow (I2)

图中包含一个轴对象。axis对象包含一个image类型的对象。