主要内容

离散余弦变换

DCT定义

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

M×N矩阵的二维DCTA.定义如下。

B P Q = α P α Q M = 0 M 1. N = 0 N 1. A. M N 因为 π ( 2. M + 1. ) P 2. M 因为 π ( 2. N + 1. ) Q 2. N , 0 P M 1. 0 Q N 1. α P = { 1. / M , 2. / M , P = 0 1. P M 1. α Q = { 1. / N , 2. / N , Q = 0 1. Q N 1.

价值观Bpq被称为“离散余弦变换系数A.(注意,MATLAB中的矩阵索引®始终从1开始,而不是从0开始;因此,MATLAB矩阵元素A(1,1)B(1,1)对应于数学上的数量A.00B00分别为。)

DCT是一种可逆变换,其逆式如下所示:

A. M N = P = 0 M 1. Q = 0 N 1. α P α Q B P Q 因为 π ( 2. M + 1. ) P 2. M 因为 π ( 2. N + 1. ) Q 2. N , 0 M M 1. 0 N N 1. α P = { 1. / M , 2. / M , P = 0 1. P M 1. α Q = { 1. / N , 2. / N , Q = 0 1. Q N 1.

逆DCT方程可以解释为任意M×N矩阵A.可以写成的和表格的功能

α P α Q 因为 π ( 2. M + 1. ) P 2. M 因为 π ( 2. N + 1. ) Q 2. N , 0 P M 1. 0 Q N 1.

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

8×8矩阵的64个基函数

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

DCT变换矩阵

使用图像处理工具箱计算DCT有两种方法™ 软件第一种方法是使用dct2作用dct2使用基于fft的算法,在大量输入的情况下实现快速计算。第二种方法是使用DCT变换矩阵,由函数返回dctmtx对于较小的方形输入,例如8×8或16×16,可能更有效。M-by-M变换矩阵T是由

T P Q = { 1. M 2. M 因为 π ( 2. Q + 1. ) P 2. M P = 0 , 1. P M 1. , 0 Q M 1. 0 Q M 1.

对于M-by-M矩阵A.,T*A是一个m × m矩阵,它的列包含的列的一维DCTA..的二维离散余弦变换A.可计算为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系数的值接近于零。这些系数可以被丢弃而不会严重影响重建图像的质量。

将图像读入工作区并将其转换为类双重的.

I=imread(“摄影师,tif”);I = im2double(我);

计算图像中8×8块的二维DCTdctmtx返回N×N DCT变换矩阵。

T=dctmtx(8);dct=@(block_struct)T*block_struct.data*T';B=blockproc(I[8],dct);

丢弃每个块中64个DCT系数中的10个以外的所有系数。

掩码=[1 1 1 1 0 0 0 0 0 0 1 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];B2=块过程(B,[8 8],@(块结构)掩码。*块结构数据);

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

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

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

imshow(I)

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

图imshow(I2)

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