【转】DCT变换的透彻解析

3、离散余弦变换 DCT
  将图像从色彩域转换到频率域,常用的变换方法有:

DCT变换的公式为:
DCT变换和量化 - 远方的沙 - 远方沙
f(i,j) 经 DCT 变换之后,F(0,0) 是直流系数,其他为交流系数。
  还是举例来说明一下。
  8x8的原始图像:

推移128后,使其范围变为 -128~127:

使用离散余弦变换,并四舍五入取最接近的整数:

上图就是将取样块由时间域转换为频率域的 DCT 系数块。
DCT 将原始图像信息块转换成代表不同频率分量的系数集,这有两个优点:其一,信号常将其能量的大部分集中于频率域的一个小范围内,这样一来,描述不重要的分量 只需要很少的比特数;其二,频率域分解映射了人类视觉系统的处理过程,并允许后继的量化过程满足其灵敏度的要求。
  当u,v = 0 时,离散余弦正变换(DCT)后的系数若为F(0,0)=1,则离散余弦反变换(IDCT)后的重现函数 f(x,y)=1/8,是个常 数值,所以将 F(0,0) 称为直流(DC)系数;当 u,v≠0 时,正变换后的系数为 F(u,v)=0,则反变换后的重现函数 f(x,y) 不是常数,此时 正变换后的系数 F(u,v) 为交流(AC)系数。
  DCT 后的64个 DCT 频率系数与 DCT 前的64个像素块相对应,DCT 过程的前后都是64个点,说明这个过程只是一个没有压缩作用的无损变换过程。
  单独一个图像的全部 DCT 系数块的频谱几乎都集中在最左上角的系数块中。
  DCT 输出的频率系数矩阵最左上角的直流 (DC)系数幅度最大,图中为-415;以 DC 系数为出发点向下、向右的其它 DCT 系数,离 DC 分量越远,频率越高,幅度值越小,图中最右下角为2,即图像信息的大部分集中于直流系数及其附近的低频频谱上,离 DC 系数越来越远的高频频谱几乎不含图像信息,甚至于只含杂波。
  DCT 本身虽然没有压缩作用,却为以后压缩时的"取"、"舍" 奠定了必不可少的基础。
4、量化
  量化过程实际上就是对 DCT 系数的一个优化过程。它是利用了人眼对高频部分不敏感的特性来实现数据的大幅简化。
  量化过程实际上是简单地把频率领域上每个成份,除以一个对于该成份的常数,且接着四舍五入取最接近的整数。
  这是整个过程中的主要有损运算。
以这个结果来说,经常会把很多高频率的成份四舍五入而接近0,且剩下很多会变成小的正或负数。
  整个量化的目的是减小非“0”系数的幅度以及增加“0”值系数的数目。
  量化是图像质量下降的最主要原因。
  因为人眼对亮度信号比对色差信号更敏感,因此使用了两种量化表:亮度量化值和色差量化值。

使用这个量化矩阵与前面所得到的 DCT 系数矩阵:

如,使用?415(DC系数)且四舍五入得到最接近的整数

总体上来说,DCT 变换实际是空间域的低通滤波器。对 Y 分量采用细量化,对 UV 采用粗量化。
  量化表是控制 JPEG 压缩比的关键,这个步骤除掉了一些高频量;另一个重要原因是所有图片的点与点之间会有一个色彩过渡的过程,大量的图像信息被包含在低频率中,经过量化处理后,在高频率段,将出现大量连续的零。
  5、“Z”字形编排
  量化后的数据,有一个很大的特点,就是直流分量相对于交流分量来说要大,而且交流分量中含有大量的0。这样,对这个量化后的数据如何来进行简化,从而再更大程度地进行压缩呢。
这就出现了“Z”字形编排,如图:

对于前面量化的系数所作的 “Z”字形编排结果就是:
  底部 ?26,?3,0,?3,?3,?6,2,?4,1 ?4,1,1,5,1,2,?1,1,?1,2,0,0,0,0,0,?1,?1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 顶部
  这样做的特点就是会连续出现多个0,这样很有利于使用简单而直观的行程编码(RLE:Run Length Coding)对它们进行编码。
  8×8图像块经过 DCT 变换之后得到的 DC 直流系数有两个特点,一是系数的数值比较大,二是相邻8×8图像块的 DC 系数值变化不大。根据这个特点,JPEG 算法使用了差分脉冲调制编码(DPCM)技术,对相邻图像块之间量化 DC 系数的差值(Delta)进行编码。即充分利用相邻两图像块的特性,来再次简化数据。
  即上面的 DC 分量-26,需要单独处理。
  而对于其他63个元素采用zig-zag(“Z”字形)行程编码,以增加行程中连续0的个数。

转载于:https://www.cnblogs.com/wengzilin/archive/2013/05/26/3100027.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261638.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用git pull文件时和本地文件冲突怎么办?

Git常用命令 具体方法如下 git pull origin 分支//出现错误git stash 缓存起来git pull origin 分支git stash pop //还原git stash clear 开发人员常常遇到这种情况:花了几天时间一直在做一个新功能,已经改了差不多十几个文件,突然有一个bu…

C语言计算字符串的长度

一。循环实现 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int my_strlen(char *pstr) {int num 0;while (*pstr ! \0){num;pstr;}return num; } int main() {int count 0;char str[100] { 0 };printf("请输入一个字符串");scanf("%s"…

Android 目录

Android 移动平台概述 1 Android平台简介 2 Android平台所提供的功能 3 Android框架简介 4 Android SDK 简介:包括一系列ANDROID应用开发工具和文档&#xff0c;包括调试器&#xff0c;库文件集&#xff0c;手机设备模拟器&#xff0c;文档&#xff0c;范例和开发指导。 5 An…

安防硬件WIZnet基于全硬件TCP/IP的安防产品应用及方案

在本文中,我们主要介绍安防硬件的内容,自我感觉有个不错的建议和大家分享下 WIZnet立足于生产全硬件TCP/IP协议栈芯片&#xff0c;为单片机提供理想的处置计划。整体来讲&#xff0c;其应用领域还是非常广泛的&#xff0c;以智能电表为代表的Smart Energy&#xff1b;以数字楼宇…

在屏幕上将1234逐位打印出来1,2,3,4

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> void my_printf(int temp) {if (temp > 9)my_printf(temp / 10);printf("%d\n", (temp % 10)); } int main() {int num 0;printf("请输入一个数字:\n");scanf("%d", &num);…

联想将在CES上展示LePad平板

联想将在本周举行的CES展上展示其平板电脑LePad&#xff0c;迎战苹果的iPad和三星的Galaxy Tab。 联想曾经在去年的CES上展示了一款颇受瞩目的平板/笔记本混合型电脑IdeaPad U1&#xff0c;原计划在去年下半年推出&#xff0c;但因故推迟。LePad与U1平板并不相同&#xff0c;屏…

深入mysql慢查询设置的详解

深入mysql慢查询设置的详解在web开发中&#xff0c;我们经常会写出一些SQL语句&#xff0c;一条糟糕的SQL语句可能让你的整个程序都非常慢&#xff0c;超过10秒一般用户就会选择关闭网页&#xff0c;如何优化SQL语句将那些运行时间 比较长的SQL语句找出呢&#xff1f;MySQL给我…

编辑为什么建议转投_编辑回信解读 —“建议转投子刊”实例

​在给期刊投稿之后&#xff0c;首先是通过编辑审阅的&#xff0c;如果编辑这关过了才会把手稿分发给审稿人&#xff0c;进行审稿。编辑这关&#xff1a;(1)主要是对手稿的研究方向是否符合本期刊的定位&#xff1b;(2)格式、篇幅、排版等是否有重大错误或不符合期刊要求&#…

SetProcessWorkingSetSize 函数的骗局

SetProcessWorkingSetSize函数的骗局 本文引用自&#xff1a;http://hi.baidu.com/jenson138/item/e64e7e453c5b28e21381da9c 我实在不愿意提起这个话题.后来在网上看到几篇文章,深深感觉到,已经有程序员站出来,揭穿这个忽悠了千百万用户的诡计了...附2篇文章的地址:http://blo…

iframe实现页面无刷新上传文件(PHP)----备忘

之前做一个文件上传的&#xff0c;由于那段时间写ajax比较多&#xff0c;所以就想利用Ajax来实现&#xff0c;后来发现&#xff0c;Ajax没法实现文件上传&#xff0c; 后来百度之&#xff0c;这里做个备忘。 提示&#xff1a;利用form表单的target属性和iframe 一、上传文件的一…

native react 常用指令_React Native入门基础篇(一)

学习一次&#xff0c;随处书写。(以下文字来自各大网上资料整理而来&#xff0c;侵删&#xff01;)概述使用React为Android和iOS创建本机应用React Native将本机开发的最佳部分与React(用于构建用户界面的一流JavaScript库)结合在一起。 少用或多用。您现在可以在现有的Android…

C语言交换两个数(不创建临时变量)

方法一.加减法 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() {int a 10;int b 20;//加减法a a b;b a - b;//b原来的aa a - b;//a原来的b//缺点&#xff1a;若a、b为较大的数会溢出printf("%d %d", a, b);return 0; }二.异或法 #de…

zoj 3511 Cake Robbery(线段树)

题目链接&#xff1a;zoj 3511 Cake Robbery 题目大意&#xff1a;就是有一个N边形的蛋糕。切M刀&#xff0c;从中挑选一块边数最多的。保证没有两条边重叠。 解题思路&#xff1a;有多少个顶点即为有多少条边&#xff0c;所以直接依照切刀切掉点的个数排序&#xff0c;然后用线…

在Android命令行启动程序的方法

在Android中&#xff0c;除了从界面上启动程序之外&#xff0c;还可以从命令行启动程序&#xff0c;使用的是命令行工具am.启动的方法为 # am start -n 包(package)名/包名.活动(activity)名称 启动的方法可以从每个应用的AndroidManifest.xml的文件中得到&#xff0c;以计算器…

IIS 6.0支持.SHTML

许多网站为了做seo优化&#xff0c;都把页面做成静态页面&#xff0c;方便搜索引擎的抓取&#xff0c;许多静态页面都是做成shtl页面的&#xff0c;这样做的好处是shtml页面可以包含html和htm文件&#xff01; 下面讲解下iis配置方法&#xff0c;让iis支持shtml页面方法如下&am…

python每隔半个小时执行一次_一篇文章教你用Python抓取微博评论

【Part1——理论篇】试想一个问题&#xff0c;如果我们要抓取某个微博大V微博的评论数据&#xff0c;应该怎么实现呢&#xff1f;最简单的做法就是找到微博评论数据接口&#xff0c;然后通过改变参数来获取最新数据并保存。首先从微博api寻找抓取评论的接口&#xff0c;如下图所…

eclipse导入class文件

右键src文件夹-》build path-》config build path-》library-》add class folder-》create new folder&#xff0c;此时在工程中会出现Referenced Librarier,在其中包含了你的新文件夹&#xff0c;同时在其下面出现了你的新文件夹&#xff0c;这时右键你的新文件夹-》import-》…

统计一个数的补码中二进制中1的个数

方法一&#xff1a; #include<stdio.h>int count_one_bit(int n){int count 0;while (n){if (n % 2 1){count;}n n / 2;}return count; } int main() {int num 0;int count 0;scanf("%d", &num);countcount_one_bit(num);printf("%d\n", c…

Oracle 随机获取N条数据

Oracle 随机获取N条数据 当我们获取数据时,可能会有这样的需求,即每次从表中获取数据时,是随机获取一定的记录,而不是每次都获取一样的数据,这时我们可以采取Oracle内部一些函数,来达到这样的目的1) select * from (select * from tablename order by sys_guid()) where row…