一、前言
离散余弦变换(Discrete Cosine Transform, DCT)是以一组不同频率和幅值的余弦函数和来近似一幅图像,实际上是傅立叶变换的实数部分。离散余弦变换有一个重要的性质,即对于一幅图像,其大部分可视化信息都集中在少数的变换系数上。因此,离散余弦变换经常用于图像压缩,例如国际压缩标准的JPEG格式中就采用了离散余弦变换。
二、基本原理
在傅立叶变换过程中,若被展开的函数是实偶函数,则其傅立叶变换中只包含余弦项,基于傅立叶变换的这一特点, 人们提出了离散余弦变换。DCT变换先将图像函数变换成偶函数形式,再对其进行二维离散傅立叶变换,故DCT变换可以看成是一种简化的傅立叶变换。
一维离散余弦变换可以非常容易地推广到二维离散余弦变换,二维离散余弦变换定义为:
三、matlab实现
(1)对图像进行二维离散余弦变换
在MATLAB软件中,采用函数dct()进行一维离散余弦变换,采用函数idct()进行一维离散余弦反变换。通过函数dct2()进行二维离散余弦变换,该函数的详细使用情况如下所示:
close all;
clear all;
clc;
I=imread('coins.png');
I=im2double(I);
% B=dct2(A)用于计算图像矩阵A的二维离散余弦变换,返回值为B,A和B的大小相同
J=dct2(I);
subplot(121),imshow(I);
title('原始图像');
subplot(122),imshow(log(abs(J)),[]);
title('二维离散余弦变换系统的图像');% 系统中的能量主要集中在左上角,其余大部分系统将近于0
实现效果:
(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)图像的二维离散余弦反变换
在MATLAB软件中,采用函数idct2()进行二维离散余弦反变换,该函数的调用情况如下:
文章来源:https://www.toymoban.com/news/detail-446111.html
close all;
clear all;
clc;
I=imread('cameraman.tif');
I=im2double(I);
J=dct2(I);% 二维离散余弦变换
% B=idct2(A)计算矩阵A的二维离散反变换,返回值为B,A和B的大小相同
K=idct2(J);% 二维离散余弦反变换
subplot(131),imshow(I);
title('原始图像');
subplot(132),imshow(J);
title('二维离散余弦变换的系数图像');
subplot(133),imshow(K);
title('二维离散余弦反变换的图像');
实现效果:
文章来源地址https://www.toymoban.com/news/detail-446111.html
到了这里,关于图像处理之图像的离散余弦变换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!