
一、简介
一,背景介绍
DCT,即离散余弦变换,常用图像压缩算法,步骤如下
1)分割,首先将图像分割成 8x8 或 16x16 的小块;
2)DCT 变换,对每个小块进行 DCT 变换;
3)舍弃高频系数(AC 系数),保留低频信息(DC 系数)。高频系数一般保存
的是图像的边界、纹理信息,低频信息主要是保存的图像中平坦区域信息。
4)图像的低频和高频,高频区域指的是空域图像中突变程度大的区域(比如目
标边界区域),通常的纹理丰富区域。
2 DCT 产生的工程背景:

视频信号的频谱线在 0-6MHz 范围内,而且 1 幅视频图像内包含的大多数为低频
频谱线,只在占图像区域比例很低的图像边缘的视频信号中才含有高频的谱
线。因此,在视频信号数字处理时,可根据频谱因素分配比特数:对包含信息
量大的低频谱区域分配较多的比特数,对包含信息量低的高频 谱区域分配较少
的比特数,而图像质量并没有可察觉的损伤,达到码率压缩的目的。然而,这
一切要在低熵(Entropy)值的情况下,才能达到有效的编码。能否对一串数据进
行有效的编码,取决于每个数据出现的概率。每个数据出现的概率差别大,就
表明熵值低, 可以对该串数据进行高效编码。反之,出现的概率差别小,熵值
高,则不能进行高效编码。视频信号的数字化是在规定的取样频率下由 A/D 转
换器对视频电平转换而来的,每个像素的视频信号幅度随着每层的时间而周期
性地变化。每个像素的平均信息量的总和为总平均信息量,即熵值。由于每个
视频电平发生几乎具有相等的概率,所以视频信号的熵值很高。熵值是一个定
义码率压缩率的参数,视频图像的压缩率依赖于视频信号的熵值,在多数情况
下视频信号为高熵值,要进行高效编码,就要将高熵值变为低熵值。怎样变成
低熵值呢?这就需要分析视频频谱的特点。大多数情况下,视频频谱的幅度随
着频率的升高而降低。其中 低频频谱在几乎相等的概率下获得 0 到最高的电
平。与此相对照,高频频谱通常得到的是低电平及稀少的高电平。显然,低频
频谱具有较高的熵值,高频频谱具有较低的熵值。据此,可对视频的低频分量
和高频分量分别处理,获得高频的压缩值。
自从 Ahmed 和 Rao 于 1974 年给出了离散余弦变换(DCT)的定义以来,离散余
弦变换(DCT)与改进型离散余弦变换(MDCT)就成为广泛应用于信号处理和图
像处理特别是用于图像压缩和语音压缩编解码的重要工具和技术,一直是国际
学术界和高科技产业界的研究热点。现在的很多图像和视频编码标准(如
MPEG-1 , MEPG-2 ,MEPG-4 中的第二部分)都要求实现整数的 8×8 的 DCT
和 IDCT,而 MDCT 和 IMDCT 则主要被应用于音频信号的编解码中(如 MPEG-
1 ,MEPG-2 和 AC-]等标准的音频编码部分)。正是由于这类变换被广泛采
用,对于这类变换的快速算法的研究才显得尤为重要。特别是针对特定的应用
条件下的快速算法的研究对于提高整个系统的性能表现有很大帮助。
由上面的引用可见,码率压缩基于变换编码和熵值编码两种算法。前者用于降
低熵值,后者将数据变为可降低比特数的有效编码方式。在 MPEG 标准中,变换
编码采用的是 DCT,变换过程本身虽然并不产生码率压缩作用,但是变换后的
频率系数却非常有利于码率压缩。实际上压缩数字视频信号的整个过程分为块
取样、DCT、量化、编码 4 个主要过程进行-----首先在时间域将原始图像分成
N(水平)×N(垂直)取样块,根据需要可选择 4×4、4×8、8×8、8×16、
16×16 等块,这些取样的像素块代表了原图像帧各像素的灰度值,其范围在
139-163 之间,并依序送入 DCT 编码器,以便将取样块由时间域转换为频率域
的 DCT 系数块。DCT 系统的转换分别在每个取样块中进行,这些块中每个取样
是数字化后的值,表示一场中对应像素的视频信号幅度值
3 离散余弦变换的实现:
实现 DCT 的方法很多,最直接的是根据 DCT 的定义来计算。以二维 8xSDCT 为
例,需要作 4096 次乘法和 3584 次加法。这种算法的实现需要巨大的计算量,
不具有实用价值。在应用中,需要寻找快速而又精确的算法。较为常用的方法
是利用 DCT 的可拆分特性,同样以二维 8xSDCT 为例,先进行 8 行一维 DCT 需要

64xS次乘法和 56xS 次加法,再进行 8 列一维 DCT 要 64xS 次乘法和 56xS 次加
法,共需要 64x8xZ=1024 次乘法和 56x8xZ=896 次加法,计算量大为减少。
除此之外,DCT 还有很多公开的快速算法。快速算法主要是通过减少运算次数
而减少运算时间,这对于设计快速的硬件系统非常有效。二维 DCT 的快速算法
则一般采用行列分离 DCT 算法,即转换为两次一维变换,其间通过转置矩阵连
接。最为经典和常用的快速算法是由 Arai 等人于 1988 年提出的 AAN 算法以及
Loeffier 等人于 1989 年提出的 LLM 算法。但是,由于行列分离 DCT 算法能够
重复使用一维变换结构,因此在实际实现上,尤其在硬件上比二维直接计算算
法更有优势。
二、源代码
function varargout = imDCT(varargin)
% IMDCT M-file for imDCT.fig
% IMDCT, by itself, creates a new IMDCT or raises the existing
% singleton*.
%
% H = IMDCT returns the handle to a new IMDCT or the handle to
% the existing singleton*.
%
% IMDCT('CALLBACK',hObject,eventData,handles,...) calls the
local
% function named CALLBACK in IMDCT.M with the given input
arguments.
%
% IMDCT('Property','Value',...) creates a new IMDCT or raises
the
% existing singleton*. Starting from the left, property value
pairs are
% applied to the GUI before imDCT_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property
application
% stop. All inputs are passed to imDCT_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows
only one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help imDCT
% Last Modified by GUIDE v2.5 07-Dec-2009 19:54:09
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;