matlab基于dct的图像压缩编码解码_一篇文章搞定DCT在JPEG中的本质

matlab基于dct的图像压缩编码解码_一篇文章搞定DCT在JPEG中的本质_第1张图片

前序傅立叶变换,离散傅立叶变换,推荐这个回答的介绍

想和大家讨论一下jpeg中的dct变换,为什么有效?它有什么更深层次的本质吗?​www.zhihu.com

全篇参考下文,英文较好可以直接看。

ucsd ece161​www.svcl.ucsd.edu

预备概念

  • 能量聚集(energy compaction):
    • 代表能把松散能量序列打包进尽可能少的频率分量的能力。
    • 对于图像压缩十分重要
    • 当聚集成都较高,只需要传递很少的分量而不是整个像素点集。
  • 为什么能量聚集十分重要?
    • 主要原因是图像压缩
    • 可以对其他的应用更加友好。
    • round()函数
    • 向最近的整数进行取整数操作。
    • round(1) = 1; round(0.55543) = 1; round (0.0000005) = 0。
  • 量化器是?
    • 通过将原本的输出区域进行层次的划分。
    • 在输入为某一个范围时,将其映射为相同的输出。
    • 实施一个量化器
  1. 定义量化器的步长
  2. 应用round函数

    • 此时,
      越大,我们会有越少的再现层次。
    • 更大的压缩的代价将是更严重的失真。
  • 图像压缩

matlab基于dct的图像压缩编码解码_一篇文章搞定DCT在JPEG中的本质_第2张图片
JPEG的编码流程
  • 本身的DCT变换不会引入更多的扭曲失真和保存更多bit。
  • 这些来自于丢掉信息时进行的量化器所造成的“损失压缩”。
  • 通过对图像进行DCT操作,再使用对DCT后的图像量化,再逆DCT回去,得到的图像就是经过了简单压缩后的图像。

Discrete Cosine Transform(DCT)

  • DCT性质
    • 在直方图中有更好的聚集程度。
    • 可以省去很大一部分的分量。
    • 在同一程度的失真上能保存更多的比特。
  • 这里是DCT-II, even symmetric DCT, "the DCT",公式:
    • 正变换:
    • 逆变换:
  • 其中,
  • 从DFT的公式推导:
    • Step1:创建对称采样序列
    • Step2: 计算
      个点下
      的DFT
    • Step3:将上式重写为仅含有N个项的式子
  1. ,令
  2. 为了将其写成cosine形式,需要将其变化为两个镜面的指数。然后根据欧拉公式中


推导结束。此时,有DFT和DCT的关系 :

DCT公式为:

这三个步骤可以总结为

  • 从公式中分析为什么比有更好的能量聚集效果:
    • 在扩展时,DCT采用的是对称的形式,而DFT和DFS相同采用周期扩展。

matlab基于dct的图像压缩编码解码_一篇文章搞定DCT在JPEG中的本质_第3张图片

DFT中扩展序列时,是直接采用平移方式引入了不连续的区间,而DCT采用对称形式,消除了这一人为的不连续,而通常高频信号隐藏在这人造的不连续中。这也正是为什么DCT的能量聚集效果会更好。

matlab基于dct的图像压缩编码解码_一篇文章搞定DCT在JPEG中的本质_第4张图片
  • 快速算法
    • 考虑到DCT的过程可以解释为
    • 根据这几个步骤,可以得出相应的快速算法。
  1. ,这里可以采用计算2N-pt​的FFT计算
  2. 根据公式
  • N-pt的DCT算法复杂度也就是2N-pt的DFT的复杂度。

二维DCT公式:

  • 流程:
    • 并且有
    • 以及
  • 公式:
    • 正变换:
    • 逆变换:
    • 其中:
  • 快速算法:

matlab基于dct的图像压缩编码解码_一篇文章搞定DCT在JPEG中的本质_第5张图片
  • 意味着2D-DCT可以通过分别计算行和列上的1D-DCT序列实现
  • 2D-DCT计算需要
    • 次数的
      1D-DFT
    • 然后是
      次数的
      1D-DFT
    • 总算法复杂度有:
      • 也就是,做2D-FFT包括
      • 对行序列做1D-FFT
      • 对列中间序列做1D-FFT

你可能感兴趣的:(matlab基于dct的图像压缩编码解码_一篇文章搞定DCT在JPEG中的本质)