DCT编码原理分析

2024-01-28 14:10
文章标签 分析 原理 编码 dct

本文主要是介绍DCT编码原理分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

二维DCT变换

2012年11月30日  分类:学习笔记x264图像处理

目录

  • 1.一维DCT变换
  • 2.二维DCT变换
  • 3.二维DCT反变换
  • 4.整数DCT变换

写这篇文章的目的主要是为了给x264打好基础,x264用的是整数DCT变换,所以就先来说说DCT变换吧。
DCT(Discrete Cosine Transform),又叫离散余弦变换,它的第二种类型,经常用于信号和图像数据的压缩。经过DCT变换后的数据能量非常集中,一般只有左上角的数值是非零的,也就是能量都集中在离散余弦变换后的直流和低频部分,下面我会用matlab来演示整个过程。

1.一维DCT变换

我们首先来看看一维的DCT变换,这是二维的基础。一维的DCT变换共有8种,其中最实用的是第二种形式,公式如下: dct1其中c(u)是加上去一个系数,为了能使DCT变换矩阵成为正交矩阵,在后面二维变换将看到他的作用。N是f(x)的总数。相比其他几种形式,他的运算还是比较简单的,因此也用的比较广。

2.二维DCT变换

二维DCT变换是在一维的基础上再进行一次DCT变换,这个比较好理解,直接看公式: dct1这里我只讨论两个N相等的情况,也就是数据是方阵的形式,在实际应用中对不是方阵的数据都是先补齐再进行变换的。为了matlab仿真方便点,写成矩阵形式: dct1下面就用matlab来模拟一下,使用随机生成的4x4矩阵作为输入,程序如下:

  
  1. clear;
  2. clc;
  3. X=round(rand(4)*100);%随机生成的数据
  4. A=zeros(4);%变换矩阵
  5. for i=0:3
  6. for j=0:3
  7. if i==0
  8. a=sqrt(1/4);
  9. else
  10. a=sqrt(2/4);
  11. end
  12. A(i+1,j+1)=a*cos(pi*(j+0.5)*i/4);
  13. end
  14. end
  15. Y=A*X*A';%DCT变换
  16. YY=dct2(X);%用matlab中的函数进行DCT变换

Y是使用上面的公式进行变换,YY是用matlab自带的dct2函数变换,结果是是:

  
  1. X =
  2. 61 19 50 20
  3. 82 26 61 45
  4. 89 90 82 43
  5. 93 59 53 97
  6. Y =
  7. 242.5000 32.1613 22.5000 33.2212
  8. -61.8263 7.9246 -10.7344 30.6881
  9. -16.5000 -14.7549 22.5000 -6.8770
  10. 8.8322 16.6881 -35.0610 -6.9246
  11. YY =
  12. 242.5000 32.1613 22.5000 33.2212
  13. -61.8263 7.9246 -10.7344 30.6881
  14. -16.5000 -14.7549 22.5000 -6.8770
  15. 8.8322 16.6881 -35.0610 -6.9246

可以看出Y和YY的结果是一样的,这也进一步验证了上面的公式是正确的。由于X是我随机生成的,相关性很小,变换后的结果比较乱;如果是信号或图像这样相关性比较大的数据的话,数值会集中在左上角,右下角一般都是零,再使用“之”字型扫描得到数据流会包含很多连续的零,编码后数据量会非常小,这就是DCT变换带来的好处。

3.二维DCT反变换

DCT逆变换的公式如下: idct2矩阵形式可以由正变换的公式直接推出来,因为在A中加了c(i)这个系数,使得A成为了正交矩阵,所以我们就可以这样做: idct2m在用matlab来验证是否能反变换出原来的数据:

  
  1. clear;
  2. clc;
  3. X=[
  4. 61 19 50 20
  5. 82 26 61 45
  6. 89 90 82 43
  7. 93 59 53 97];
  8. A=zeros(4);
  9. for i=0:3
  10. for j=0:3
  11. if i==0
  12. a=sqrt(1/4);
  13. else
  14. a=sqrt(2/4);
  15. end
  16. A(i+1,j+1)=a*cos(pi*(j+0.5)*i/4);
  17. end
  18. end
  19. Y=A*X*A';
  20. X1=A'*Y*A;

X使用的是上面正变换用的数据,运行后得到的X1为:

  
  1. X1 =
  2. 61.0000 19.0000 50.0000 20.0000
  3. 82.0000 26.0000 61.0000 45.0000
  4. 89.0000 90.0000 82.0000 43.0000
  5. 93.0000 59.0000 53.0000 97.0000

和X完全相等。在实际进行编码的时候,比如JPEG压缩的时候,只会对Y左上角的数据进行传输,所以解码出来的内容不会完全和原来的相同。

4.整数DCT变换

说道DCT就顺便提一下x264中的整数DCT变换,整数DCT变换是以DCT变换为基础的,为了减少计算量做的一些调整,下面我写一下整数DCT变换公式的大致推导过程: qdct然后根据A是正交矩阵,把c=bd带入A中,使行向量为单位向量可以得到d=0.4142。令d=0.5,得到b*b=0.4,代入上面的式子中,把0.5提取出来放到右边的点乘中就得到了: qdct-1这样在对大括号部分进行计算时就都是加法和减法了,而且在精度上没有太大降低。在x264实际编码中,变换和量化是一起进行的,使得编码速度有了很大的提高。

转载:作者:wuyuan 本文来自 Wuyuan's Blog 转载请注明,谢谢! 文章地址: http://wuyuans.com/2012/11/dct2

这篇关于DCT编码原理分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/653858

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三

Redis中Set结构使用过程与原理说明

《Redis中Set结构使用过程与原理说明》本文解析了RedisSet数据结构,涵盖其基本操作(如添加、查找)、集合运算(交并差)、底层实现(intset与hashtable自动切换机制)、典型应用场... 目录开篇:从购物车到Redis Set一、Redis Set的基本操作1.1 编程常用命令1.2 集

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

Redis中的AOF原理及分析

《Redis中的AOF原理及分析》Redis的AOF通过记录所有写操作命令实现持久化,支持always/everysec/no三种同步策略,重写机制优化文件体积,与RDB结合可平衡数据安全与恢复效率... 目录开篇:从日记本到AOF一、AOF的基本执行流程1. 命令执行与记录2. AOF重写机制二、AOF的

java程序远程debug原理与配置全过程

《java程序远程debug原理与配置全过程》文章介绍了Java远程调试的JPDA体系,包含JVMTI监控JVM、JDWP传输调试命令、JDI提供调试接口,通过-Xdebug、-Xrunjdwp参数配... 目录背景组成模块间联系IBM对三个模块的详细介绍编程使用总结背景日常工作中,每个程序员都会遇到bu

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数