离散余弦变换(DCT)将图像表示为不同幅度和频率的正弦波之和dct2
函数计算图像的二维离散余弦变换(DCT)。DCT的特性是,对于典型图像,有关图像的大部分视觉重要信息集中在DCT的几个系数中。因此,DCT通常用于图像压缩应用中。例如,DCT是国际标准有损图像压缩算法JPEG的核心。(名称来源于制定该标准的工作组:联合摄影专家组。)
M×N矩阵的二维DCTA.
定义如下。
价值观Bpq被称为“离散余弦变换系数的A.
(注意,MATLAB中的矩阵索引®始终从1开始,而不是从0开始;因此,MATLAB矩阵元素A(1,1)
和B(1,1)
对应于数学上的数量A.00和B00分别为。)
DCT是一种可逆变换,其逆式如下所示:
逆DCT方程可以解释为任意M×N矩阵A.
可以写成的和锰表格的功能
这些函数称为基函数DCT的系数Bpq,则可视为权重应用于每个基函数。对于8 × 8矩阵,64个基函数由这幅图表示。
8×8矩阵的64个基函数
水平频率从左到右增加,垂直频率从上到下增加。左上角的常值基函数通常称为直流基函数,以及相应的DCT系数B00通常被称为直流系数.
使用图像处理工具箱计算DCT有两种方法™ 软件第一种方法是使用dct2
作用dct2
使用基于fft的算法,在大量输入的情况下实现快速计算。第二种方法是使用DCT变换矩阵,由函数返回dctmtx
对于较小的方形输入,例如8×8或16×16,可能更有效。M-by-M变换矩阵T
是由
对于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)
图imshow(I2)