DCT变换和FFT变换都属于变换压缩方法(TransformCompression),变换压缩的一个特点是将从前密度均匀的信息分布变换为密度不同的信息分布。在图像中,低频部分的信息量要大于高频部分的信息量,尽管低频部分的数据量比高频部分的数据量要小的多。例如删除掉占50%存储空间的高频部分,信息量的损失可能还不到5%。

变换编码有很多种。K–L变换的压缩效率很高,但算法实现困难;FFT变换算法实现简单,但压缩效率不是很理想。经过多方面的比较,最终胜出的算法是DCT,一种源自FFT的变换编码。

与FFT变换同时使用正弦和余弦函数来表达信号不同,DCT只使用余弦函数来表达信号。DCT变换有多个版本,有一种常用的DCT实现过程是这样的:对一个长度为129(0到128)的信号进行DCT变换。首先,复制点127到点1,使整个信号变为:

0, 1, 2, .., 127, 128, 127, …, 2, 1

     这串长度为256的时间域信号经过FFT变换后会生成一个长度为129的信号。生成的信号长度之所以129,而不是256,是因为时间域的信号对称,根据二元性(duality),对应的频率域信号的虚数部分全部为0。也就是说,我们输入的长度为129的时间域信号经过DCT变换后,产生一个长度为129的频率域信号,并且频率域完全由余弦函数组成。
     在图像处理中,每副图像都会被切成8×8的小块,块的大小可以是任意,只是因为历史原因人们习惯于切为8×8的块。二维的图像处理与一维的信号处理原理是一致的,只是一些计算公式不一样,在二维图像中,基函数的公式如下:
 
     公式中x和y指像素在空间域(对应一维的时间域)的坐标,u和v指基函数频率域中的坐标。这个基函数公式基于8×8的块,x,y, u, v的取值范围都是0–7。
图像经DCT变换后,低频信息集中在矩阵的左上角,高频信息则向右下角集中。直流分量在[0,0]处,[0,1]处的基函数在一个方向上是一个半周期的余弦函数,在另一个方向上是一个常数。[1,0]处的基函数与[0,1]类似,只不过方向旋转了90度。

图3-1 DCT变换中使用的基函数

图3-1是一个8×8的基函数示意图,从中拿出了6个基函数并做出其在二维平面上的示意图。这些基函数是不变的,在DCT变换中,这些基函数将与空间域中的每一个元素进行分别相乘,并将结果累加起来,就完成了空间域到频率域的初步变换。此时还需要两步就可以完成DCT变换:1.将第0行和第0列的值除以2(也就是说,[0,0]要除以4)。2.所有64个元素都除以16。

DCT反变换(InverseDCT)更为容易,将频率域中的基函数分别与对应的振幅(spectrum)相乘并累加,即可得到相应的空间域元素的值。

图3-2 JPEG中DCT转换示例

在图3-2中,最右侧的那一栏表示使用不同比特数来表达频率域的效果。原始频率域需要64个bit来存储,而g对应的频率域使用10个bit来存储频率域中的单个元素,h和i对应的频率域分别使用8个bit和5个bit。然后对d,e和f分别进行InverseDCT变换,g,h和i分别是使用原始空间域的值来减掉反变换(IDCT)后得到的残差。从图g可以看出,使用DCT压缩将一个32bit的块压缩为10bit,但信息损失很小,几乎可以忽略。从图h和i可以看出,随压缩率的增大,信息损失也逐渐变大。

经过DCT变换,压缩还可以通过丢弃64个振幅(Spectrum)中的一些信息量较小的元素来实现,这样即可以实现压缩,还可以尽可能最大地保持信息。

图3-3显示了使用不同数量的频率域振幅(Spectrum)所得的重建图像(a,b和c)与原始图像d的对比效果。从图c可以看出,即使弃掉占总数3/4的高频振幅(Spectrum),使用占总数1/4的低频振幅(Spectrum)也可以得到与原始图像很接近的结果。而且误差看起来是随机分布的,可以看作是随机噪声。

图3-3使用不同数量的Spectrum重建JPEG的效果

下面使用JPEG的压缩过程来介绍DCT变换在图像处理中的应用。JPEG的压缩过程可以分为以下几步:1.将整副图像分解为8×8的小块。2.对每个小块做DCT变换。3.对变换后得到的频率域使用前面所介绍的方法进行压缩:减少每个元素的bit值以及丢弃一些元素。通过量化表(QuantizationTable),这两个压缩操作可以一步实现。

图3-4是两个JPEG量化表的示例,频率域中的每个振幅(Spectrum)与量化表中对应的元素想除,即可得到压缩后的频率域。量化表a的压缩率较低,表b的压缩率比较高。例如a中最右下角的值为16,将对应振幅(Spectrum)的取值范围由-127– 127缩小为-7– 7。而在图b中右下角的值为256,将其清零,相当于将对应的高频信息删除。

图3-4 JPEG量化表

JPEG压缩的第四步,8×8的块被扫描为线性序列,扫描顺序如图3-5所示。对块进行量化处理后,再进行游程编码,那些振幅(Spectrum)为0的元素就被删除掉了。

图3-5线性扫描顺序

JPEG压缩第五步是对线性序列进行游程编码,第六步是对游程编码后的序列进行Huffman编码。

JPEG的压缩率可以设定,图3-6显示不同压缩率的图像与原始图像的对比。

图3-6不同压缩率的JPEG对比

为什么DCT变换对图像的压缩效果要比DFT好?主要原因是DCT中使用了半周期的基函数,而DFT使用的是整周期基函数。图像中大部分像素的变化都是渐变的,因此DCT可以更好地表达图像,从而获得更高的压缩效率。

离散余弦变换(Discrete Cosine Transform)相关推荐

  1. 离散余弦变换 - Discrete Cosine Transform

    离散余弦变换(DCT)最近可能要用,不过之前上课学的内容有点忘记了,这里复习一下.       离散余弦变换的定义 与傅里叶变换的思想相似,离散余弦变换(Discrete CosineTransfor ...

  2. DCT(离散余弦变换(DiscreteCosineTransform))

    离散余弦变换(Discrete Cosine Transform,简称DCT变换)是一种与傅立叶变换紧密相关的数学运算.在傅立叶级数展开式中,如果被展开的函数是实偶函数,那么其傅立叶级数中只包含余弦项 ...

  3. 压缩感知稀疏基之离散余弦变换(DCT)和离散正弦变换(DST)

    题目:压缩感知稀疏基之离散余弦变换(DCT)和离散正弦变换(DST) 在前面一篇<压缩感知的常见稀疏基名称及离散傅里叶变换基>中集结了九篇压缩感知文献中有关稀疏基名称,并且直白地告诉大家稀 ...

  4. Python图像处理【10】基于离散余弦变换的图像压缩

    基于离散余弦变换的图像压缩 0. 前言 1. 离散余弦变换基础 2. 基于离散余弦变换的图像压缩 3. 图像 JPEG 压缩 3.1 JPEG 压缩原理 3.2 JPEG 压缩实践 小结 系列链接 0 ...

  5. 离散余弦变换(DCT)

    DCT变换.DCT反变换.分块DCT变换 一.引言 DCT变换的全称是离散余弦变换*(Discrete Cosine Transform)*,主要用于将数据或图像的压缩,能够将空域的信号转换到频域上, ...

  6. python离散余弦变换_数字图像处理(三)—— 离散余弦变换

    离散余弦变换(Discrete Cosine Transform)本质上也是离散傅里叶变换(Discrete Fourier Transform),但是只有实数部分.有这样一个性质:如果信号 在给定区 ...

  7. 离散余弦变换(学习笔记)

    离散余弦变换 离散余弦变换(Discrete Cosine Transform, DCT)是与傅里叶变换相关的一种变换,类似于离散傅里叶变换,但是只使用了实数 离散余弦变换相当于一个长度大概是它两倍的 ...

  8. java dct变换_Discrete Cosine Transform [DCT] (离散余弦变换)

    Discrete Cosine Transform [DCT] (离散余弦变换) 描述:Binarizer是一个Transformer. 离散余弦变换是与傅里叶变换相关的一种变换,它类似于离散傅立叶变 ...

  9. 离散余弦变换和C语言实现-win32版本

    离散余弦变换,DCT for Discrete Cosine Transform. 是与傅里叶变换相关的一种变换,它类似于离散傅里叶变换(DFT for Discrete Fourier Transf ...

最新文章

  1. java8新特性_Java8新特性之Date API|乐字节
  2. 【机器学习】激活函数(Activation Function)
  3. 69.2. wget - retrieves files from the web
  4. linux i2c调试命令,嵌入式Linux下I2C接口调试
  5. svn更改用户名方法:
  6. linux i2c子系统入口,I2C子系统1 - ARM_Linuxx的个人空间 - OSCHINA - 中文开源技术交流社区...
  7. python subprocess popen 无法打开_使用subprocess.Popen()在python脚本中设置PYTHONPATH失败...
  8. 解决win2003安装exchangeServer后关机慢的方法
  9. 【转】pacs定位线_C#开发PACS医学影像处理系统(十五):Dicom影像交叉定位线算法
  10. 【codevs3110】一把鼻涕一把泪的堆排序
  11. 一个完全摆脱findViewById的自动绑定库
  12. 数据结构上机实践第14周项目1(3) - 验证算法(二叉排序树)
  13. 计算机组成与设计-处理器
  14. 世嘉MD游戏开发【十一】:背景卷轴滚动(视差滚动)Parallax Scroll和摄像机
  15. 如何长期记忆GRE词汇而保持不忘呢?
  16. 在macOS上用supervisor构建稳定的SSH转发
  17. Spring父子类同属性父类属性隐藏
  18. Xadmin文档(二)
  19. Java毕业设计_消防安全培训系统
  20. 用于半导体的RCA清洁技术

热门文章

  1. MD5校验(checksum)
  2. Excel函数之countifs函数(统计给定的多个条件下的数据)
  3. CC2530,zigbee,协议栈,代码集(网络层)
  4. html是最美的开发语言,世界公认3大最美语言
  5. 使用vant的 van-tabbar组件的一点心得
  6. 关于jxls2.6.0后的版本使用的jexl3学习使用
  7. 微信小程序支付 Java后端代码详解
  8. HDU 4349 Xiao Ming#39;s Hope 组合数学
  9. rust进水器怎么用_易水香教你如何正确使用家用净水器
  10. Android kotlin 实现一键清理内存功能