图像处理之图像的离散余弦变换

一、前言

离散余弦变换(Discrete Cosine Transform, DCT)是以一组不同频率和幅值的余弦函数和来近似一幅图像,实际上是傅立叶变换的实数部分。离散余弦变换有一个重要的性质,即对于一幅图像,其大部分可视化信息都集中在少数的变换系数上。因此,离散余弦变换经常用于图像压缩,例如国际压缩标准的JPEG格式中就采用了离散余弦变换。

二、基本原理

在傅立叶变换过程中,若被展开的函数是实偶函数,则其傅立叶变换中只包含余弦项,基于傅立叶变换的这一特点, 人们提出了离散余弦变换。DCT变换先将图像函数变换成偶函数形式,再对其进行二维离散傅立叶变换,故DCT变换可以看成是一种简化的傅立叶变换
图像处理之图像的离散余弦变换_第1张图片
一维离散余弦变换可以非常容易地推广到二维离散余弦变换,二维离散余弦变换定义为:
图像处理之图像的离散余弦变换_第2张图片

三、matlab实现

(1)对图像进行二维离散余弦变换

在MATLAB软件中,采用函数dct()进行一维离散余弦变换,采用函数idct()进行一维离散余弦反变换。通过函数dct2()进行二维离散余弦变换,该函数的详细使用情况如下所示:
在这里插入图片描述

close all;
clear all;
clc;
I=imread('coins.png');
I=im2double(I);
% B=dct2(A)用于计算图像矩阵A的二维离散余弦变换,返回值为B,AB的大小相同
J=dct2(I);

subplot(121),imshow(I);
title('原始图像');
subplot(122),imshow(log(abs(J)),[]);
title('二维离散余弦变换系统的图像');% 系统中的能量主要集中在左上角,其余大部分系统将近于0

实现效果:
图像处理之图像的离散余弦变换_第3张图片

(2)通过函数dctmtx()生成离散余弦变换矩阵

在MATLAB中,采用函数dctmtx()生成离散余弦变换矩阵。函数dctmtx()的详细使用情况如下:
在这里插入图片描述

close all;
clear all;
clc;
A=[1 1 1 1;2 2 2 2;3 3 3 3];
s=size(A);
M=s(1);% 矩阵的行数
N=s(2);% 矩阵的列数
% B=dctmtx(n)建立n*n的离散余弦变换矩阵B,其中n是一个正整数
P=dctmtx(M);
Q=dctmtx(N);
B=P*A*Q';% 通过离散余弦变换矩阵定义B=P*A*Q计算矩阵A的离散余弦变换
disp(P);
disp(Q);
disp(B);

命令行窗口:

    0.5774    0.5774    0.5774
    0.7071    0.0000   -0.7071
    0.4082   -0.8165    0.4082

    0.5000    0.5000    0.5000    0.5000
    0.6533    0.2706   -0.2706   -0.6533
    0.5000   -0.5000   -0.5000    0.5000
    0.2706   -0.6533    0.6533   -0.2706

    6.9282         0   -0.0000   -0.0000
   -2.8284   -0.0000    0.0000    0.0000
    0.0000         0   -0.0000   -0.0000

(3)利用函数dctmtx()进行图像的离散余弦变换

close all;
clear all;
clc;
I=imread('cameraman.tif');
I=im2double(I);
s=size(I);
M=s(1);
N=s(2);
% B=dctmtx(n)建立n*n的离散余弦变换矩阵B,其中n是一个正整数
P=dctmtx(M);
Q=dctmtx(N);
J=P*I*Q';% 通过离散余弦变换矩阵定义B=P*A*Q计算矩阵A的离散余弦变换
K=dct2(I);
E=J-K;% 两种方法计算出的离散余弦系数之差
find(abs(E)>0.000001)% 查找系数差的绝对值大于0.000001(命令行显示:空的 0×1 double 列向量--说明两种方法计算出的离散余弦系数基本相同)
 
subplot(121),imshow(J);
title('采用离散变换矩阵得到的系数图像');
subplot(122),imshow(K);
title('采用函数dct2()得到的系数图像');

实现效果:
图像处理之图像的离散余弦变换_第4张图片
(4)图像的二维离散余弦反变换

在MATLAB软件中,采用函数idct2()进行二维离散余弦反变换,该函数的调用情况如下:
在这里插入图片描述

close all;
clear all;
clc;
I=imread('cameraman.tif');
I=im2double(I);
J=dct2(I);% 二维离散余弦变换
% B=idct2(A)计算矩阵A的二维离散反变换,返回值为B,AB的大小相同
K=idct2(J);% 二维离散余弦反变换

subplot(131),imshow(I);
title('原始图像');
subplot(132),imshow(J);
title('二维离散余弦变换的系数图像');
subplot(133),imshow(K);
title('二维离散余弦反变换的图像');

实现效果:
图像处理之图像的离散余弦变换_第5张图片

你可能感兴趣的:(图像处理,图像处理,计算机视觉,离散余弦变换,matlab)