快速余弦变换matlab,离散余弦变换 - MATLAB & Simulink - MathWorks 中国
使用离散余弦变换的图像压缩
此示例说明如何使用离散余弦变换 (DCT) 压缩图像。该示例计算输入图像中 8×8 个数据块的二维 DCT,丢弃(设置为零)每个数据块中 64 个 DCT 系数中除 10 个以外的所有系数,然后使用每个数据块的二维逆 DCT 重构图像。该示例使用变换矩阵计算方法。
在 JPEG 图像压缩算法中使用 DCT。将输入图像分成 8×8 或 16×16 个数据块,并对每个数据块计算二维 DCT。然后对 DCT 系数进行量化、编码和传输。JPEG 接收器(或 JPEG 文件读取器)对量化的 DCT 系数进行解码,计算每个数据块的逆二维 DCT,然后将这些数据块一起放回单个图像中。对于典型图像,许多 DCT 系数的值接近于零。可以丢弃这些系数,而不会严重影响重构图像的质量。
将图像读入工作区,并将其转换为 double 类。
I = imread('cameraman.tif');
I = im2double(I);
计算图像中 8×8 个数据块的二维 DCT。函数 dctmtx 返回 N×N DCT 变换矩阵。
T = dctmtx(8);
dct = @(block_struct) T * block_struct.data * T';
B = blockproc(I,[8 8],dct);
丢弃每个数据块中 64 个 DCT 系数的大部分系数,仅保留 10 个。
mask = [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' * block_struct.data * T;
I2 = blockproc(B2,[8 8],invdct);
并排显示原始图像和重构图像。尽管几乎 85% 的 DCT 系数被丢弃,导致重构图像的质量有所下降,但它仍是清晰可辨的。
imshow(I)

figure
imshow(I2)

