首页 > 其他分享 >JPEG编码协议--DCT变换

JPEG编码协议--DCT变换

时间:2023-06-13 23:35:25浏览次数:49  
标签:编码 分块 -- JPEG 变换 二维 图像 DCT

      从之前的几篇文章介绍可以看出,JPEG编码最重要的一步就是DCT变换,将空域的图像信号转换到频域,达到良好的去空间相关性的性能,DCT变换本身是无损的。因此DCT变换在图像编码领域被广泛应用。

一、一维DCT变换

      在JPEG编码中使用了二维DCT变换,一维DCT是二维的基础,我们先看下一维DCT变换。一维DCT变换共有8种形式,其中最常用的是第二种形式,由于其运算简单、适用范围广。我们在这里只讨论这种形式,其表达式如下:

    

    其中,f(i)为原始的信号,F(u)是DCT变换后的系数,N为原始信号的点数,c(u)可以认为是一个补偿系数,可以使DCT变换矩阵为正交矩阵。对应的逆DCT变换公式为:

 

二、二维DCT变换

    二维DCT变换其实是在一维DCT变换的基础上再做了一次DCT变换,其公式如下:

 

    由公式我们可以看出,上面只讨论了二维图像数据为方阵的情况,在实际应用中,如果不是方阵的数据一般都是补齐之后再做变换的,重构之后可以去掉补齐的部分,得到原始的图像信息,这个尝试一下,应该比较容易理解。

    如果原始信号是图像等相关性较大的数据的时候,我们可以发现在变换之后,系数较大的集中在左上角,而右下角的几乎都是0,其中左上角的是低频分量,右下角的是高频分量,低频系数体现的是图像中目标的轮廓和灰度分布特性,高频系数体现的是目标形状的细节信息。DCT变换之后,能量主要集中在低频分量处,这也是DCT变换去相关性的一个体现。

      之后在量化和编码阶段,我们可以采用“Z”字形编码,这样就可以得到大量的连续的0,这大大简化了编码的过程。

 三、二维DCT反变换

     在图像的接收端,根据DCT变化的可逆性,我们可以通过二维DCT反变换恢复出原始的图像信息,其公式如下:

 四、分块DCT变换

    在实际的图像处理中,DCT变换的复杂度其实是比较高的,所以通常的做法是,将图像进行分块,然后在每一块中对图像进行DCT变换和反变换,在合并分块,从而提升变换的效率。具体的分块过程中,随着子块的变大,算法复杂度急速上升,但是采用较大的分块会明显减少图像分块效应,所以,这里面需要做一个折中,在JPEG编码中,采用8*8的分块。

 

标签:编码,分块,--,JPEG,变换,二维,图像,DCT
From: https://www.cnblogs.com/hankgo/p/17478981.html

相关文章

  • 碎碎念-如何当好销售
    刚开始看代码,甚至还没有进环境。下午加的女生就和我开始较劲。她的观点是,学历没用,知识有用,所以不报学历提升。我的观点是,学历是没用,知识也没用,但是得有学历这东西呀,将来有机会的时候可以把握住。(背景,她,03年,初中毕业,混社会5,6年,她说她这个月目标销售额20w,一个月好的时候7,8k,一般......
  • 面向对象编程和内置模块
    task11classAccount:23def__init__(self,name,account_number,initial_amount=10):4self._name=name5self._card_no=account_number6self._blance=initial_amount78defdeposit(self,amount):9......
  • 实验7 面向对象编程与内置模块
    实验任务1task1.py1classAccount:23def__init__(self,name,account_number,initial_amount=10):4self._name=name5self._card_no=account_number6self._balance=initial_amount7defdeposit(self,amount):......
  • 车辆碰撞程序
    车辆碰撞程序总体概述简单介绍车辆在发生对应的异常情况时,产生事件数据,实时程序消费通过OGG推送至Kafka的数据进行事件判断,并将消息通过Rabbit推送至业务端。碰撞告警:车辆发生碰撞事件并有气囊、车胎、翻滚等状态。低等级碰撞告警:车辆发生轻微碰撞,产生低等级碰撞计数故障......
  • 再也不用担心变量类型错误!学会JS中如何轻松检查变量类型
    今天要分享的问题就是:如何在JS中检查一个变量的类型?先上结论:如果判断的是基本数据类型或JavaScript内置对象,使用toString;如果要判断的是自定义类型,请使用instanceof。在ECMAScript规范中,共定义了7种数据类型,分为基本类型和引用类型两大类。基本类型也称为简单类型,按......
  • C++面试八股文:C++中,函数的参数应该传值还是传引用?
    C++面试八股文:C++中,函数的参数应该传值还是传引用?某日二师兄参加XXX科技公司的C++工程师开发岗位第8面:面试官:C++中,函数的参数应该传值还是传引用?二师兄:要看参数的用途。如果是出参,必须传引用。如果是入参,主要考虑参数类型的大小,来决定传值还是传引用。面试官:为什么不使用......
  • C++面试八股文:什么是RAII?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第13面:面试官:什么是RAII?二师兄:RAII是ResourceAcquisitionIsInitialization的缩写。翻译成中文是资源获取即初始化。面试官:RAII有什么特点和优势?二师兄:主要的特点是,在对象初始化时获取资源,在对象析构时释放资源。这种技术可以......
  • 003、let、const、var(02\008)
    1、let用于声明变量(块范围) 2、const用于声明常量(创建一个无法重新分配的变量)3、var用于声明变量(旧的实际不怎么使用了)函数范围 ......
  • 异常
    异常概述就是程序出现了不正常的情况。程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。注意:语法错误不算在异常体系中。Error:严重问题,通过代码无法处理。比如:内存溢出。Exception:称为异常类,它表示程序本身可以处理的问题。RuntimeException及其子类:运......
  • 【基础算法】单链表的OJ练习(2) # 链表的中间结点 # 链表中倒数第k个结点 #
    前言对于单链表的OJ练习,<fontcolor=bluesize=4>需要深刻理解做题的思路</font>,这样我们才能够在任何场景都能够熟练的解答有关链表的问题。关于OJ练习(1):==->==传送门==<-==,其题目较为简单,思路也好理解,本章与(1)差不多,难度不大,<fontcolor=orangesize=4>核心点就在于理解解......