图像压缩与图像处理_数字图像处理的图像压缩 - CSDN
  • 1

    1.霍夫曼编码

    霍夫曼编码的基本思想:输入一个待编码的串,首先统计串中各字符出现的次数,称之为频次,假设统计频次的数组为count[],则霍夫曼编码每次找出count数组中的值最小的两个分别作为左右孩子,建立他们的父节点,循环这个操作2*n-1-nn是不同的字符数)次,这样就把霍夫曼树建好了。然后根据霍夫曼树分配二值编码0,1,即可得到唯一的编码序列。

    霍夫曼编码本身是一种瞬时的,唯一可解码的块编码。即每个字符都映射到了固定的序列,查表即可解码。JPEGMPEG标准都规定了默认的霍夫曼编码表。

    2.Golomb编码

    假设对正整数 x(本身该编码方法就是针对非负行程提出来的)进行 Golomb编码,选择参数 m,令b = 2^mq = INT((x - 1)/b)r = x - qb - 1,则 x可以被编码为两部分(Gb(x)),第一部分是由 q 1后面跟1 0组成的x/b的商的一元编码(即整数q的一元编码定义),第二部分为 m位二进制数,其值为 r。我们将 m = 0, 1, 2, 3时的 Golomb编码表列出:

    x       m =0      m = 1      m= 2      m = 3


    -------------------------------------------------------------


       1            0        00       000       0 000


       2           10        01       001       0 001


       3          110       100       010       0 010


       4         1110       101       011       0 011


       5        11110      1100      1000       0 100


       6       111110      1101      1001       0 101


       7      1111110     11100      1010       0 110


       8     11111110     11101      1011       0 111


        9    111111110    111100      110 00      10000


    从表中我们可以看出,Golomb编码不但符合前缀编码的规律,而且可以用较少的位表示较小的 x值,而用较长的位表示较大的 x值。这样,如果 x的取值倾向于比较小的数值时,Golomb编码就可以有效地节省空间。当然,根据 x的分布规律不同,我们可以选取不同的 m值以达到最好的压缩效果。这种编码方法很少用于灰度,而是用于相邻的灰度差编码。指数Golomb编码对行程编码很有用,无论长行程,还是短行程。

    3.算数编码

     算术编码与霍夫曼编码方法相似,都是利用比较短的代码取代图像数据中出现比较频繁的数据,而利用比较长的代码取代图像数据中使用频率比较低的数据从而达到数据压缩的目的。其基本思想是将被编码的数据序列表示成01之间的一个间隔(也就是一个小数范围),该间隔的位置与输入数据的概率分布有关。信息越长,表示间隔就越小,因而表示这一间隔所需的二进制位数就越多(由于间隔是用小数表示的)。算术压缩算法中两个基本的要素为源数据出现的频率以及其对应的编码区间。其中,源数据的出现频率、编码区间则决定算术编码算法最终的输出数据。JPEG

    4.LZW编码

    1~3的编码方法几种消除编码冗余,LZW编码集中消除空间冗余。

    LZWLempel-Ziv-WelchEncoding)编码原理是将每一个字节的值都要与下一个字节的值配成一个字符对,并为每个字符对设定一个代码。当同样的一个字符对再度出现时,就用代号代替这一字符对,然后再以这个代号与下个字符配对。LZW编码原理的一个重要特征是,代码不仅仅能取代一串同值的数据,也能够代替一串不同值的数据。在图像数据中若有某些不同值的数据经常重复出现,也能找到一个代号来取代这些数据串。在此方面,LZW压缩原理是优于RLE的。该编码技术已经被引入GIF,TIFF,PDF.

    5.行程编码

    行程编码又称RLE压缩方法,其中RLERun-Length-Encoding的缩写,这种缩写方法广泛用于各种图像格式的数据压缩处理中,是最简单的压缩图像方法之一。它主要用于二值图像压缩。

    行程编码技术是在给定的图像数据中寻找连续重复的数值,然后用两个字符值取代这些连续值。例如,有一串字母表示的数据为“aaabbbbccccdddedddaa”经过行程编码处理可表示为“3a4b4c3d1e3d2a”。这种方法在处理包含大量重复信息的数据时可以获得很好的压缩效率。但是如果连续重复的数据很少,则难获得较好的压缩比。而且甚至可能会导致压缩后的编码字节数大于处理前的图像字节数。所以行程编码的压缩效率与图像数据的分布情况密切相关。

    6.基于符号的编码

    这种编码的思想是,把图像中的子图像作为一个单元,存储其位置和索引,一旦重复出现该子图像,则用索引表示。同时子图像内部,也可以用算数编码或者霍夫曼编码压缩。

    JBIG2压缩中对正文,采用该方法。

    因此,该方法针对二级图像压缩。

    7.比特平面编码

    将图像分解成比特平面,对每个平面的二值图像,采用几种熟知的二值编码方法。该方法针对多级图像压缩。

    8.块变换编码

    该方法把图像分成大小相等且不重叠的小块,利用二维线性可逆变换把每个块或子图像映射为变换系数集合,然后对这些变换系数进行量化和编码。预测编码认为冗余度是数据固有的,通过对信源建模来尽可能精确地预测源数据,去除图像的时间冗余度。但是冗余度有时与不同的表达方法也有很大的关系,变换编码是将原始数据变换到另一个更为紧凑的表示空间,去除图像的空间冗余度,可得到比预测编码更高的数据压缩。

    变换编码是将图像时域信号变换到系数空间(频域)上进行处理的方法。在时域空间上具有很强相关的信息,在频域上反映出在某些特定的区域内能量常常被集中在一起或者是系数矩阵的分布具有某些规律,从而可以利用这些规律分配频域上的量化比特数而达到压缩的目的。变换编码的目的在于去掉帧内或帧间图像内容的相关性,它对变换后的系数进行编码,而不是对图像的原始像素进行编码。

    先对信号进行某种函数变换,从一种信号(空间)变换到另一信号(空间)然后再对变换后的信号进行编码。比如将时城信号变换到频域,就是因为声音和图像的大部分信号都是低频信号,在频域中信号能比较集中,换为频域信号后再进行采样、编码,可以达到压缩数据的效果。可以看出预测编码和变换编码相比:预测编码主要在时空域上进行,变换编码则主要在变换域上进行。采用变换编码的有DEF(傅立叶变换)、DTC(离散余弦变换等)。

    WHT,正反变换核相同,计算简单,DCT,最常使用的,正反变换核相同。DCT携带信息的能力比WHTDFT要强。但最强的是KLT,但KLT依赖数据,也就是其与输入有关系,计算繁重。而与输入无关的非正弦变换(DFT ,DCT)最容易实现。DFT的块缺陷问题比较严重。JPEG就是用的DCT变换编码。

    9.预测编码

    预测编码方式是目前应用比较广泛的编码技术之一。预测编码中典型的压缩方法有脉冲编码调制(PCMPulse Code Modulation)、差分脉冲编码调制(DPCMDifferential Pulse Code Modulation)、自适应差分脉冲编码调制(ADPCMAdaptiveDifferential Pulse Code Modulation)等,它们较适合于声音、图像数据的压缩,因为这些数据由采样得到,相邻样值之间的差相差不会很大,可以用较少位来表示。通常,图像的相邻像素值具有较强的相关性,观察一个像素的相邻像素就可以得到关于该像素的大量信息。这种性质导致了预测编码技术。采用预测编码时,传输的不是图像的实际像素值(色度值或亮度值),而是实际像素和预测像素值之差,即预测误差。预测编码分为无失真预测编码和有失真预测编码。无失真预测编码是指对预测误差不进行量化,所以不会丢失任何信息。有失真编码要对预测误差进行量化处理,而量化必然要产生一定的误差。

    数字图像水印

     插入冗余信息。用作

    1.版权识别

    2.用户识别或指纹

    3.著作权认定

    4.自动监视

    5.复制保护


    


    


     


    

    展开全文
  • 第十四章 图象压缩 目录 1. 引言 2. 无损压缩 2.1 行程编码(RLE) 2.2 LZW编码 2.3 Huffman编码 3. 有损压缩 3.1 量化 3.2 预测编码 3.3DCT编码 3.4 其它变换编码 作业 ...

    第十四章 图象压缩

    目录

    1.   引言

    2.   无损压缩

    2.1 行程编码(RLE)

    2.2 LZW编码

    2.3 Huffman编码

    3.   有损压缩

    3.1 量化

    3.2 预测编码

    3.3DCT编码

    3.4 其它变换编码

    作业


    1.  引言

        图象压缩是通过删除图象数据中冗余的或者不必要的部分来减小图象数据量的技术,压缩过程就是编码过程,解压缩过程就是解码过程。压缩技术分为无损压缩和有损压缩,前者在解码时可以精确地恢复原图象,没有任何损失;后者在解码时只能近似原图象,不能无失真地恢复原图象。

    按照信息论,设有一个无记忆的信源,它产生消息的概率是已知的,记为,则信息量定义为:

    可见越是不可能出现的消息,它的出现对信息的贡献量越大:

    ·        一个消息出现的可能性越小,其信息量就越多;

    ·        而消息出现的可能性越大,其信息量就越少。

    :信源的平均信息量称为“熵”(entropy),即

    上式取以2为底的对数时,单位为比特(bits):

     

    根据Shannon(香农)无噪声编码定理,对于熵为H的信号源,对其进行无失真编码所可能达到的最低比特数为,这里为一任意小的正数,因此可能达到的最大压缩比为:

    其中B是原始图象的平均比特率,且定义压缩比为:

     

    2.无损压缩

        无损压缩是一般的数据压缩方法,适用于普通的数据文件(不必是图象),有基于码表的技术和基于统计的技术两类。基于码表的技术生成的文件包含的是定长码(通常是12至16位),每个码代表原文件中数据的一个特定序列。基于统计的技术通过用较短的代码代表频繁出现的字符,用较长的代码代表不常出现的字符,从而实现数据压缩。无损的图象压缩方法通常只能获得1~5倍的压缩率。

    2.1 行程编码(RLE)

        在一个逐行存储的图象中,具有相同灰度值的一些象素组成的序列称为一个行程。在编码时,对于每个行程只存储一个灰度值的码,再紧跟着存储这个行程的长度。这种按照行程进行的编码被称为行程编码(Run Length Encoding)。

        行程编码对于仅包含很少几个灰度级的图像,特别是二值图象,比较有效。

    参见:Design of Utach RLE Format

    2.2 LZW编码

        LZW编码是由Lemple和Ziv提出并经Welch扩充而形成的无损压缩专利技术。在对文件进行编码时,需要生成特定字符序列的表以及对应的代码。每当表中没有的字符串出现时,就把它与其代码一道存储起来。这以后当该串再次出现时,只存储其代码。实际上,字符串表是在压缩过程中动态生成的,而且由于解压缩算法可以从压缩文件中重构字符串表,因而字符串表也不必存储。

    参见:LZW compression(..\Readings\chapter14\lzw.htm)

    LZW expression(..\Readings\chapter14\lzwexp.htm)

    2.3 Huffman编码

        Huffman编码是50年代提出的一种基于统计的无损编码方法,它利用变长的码来使冗余量达到最小。通过一个二叉树来编码,使常出现的字符用较短的码代表,不常出现的字符用较长的码代表。静态Huffman编码使用一棵依据字符出现的概率事先生成好的编码树进行编码。而动态Huffman编码需要在编码的过程中建立编码树。

        由于Huffman编码所得到的平均码字长度可以接近信源的熵,因此在变长编码中是最佳的编码方法,故也称为熵编码。

    `Huffman算法

    1.   对L个符号按其概率值P递减顺序排列,并作为一棵树的叶结点

    2.   如果没有到根结点则

    (1) 把两个概率值最小的结点合并成一个新结点并赋予其概率为两子结点概率之和;

    (2) 对新结点到两个子结点的树枝分别赋值1和0

    3.   从根结点开始到叶结点,将树枝上的值按顺序组成二进制值,则为该叶结点上符号的Huffman码字。

    例如,

    ·        这种编码方法形成的码字是可辨别的,即一个码字不能成为另一码字的前缀

    ·        Huffman编码对不同的信源其编码效率不同,适合于对概率分布不均匀的信源编码。

    3. 有损压缩

    为了获得较高的压缩比,常见的图象压缩算法,如变换编码压缩算法,涉及量化过程,因而都是有损的压缩算法,通常的压缩率范围为3~50。

    3.1量化

        将图象用较少的灰度级别来表示是最简单的减小数据量的方法,这种方法就是标量量化方法。更一般的情况是,针对连续量的采样过程,量化是用有限个状态来表示连续值。标量量化器Q(.)是一个函数,用有限个判决层和重构层定义而成:

     
     

    当采样值s在范围内时,量化器的输出就是重构层

        矢量量化可定义成用有限个矢量状态表示一组矢量,每个矢量是一些连续值的采样。在图象压缩中,标量量化和矢量量化通常用于变换域内的图象表示。

    3.2预测编码

    预测编码根据数据在时间和空间上的相关性,根据统计模型利用已有样本对新样本进行预测,将样本的实际值与其预测值相减得到误差值,再对误差值进行编码。由于通常误差值比样本值小得多,因而可以达到数据压缩的效果。

    模拟量到数字量的转换过程是脉冲编码调制过程PCM (pulsecode modulation),也称PCM编码。对于图象而言,直接以PCM编码,存储量很大。预测编码可以利用相邻象素之间的相关性,用前面已出现的象素值估计当前象素值,对实际值与估计值的差值进行编码。常用的一种线性预测编码方法是差分脉冲编码调制DPCM (differential pulse code modulation)。

    线性预测形式如下:

     
     

    最佳线性预测选择系数使均方误差最小:

     
     

    最优解是如下方程的解:

     
     

    3.3 DCT编码

    由于DCT变换与KL变换(KL变换完全消除了数据的相关性,是最佳的正交变换,因而也是理论上最优的压缩变换方法)最为接近(参见第十一章),DCT变换是图象压缩标准中常用的变换方法,如JPEG标准中将图象按照8x8分块利用DCT变换编码实现压缩。

     

    详见:The JPEG Still Picture CompressionStandard(..\Readings\chapter14\jpg.pdf)

    Lena.bmp(原图)

     Lenna.jpg (压缩率9.2)

     Lenna.jpg (压缩率18.4)

     Lenna.jpg (压缩率51.6)

     3.4 其它变换编码

        变换方法是实现图象数据压缩的主要手段,其基本原理是首先通过变换将图象数据投影到另一特征空间,降低数据的相关性,使有效数据集中分布;再采用量化方法离散化,最后通过Huffman等无损压缩编码进一步压缩数据的存储量。3.3节的DCT是一种常用的变换域压缩方法,是JPEG,MPEGI-II等图象及视频信号压缩标准的算法基础。在实际采用DCT编码时,需要分块处理,各块单独变换编码,整体图象编码后再解压会出现块状人工效应,特别是当压缩比较大时非常明显,使图象失真。因此,为了获得更高的图象压缩比,人们提出了一些其它方法,如基于小波变换的图象压缩算法和基于分形的图象压缩算法等。

        基于小波变换的图象压缩算法首先使用某种小波基函数将图象做小波变换,再根据四个通道的不同情况,分别量化编码,比如对低频频段(LL)采用较多的量化级别,而对中间频段(LH,RH)采用较少量化级别,对高频频段(HH)采用很少几个量化级别,这样根据重构时对复原信号的重要程度分别对待的方式可以有效地提高压缩比而又不产生明显的失真。由于小波变换不使用DCT变换方法中的固定大小的块分别编码的处理方法,而是通过整体的多级(通常用3-5个级别)变换方法实现,没有块状效应。小波变换可以获得10-50倍的压缩比而没有明显的失真。小波变换在静态图象压缩中的作用已经得到公认,为JPEG2000标准所采纳。

     基于分形的图象压缩算法利用图象中的自相似性根据分形算法压缩图象,对一些典型图象如自然景物等在理论上可以获得非常高的压缩比,在实践中,由于存在着如何定义及度量自相似性等困难,目前还很难自动地获得不同分辨率下的有效的自相似性描述,一般需要针对具体图片进行人工干预,以便获得最佳的效果。因而作为一种通用图象压缩工具还有待研究。现在的分形压缩算法,需要按块为单位处理,通过迭代优化方法实现,比较复杂。目前有些系统性的研究[5],但还缺乏稳定的性能保障,没有被广泛采用。

    参考文献

    1.   钟玉琢,多媒体技术,(高级),清华大学出版社,1999。

    2.   P.K. Andleigh, K. Thakrar (徐光佑、史元春译), 多媒体系统设计,Prentice Hall, 1998.

    3.   Borko Furht, Stephen W.Smoliar, HongJiang Zhang, Video and image processing in multimedia systems,Kluwer Academic Publishers, Boston ,1995.

    4.   Vasudev Bhaskaran, KonstantinosKonstantinides, Image and video compression standards: algorithms andarchitectures, Kluwer Academic Publishers, Boston, 1995.

    5.   Ning Lu, Fractal imaging,Academic Press, San Diego,1997

    6.   张春田,苏育挺,张静,数字图象压缩编码,清华大学出版社, 2006.1

    作业

    1.   阅读有关Jpeg压缩标准的相关文献,利用Jpeg的C源码在MS-VC6环境下实现图象的压缩存储(bmp转成jpeg)。

    2.   编制利用小波变换实现图象压缩的程序。


    返回主目录 返回本章目录

    清华大学计算机系 艾海舟

    最近修改时间:2001年7月19日


    出处:http://media.cs.tsinghua.edu.cn/~ahz/digitalimageprocess/CourseImageProcess.html

    展开全文
  • 图像压缩是指:减少给定信息量所需数据量的处理。包含不相关或者重复信息的表示为冗余数据。  二维灰度主要受下面三种主要类型的数据冗余影响: ①编码冗余:编码用于表示信息实体或者事件集合的符号系统。每个...

    前沿

    图像压缩是减一图图像所需数据量的计数及科学。图像压缩是指:减少给定信息量所需数据量的处理。包含不相关或者重复信息的表示为冗余数据。 
    二维灰度主要受下面三种主要类型的数据冗余影响:
    ①编码冗余:编码用于表示信息实体或者事件集合的符号系统。每个信息或者事件赋予一个编码序列,称之为码字。每个码字中符号数量就是码字的长度。在多数的二维灰度图像中,用于表示灰度的8比特编码所包含的比特数要比表示该灰度所需要的比特数多。
    ②空间和时间冗余:因为多数二维灰度阵列的像素是空间的(即每一个像素类似于或取决于相邻像素),在相关像素表示中,信息没有必要重复。
    ③不相关冗余:多数二维阵列中包含一些被人们视觉系统忽略或者无用的信息。它是冗余的。

    图像信息量度

     信息熵是用来衡量一个随机变量出现的期望值,一个变量的信息熵越大,那么他出现的各种情况也就越多,也就是包含的内容多,我们要描述他就需要付出更多的表达才可以,也就是需要更多的信息才能确定这个变量。信息熵衡量了一个系统的复杂度,比如当我们想要比较两门课哪个更复杂的时候,信息熵就可以为我们作定量的比较,信息熵大的就说明那门课的信息量大,更加复杂。一个具有概率 P(E) 的随机事件 E 可以说成 包含 I(E) 单位的信息。 

    如果 P(E) = 1 (即事件总会发生), I(E) =0。并认为它没有信息。因为该事件没有不确定性,所以该事件发生通信过程中不会传递任何信息。
    上式中,信息的底决定了度量信息所用的单位。如果用 m 为底为对数,则这种度量称为 m 元单位。如果 底 是 2 ,则信息单位是比特。如果 P(E)=1/2,那么 
    I(E) =-log2(1/2) 比特。也就是说,当两个出现概率相等的事件之一发生时,传达的信息是 1 比特。
    从一个简单的可能时间的集合 {a1,a2,a3....aJ},给定一个独立统计的信源,与该集合相联系的概率为 {p(a1),p(a2),....,p(aJ)},满足:

    信源输出的平均信息称为该信源的熵(信源的不确定性):


    它定义了观察单个信源输出得到的平均信息量。

    编码冗余

    对于离散图像,可以假定一个离散随机变量  rk  表示图像的灰度级,并且每个 rk 出现的概率为 Pr( r)

    L:图像的灰度级
    n:图像的像素总数
    nk:第 k 个灰度级出现的次数
    如果用于表示每个  rk  值的比特数为 l( r),则表达每个像素所需的平均比特数为:

    也就是说,将表示每个灰度级值所用的比特数和灰度级出现的概率相等,将所得乘积相加后得到不同的灰度值的平均码字长度。根据无失真编码定理,如果某种编码的平均比特数越接近于熵,则编码冗余越少。
    例子:变长编码

    rk :归一化的像素值
    计算原图的熵:
    H =-(0.19*log2(0.19+0.25*log2(0.25)+0.21*log2(0.21)+0.16*log2(0.16)+0.08*log2(0.08)+0.06*log2(0.06)+0.06*log2(0.06)+0.03*log2(0.03)+0.02*log2(0.02))=
    2.558
    采用自然二进制编码:Lavg = 3*1= 3
    采用 code2 编码,平均比特数就为: Lavg = 2*0.19+2*0.25+2*0.21+3*0.16+4*0.08+5*0.06+6*0.03+6*0.02 =2.7
    实现压缩基本原理


    概率比较大的rk 分配比较短的编码长度,概率比较小的rk 分配比较长的编码长度,























    展开全文
  • 图像压缩哪家强图像压缩在计算机视觉领域占据着比较重要的位置,随着 GAN,VAE 和超分辨率图像...论文引入图像压缩一直是图像处理领域的一个基础和重要的研究课题。传统的图像压缩算法,如 JPEG,JPEG2000 和 BPG,...

    图像压缩哪家强



    图像压缩在计算机视觉领域占据着比较重要的位置,随着 GAN,VAE 和超分辨率图像让生成模型得到了很大的进步。不同的模型有着不同的性能优势,本文用精炼的语言加上较为严谨的实验对比了 GAN,CAE 和 super-resolution 在图像压缩性能上的优势


    论文引入


    图像压缩一直是图像处理领域的一个基础和重要的研究课题。传统的图像压缩算法,如 JPEG,JPEG2000 和 BPG,依赖于手工制作的编码器。深度学习方法的发展提高了图像压缩的性能,其中比较有突破的图像压缩是在 Autoencoder,GAN 和超分辨率方面。


    这篇论文提出了三种架构,分别使用卷积自动编码器(CAE),GAN 和超分辨率(SR)进行有损图像压缩。此外,还对它们的编码性能并进行了全面的比较。 


    实验结果表明,由于 Autoencoder 可以紧凑表示特性,CAE 可以实现比 JPEG 更高的编码效率;GAN 显示出在大压缩比和高主观质量重建方面的潜在优势;超分辨率在三种方法中实现了最佳的速率失真(RD)性能。 


    总结一下论文的贡献: 


    • 基于 CAE,GAN,SR 提出了三种整体压缩体系结构 

    • 对这三种框架做了全面的性能比较


    CAE用于图像压缩


    文中将图像压缩中的 DCT 和小波变换换成了 CAE(卷积自编码器),整体架构如下图所示:




    上图比较符合传统的图像压缩的流程,不过主要的框架是在 CAE 的基础上建立的。连续的下采样操作会破坏重建图像的质量,所以 Autoencoder 采用卷积滤波器执行上下采样,CAE 的内部结构如下图:




    内部卷积层之后的激活函数采用的是参数整流线性单元(PReLU)函数,而不是相关工作中常用的 ReLU,因为我们发现 PReLU 可以与 ReLU 相比时,提高了重建图像的质量,尤其是在高比特率。整体的损失函数定义为:






    GAN用于图像压缩


    我们都知道 GAN 多用于图像的生成,图像的压缩也需要在 GAN 的基础上做一些小小的改变,那就是在生成器前面加上一个编码器,这样就可以把图像 encode 到适合 G 生成即可,这个编码器的结构和判别器类似,GAN 做图像压缩的整体框架如下:




    这个模型框架结构很清晰,不需要太多的解释,判别器可以提高输出图像的真实性,损失函数为:




    这里只写非对抗损失函数部分,对抗损失函数和原始 GAN 是一致的。JG(x) 包含两部分,前半部分是 MSE 损失,后半部分是减小特征层的损失可有利于图像的高质量重建。


    基于 GAN 的体系结构与基于 CAE 的体系结构在图像压缩中有三个不同之处。首先,直接输入 RGB 分量,因此不应用从 RGB 到 YCbCr 的色彩空间转换;其次,不在训练过程中添加统一的噪音,因为 GAN 会从噪音中继承重建图像。第三,使用范围编码器,而不是 JPEG2000 熵编码器。


    SR用于图像压缩


    超分辨率压缩结构如下图所示:




    对于具有复杂纹理或小分辨率的图像,SR 将成为高质量重建的瓶颈。因此,在编码器中构建重建循环且为自适应策略,该循环计算仅由 SR 引起的失真,即上图中的 Pre PSNR。


    当 Pre PSNR 大于预定阈值时,图像被下采样到(0.5W,0.5H)并且在解码之后进行 SRCNN 滤波。否则,将图像下采样到(0.7W,0.7H),自适应策略的效果如下表。实验中阈值设置为 33.0 dB,并且选择约 30% 的图像以使用 SRCNN 滤波器。




    性能比较


    为了测量编码效率,通过每像素比特(bpp)来测量速率。PSNR(dB)和 MS-SSIM 分别用于测量客观和主观质量。


    CAE 


    由于 CAE 生成的特征图不是能量紧凑的,所以还要用 PCA 进一步去相关特征图。PCA 生成的特征映射和旋转特征映射的示例如下图所示。




    可以看到,在右下角生成了更多的零,在旋转的特征映射中,大值居中于左上角,这有利于熵编码器降低速率。与 JPEG2000 相比,基于 CAE 的方法优于 JPEG,并且在 Kodak 数据集图像上实现了 13.7% 的 BD 率减少。


    GAN


    GAN 的图像压缩在 CLIC 验证数据集上进行了性能比较实验:




    其中 bpp 越小越好,PSNR 越大越好,MS-SSIM 越大越好!可以看出 GAN 的一定优势。 


    对比结果 


    实验在 CLIC 验证数据集进行公平评估。具有 MS-SSIM 和 PSNR 的 RD 曲线如下图。超分辨率的 RD 曲线很短,因为它是通过用 BPG 编解码器中的固定量化参数(QP) 值改变自适应策略中的阈值来进行的。通过改变 QP,超分辨率还可以实现广泛的 RD 曲线。




    从 RD 曲线总结了几个观察结果:


    1. 由于自动编码器的固有特性,在有损压缩的情况下,CAE 优于 JPEG。自动编码器可以减少尺寸以从图像中提取压缩的演示文稿,因此 CAE 优于 JPEG 和 JPEG2000。


    2. GAN 在低比特率下比在高比特率下表现更好,因此 GAN 倾向于实现大的压缩比。同时,GAN 在 MS-SSIM 上的性能优于 PSNR,因为 GAN 的重建是基于图像数据的分布,肉眼更加认同。特别是对于 MS-SSIM,GAN 具有从 0.2bpp 到 0.8bpp 的稳定性能。


    3. SR 在这三种方法中实现了最佳性能,因为它具有新兴算法 BPG 和基于机器学习的超分辨率滤波器的优点。如果可以提供更多的计算资源,那么通过添加更好的超分辨率滤波器,可以预期有希望的结果将超过 BPG。


    下表是在速率约为 0.15bpp 的三种方法的比较:




    可以看出基于 SR 的方法与 BPG 非常接近,基于 GAN 和 CAE 的体系结构优于 JPEG,特别是 GAN 和 CAE 具有相似的 PSNR,但就相对主观的 MS-SSIM 而言,GAN 比 CAE 更好。

    总结


    论文提出了三种使用 CAE,GAN 和 SR 进行压缩的体系结构,并讨论了它们的性能。结果表明:


    • CAE 比传统的有限压缩变换更好,并且有望用作特征提取器;

    • GAN 显示出对大压缩比和主观质量重建的潜在优势;

    • 基于 SR 的压缩实现了其中最佳的编码性能。

    展开全文
  • 图像压缩就是减少表示数字图像时需要的数据量,是通过去除一个或三个基本数据冗余来得到的。主要有三类,分别是编码冗余、空间或/和时间冗余、不相干冗余。 图像数据的冗余主要表现为:图像中相邻像素间的...

    (一)概念

    图像压缩就是减少表示数字图像时需要的数据量,是通过去除一个或三个基本数据冗余来得到的。主要有三类,分别是编码冗余、空间或/和时间冗余、不相干冗余。

    • 图像数据的冗余主要表现为:图像中相邻像素间的相关性引起的空间冗余;图像序列中不同帧之间存在相关性引起的时间冗余;不同彩色平面或频谱带的相关性引起的频谱冗余。由于图像数据量的庞大,在存储、传输、处理时非常困难,因此图像数据的压缩就显得非常重要。

    • 图像压缩可以是有损数据压缩也可以是无损数据压缩。对于如绘制的技术图、图表或者漫画优先使用无损压缩,这是因为有损压缩方法,尤其是在低的位速条件下将会带来压缩失真。如医疗图像或者用于存档的扫描图像等这些有价值的内容的压缩也尽量选择无损压缩方法。有损方法非常适合于自然的图像,例如一些应用中图像的微小损失是可以接受的(有时是无法感知的),这样就可以大幅度地减小位速。(来自百度百科)

    • 通用的图像压缩系统如下图所示:主要是通过编码器和解码器组成。
      在这里插入图片描述
      获取图像压缩质量的好坏是通过计算其压缩比得到的,公式为:
      在这里插入图片描述
      在matlab中用函数imratio进行计算图像压缩后的压缩比:

    function cr = imratio(f1, f2)
    %IMRATIO Computes the ratio of the bytes in two images/variables.
    %   CR = IMRATIO(F1, F2) returns the ratio of the number of bytes in
    %   variables/files F1 and F2. If F1 and F2 are an original and
    %   compressed image, respectively, CR is the compression ratio. 
    
    %   Copyright 2002-2004 R. C. Gonzalez, R. E. Woods, & S. L. Eddins
    %   Digital Image Processing Using MATLAB, Prentice-Hall, 2004
    %   $Revision: 1.4 $  $Date: 2003/11/21 13:11:15 $
    
    error(nargchk(2, 2, nargin));         % Check input arguments
    cr = bytes(f1) / bytes(f2);           % Compute the ratio
    
    %-------------------------------------------------------------------%
    function b = bytes(f)  
    % Return the number of bytes in input f. If f is a string, assume
    % that it is an image filename; if not, it is an image variable.
    
    if ischar(f)
       info = dir(f);        b = info.bytes;
    elseif isstruct(f)
       % MATLAB's whos function reports an extra 124 bytes of memory
       % per structure field because of the way MATLAB stores
       % structures in memory.  Don't count this extra memory; instead,
       % add up the memory associated with each field.
       b = 0;
       fields = fieldnames(f);
       for k = 1:length(fields)
          b = b + bytes(f.(fields{k}));
       end
    else
       info = whos('f');     b = info.bytes;
    end
    

    调用这个函数:

    r = imratio(imread('C:\Users\Public\Pictures\Sample Pictures\cat.jpg'),'C:\Users\Public\Pictures\Sample Pictures\cat.jpg')
    

    在这里插入图片描述这就得到了图像的压缩比。

    (二)编码冗余

    说明:编码冗余就是当所用的码字大于最佳编码(也就是最小长度)时存在的冗余。还提到了熵的概念,查了资料得到:(entropy)指的是体系的混乱的程度,它在控制论、概率论、数论、天体物理、生命科学等领域都有重要应用,在不同的学科中也有引申出的更为具体的 定义,是各领域十分重要的参量。这里我们讨论的是图像处理中的熵,图像熵是一种特征的统计形式,它反映了图像中平均信息量的多少。

    图像熵数学公式为:
    在这里插入图片描述
    计算熵可以调用函数ntrop来处理:

    function h = ntrop(x,n)
    error(nargchk(1,2,nargin));
    if nargin < 2
        n = 256;
    end
    
    x = double(x);
    xh = hist(x(:),n);
    xh = xh /sum(xh(:));
    
    i = find(xh);
    h = -sum(xh(i)).*log2(xh(i));
    

    编写实验代码:

    f = [119 123 168 119;123 119 168 168];
    f = [f;119 119 107 119;107 107 119 119]
    p =hist(f(:),8);
    [p x]=hist(f(:),8),title('向量f的直方图显示')
    p = p/sum(p)  %直方图各个灰度级概率
    h = ntrop(f)
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    p是计算所获得的直方图概率
    在这里插入图片描述h就是所计算出的熵

    (1)霍夫曼码

    概念:哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)。通俗来说就是,信源符号出现频率越高,使用的码字就越少。 其过程可以用以下图来进行说明:
    在这里插入图片描述
    编码过程为:

    1. 对符号的概率进行排序,建立信源递减序列;
    2. 对每个约简的信源进行编码,从最小的信源开始,一直到原始信源。

    在matlab中用函数huffman进行霍夫曼编码,编写代码为:

    p = [0.1875 0.5 0.125 0.1875];
    c = huffman(p)
    celldisp(c)
    cellplot(c),title('逻辑单元的单元数组的图像描述')
    

    在这里插入图片描述
    以递归方式打印单位数组
    在这里插入图片描述
    在这里插入图片描述

    (2)霍夫曼编码

    霍夫曼码的产生不是压缩过程。为了实现成为霍夫曼码的压缩,对于产生码字的符号,不管它们的灰度级、行程长度,还是其他灰度映射操作的输出,都必须在生成码字一致的情况下被变换或映射。

    霍夫曼树─即最优二叉树,带权路径长度最小的二叉树,经常应用于数据压缩。 在计算机信息处理中,“霍夫曼编码”是一种一致性编码法(又称“熵编码法”),用于数据的无损耗压缩

    霍夫曼编码的原理: 霍夫曼方法的第一步是通过对所考虑符号的概率进行排序,并将具有最小概率的符号合并为一个符号来替代下次信源化简过程中的符号,从而创建一个简化信源系列。如下图所示那样,载最左边一组虚构的信源符号集合及它们的概率根据概率值的减少从上到下排列,为了形成第一次信源简化,底部的两个概率0.06和0.04进行合并,形成一个概率值为0.1的“复合符号”,这个复合符号及其对应的概率被置于第一个信源简化的列中,以便简化后的信源概率仍然按照其值从大到小进行排列,这个过程一直重复持续到信源只有两个符号的简化信源为止。

    在这里插入图片描述

    检验霍夫曼编码,用软进行实验16字节4×4图像的变长编码映射,编写实验代码:

    f2 = uint8([2 3 4 2;3 2 4 4;2 2 1 2;1 1 2 2])
    whos('f2')
    

    在这里插入图片描述
    在这里插入图片描述
    f2的每个像素都是8比特的字节,16字节表现整幅图像,由于f2的灰度不是等概率的,所以变长码字会减少表现图像所需要的存储量,用函数huffman计算码字:

    c= huffman(hist(double(f2(:)),4))
    

    在这里插入图片描述
    看出与前面的代码获得的码字一样,一般来说,对于任何一幅图像,只要其概率是p = [0.1875 0.5 0.125 0.1875],计算所得到的码字是一样的。

    将f2 二维数组 变换成h1f2 单元数组的转置紧凑显示,代码编写为:

    h1f2 = c(f2(:))'  %将f2中的元素按照c来查表
    whos('h1f2')
    

    在这里插入图片描述在这里插入图片描述
    看出其存储空间用了1850个字节,与书上的结果并不一样,是f2要求的存储量的110倍,由于这个存储量太大,要求减少其存储量的开销,因此换成h2f2 字符数组

    h2f2 = char(h1f2)'
    whos('h2f2')
    

    在这里插入图片描述
    在这里插入图片描述

    h2f2 = h2f2(:);
    h2f2(h2f2 == ' ') = [ ];
    whos('h2f2')
    

    在这里插入图片描述
    由于h2f2的存储空间还是比f2的存储大,因此还需要继续压缩,将编码像素打包成单字节

    h3f2 = mat2huff(f2)
    whos('h3f2')
    

    在这里插入图片描述
    在这里插入图片描述
    结果显示比h2f2的存储量还大,是因为有大部分开销的产生,但这些开销是可以忽略的,将上面的结果进行比率压缩后,得到的结果如下:

    hcode = h3f2.code;
    whos('hcode')
    dec2bin(double(hcode))
    

    在这里插入图片描述
    在这里插入图片描述
    这样就实现了霍夫曼编码压缩,其结果所用的存储量比f2初始的存储量小了很多,压缩比接近4:1。

    函数mat2huff进行霍夫曼编码,编写代码如下:

    f= imread('C:\Users\Public\Pictures\Sample Pictures\Fig0804(a).tif');
    f = im2double(f)
    c = mat2huff(f);
    cr1 = imratio(f,c)
    

    在这里插入图片描述

    save SqueezeFig0804(a) c;
    cr2 = imratio('C:\Users\Public\Pictures\Sample Pictures\Fig0309(a).tif','SqueezeFig0804(a).mat')
    

    'SqueezeFig0309(a).mat’是MAT-文件,是二进制数据文件,包括工作空间变量名和值。
    在这里插入图片描述
    对比上面的压缩比,看出是不同的,主要差别在matlab数据文件的开销。

    (3)霍夫曼译码

    经过霍夫曼编码再译码之后,才获得有用的图像,译码器必须计算用来编码x的霍夫曼码,再反映射已编码的数据来重建x,这是一种逆过程,但是缺少了反量化的步骤(这是不可逆转的一步),基本步骤为:

    1. 从输入结构y中提取维数m和n,以及最小值xmin(最后的输出x);
    2. 重建霍夫曼码,通过将它的直方图传递到huffman函数来对x进行编码。在列表中产生的编码将被map调用;
    3. 建立数据结构(转换和输出表link),以便在y.code中通过一系列有效的二进制搜索对编码数据解码;
    4. 传递数据结构和已编码数据(如link和y.code)到C函数unravel。这个函数最小化为执行二进制搜索要求的时间,产生已解码的double类的输出向量x;
    5. 把xmin添加到x的每个元素中,并加以改造以匹配原始x的维数(m行和n列)。

    函数huff2mat来解码是建立一系列的二进制搜素或两个结果解码决策。

    function x = huff2mat(y)
    
    if ~isstruct(y) | ~isfield(y, 'min') | ~isfield(y, 'size') | ...
           ~isfield(y, 'hist') | ~isfield(y, 'code')
       error('The input must be a structure as returned by MAT2HUFF.');
    end
    
    sz = double(y.size);   m = sz(1);   n = sz(2);
    xmin = double(y.min) - 32768;            % Get X minimum
    map = huffman(double(y.hist));           % Get Huffman code (cell)
    
    code = cellstr(char('', '0', '1'));     % Set starting conditions as
    link = [2; 0; 0];   left = [2 3];       % 3 nodes w/2 unprocessed
    found = 0;   tofind = length(map);      % Tracking variables
    
    while length(left) & (found < tofind)
       look = find(strcmp(map, code{left(1)}));    % Is string in map?
       if look                            % Yes
          link(left(1)) = -look;          % Point to Huffman map
          left = left(2:end);             % Delete current node
          found = found + 1;              % Increment codes found
          
       else                               % No, add 2 nodes & pointers
          len = length(code);             % Put pointers in node
          link(left(1)) = len + 1;
          
          link = [link; 0; 0];            % Add unprocessed nodes
          code{end + 1} = strcat(code{left(1)}, '0');
          code{end + 1} = strcat(code{left(1)}, '1');
          
          left = left(2:end);             % Remove processed node
          left = [left len + 1 len + 2];  % Add 2 unprocessed nodes
       end
    end
    
    x = unravel(y.code', link, m * n);    % Decode using C 'unravel'
    x = x + xmin - 1;                     % X minimum offset adjust
    x = reshape(x, m, n);                 % Make vector an array
    

    将上述编码后的图像进行解码操作,编写代码如下:

    load SqueezeFig0804(a);
    g = huff2mat(c);
    rmse = compare(f,g)
    

    在这里插入图片描述
    这个结果表明,在霍夫曼编码与霍夫曼解码的过程中均方根误差为0,即原图像和解压后图像之间的均方根误差为0。

    (三)空间冗余

    概念:图像中相邻像素间的相关性引起的是:空间冗余。空间冗余是图像数据中经常存在的一种数据冗余,是静态图像中存在的最主要的一种数据冗余。同一景物表面上采样点的颜色之间通常存在着空间相关性,相邻各点的取值往往相近或者相同,这就是空间冗余。

    f1 = imread('C:\Users\Public\Pictures\Sample Pictures\Fig0807(a).tif');
    c1 = mat2huff(f1);
    ntrop(f1)
    imratio(f1,c1)
    subplot(121),imshow(f1),title('原始图像');
    subplot(122),imhist(f1),title('其灰度直方图')
    

    在这里插入图片描述
    在这里插入图片描述

    f2 = imread('C:\Users\Public\Pictures\Sample Pictures\Fig0807(c).tif');
    c2 = mat2huff(f2);
    ntrop(f2)
    imratio(f2,c2)
    subplot(121),imshow(f2),title('原始图像');
    subplot(122),imhist(f2),title('其灰度直方图')
    

    在这里插入图片描述
    在这里插入图片描述
    由上述两幅图可知,不同的图像可以具有大致相同的直方图和熵,并且其压缩比也大致一样。这些现象表明,变长编码的设计不是为了显示结构间的关系。其实任何一幅图像的像素都可以合理地从它们的相邻像素值预测,这些相关性是像素间冗余的潜在基础。

    当图像为RGB彩色图像时,编写实验代码:

    f = imread('C:\Users\Public\Pictures\Sample Pictures\Fig0622(a).tif');
    f = rgb2gray(f);
    subplot(131),imshow(f),title('预测编码原图')
    c= mat2huff(f);
    ntrop(f)
    imratio(f,c)
    subplot(122),imhist(f),title('其灰度直方图')
    

    在这里插入图片描述
    在这里插入图片描述

    • 为了减少像素间冗余,必须把由人观察和解释的二维像素数组变换为更有效的格式。这种类型的变换被称为映射,当从原始图像可以从变换的数据集重建,它们就被称为可逆映射
      在这里插入图片描述
      这是映射过程,被称为无损预测编码,其处理方式可以通过对每个像素中新的信息进行提取和编码来消除相近像素间的冗余。新信息被定义为实际值与预测值的差值,公式为:
      在这里插入图片描述
      刚刚讨论的是无损预测编码,可以用函数mat2lpc函数lpc2mat来操作预测编码和解码过程。
      运用上面的函数来进行编写代码:
    f = imread('C:\Users\Public\Pictures\Sample Pictures\Fig0807(c).tif');
    subplot(131),imshow(f),title('预测编码原图')
    e=mat2lpc(f);
    subplot(132),imshow(mat2gray(e)),title('线性预测编码后的图像');
    entropy(e)
    

    在这里插入图片描述
    在这里插入图片描述
    这个熵的数值已经从7.3505比特/像素降低到5.9727比特/像素,意味着预测误差图像可以比原始图像更有效地进行编码。

    c =mat2huff(e);   %将lpc编码后继续进行huffman编码
    cr = imratio(f,c)
    

    在这里插入图片描述

    [h,x] = hist(e(:)*512,512);
    subplot(133),bar(x,h,'k')
    g = lpc2mat(huff2mat(c));
    imshow(g,[]),title('解码后图')
    

    在这里插入图片描述在这里插入图片描述将解码c与原始图像f进行比较:
    在这里插入图片描述
    RGB彩色图像 预测编码及解码:

    f = imread('C:\Users\Public\Pictures\Sample Pictures\Fig0622(a).tif');
    f = rgb2gray(f);
    subplot(131),imshow(f),title('预测编码原图')
    e=mat2lpc(f);
    subplot(132),imshow(mat2gray(e)),title('线性预测编码后的图像');
    entropy(e)
    
    c =mat2huff(e);
    cr = imratio(f,c)
    
    [h,x] = hist(e(:)*512,512);
    subplot(133),bar(x,h,'k');
    g = lpc2mat(huff2mat(c));
    imshow(g,[]),title('解码后图')
    compare(f,g)
    

    熵的结果:
    在这里插入图片描述
    在这里插入图片描述压缩比的结果:
    在这里插入图片描述
    彩色图像同理,熵也从7.1638比特/像素减少到4.1246比特/像素,预测误差图像也可以更有效地进行编码,压缩率也从1.1109增大到1.8785。
    在这里插入图片描述在这里插入图片描述将解码c与原始图像f进行比较:
    在这里插入图片描述
    实验分析: 无论是灰度图像还是彩色图像变成灰度图像的直方图比较,分别观察图像编码前和解码后图像,发现经过变换后图像均使图像的对比度增强,0周围附近的峰值都很高,这与输入图像的灰度级分布相比有较小的方差,反映的是由预测编码和微分处理除去的像素间冗余。利用预测编码就是对实际值和预值的差(预测误差)进行编码。如果预测比较准确,那么误差信号就会很小,就可以用较少的码位进行编码,以达到数据压缩的目的。

    (四)不相关的信息

    与编码及像素间冗余不同,心理视觉冗余和真实的或可计量的视觉信息有联系,心理视觉冗余数据的消除引起的定量信息损失很小,成为量化,量化会导致数据的有损压缩。这是一种不可逆操作。就好比一张图像(无法放大)比较小时,人眼是无法直接判断出其分辨率,为了压缩图像的数据量,可以去除一些人眼无法直接观察出的信息,但当其放大时,没有去除心理视觉冗余的图像将和去除心理视觉冗余的图像产生明显差别。

    IGS是指改进的灰度级量化,这种方法是认为眼睛对边缘有固有的敏感性,并且可通过对每个像素增加伪随机数来消除,伪随机数在量化前由相邻像素的低阶比特产生。

    结合IGS量化的无损预测和霍夫曼编码,代码如下:

    f=imread('C:\Users\Public\Pictures\Sample Pictures\Fig0517(a).tif');
    q=quantize(f,4,'igs');%用函数quantize进行igs量化到4bit
    qs=double(q)/16;
    e=mat2lpc(qs);    %使用预测编码后
    c=mat2huff(e);     %再使用霍夫曼编码
    imratio(f,c)
    subplot(131),imshow(f),title('原始图像');
    subplot(132),imshow(e),title('使用预测编码后');
    
    ne=huff2mat(c);   %进行霍夫曼解码
    nqs=lpc2mat(ne);  %图像的一维线性预测解码
    nq=16*nqs;
    subplot(131),imshow(ne),title('霍夫曼解码');
    subplot(132),imshow(nqs),title('线性预测解码');
    subplot(133),imshow(nq),title('16倍的线性预测解码')
    compare(q,nq)
    rmse=compare(f,nq)
    

    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    这说明解压缩图像的均方根误差大概有七个灰度级,这个误差是由于量化步骤而产生的。

    (五)JPEG压缩

    前面介绍的在一幅图像的像素上直接操作的技术,这部分讨论一种以修改图像的变换为基础的操作。在变换编码中,一种可逆的类似离散傅里叶变换DFT或离散余弦变换DCT的线性变换如下:
    在这里插入图片描述
    其中,在这里插入图片描述
    用一幅图像映射成一组变换系数,然后对它们进行量化和编码。

    (1)JPEG

    概念:JPEG是Joint Photographic Exports Group的英文缩写,中文称之为联合图像专家小组。该小组隶属于ISO国际标准化组织,主要负责定制静态数字图像的编码方法,即所谓的JPEG算法。这个算法已经成为了大家通用的标准,即 JPEG 标准。JPEG基本编码标准是基于离散余弦变换DCT的,输入和输出图像都被限定在8比特,量化为DCT系数值时限制为11比特。JPEG 压缩是有损压缩,但这个损失的部分是人的视觉不容易察觉到的部分,它充分利用了人眼对计算机色彩中的高频信息部分不敏感的特点,来大大节省了需要处理的数据信息。

    ps. jpeg与jpg是基本上一样的,jpg是jpeg的简称。

    以下是JPEG的压缩模型示意图,包括编码与解码:
    在这里插入图片描述
    将图像实现jpeg压缩使用函数im2jpeg,此函数内有两个专门的像素块处理函数blkproc和im2col,代码为:

    function y = im2jpeg(x, quality) 
    
    error(nargchk(1, 2, nargin));             % Check input arguments
    if ndims(x) ~= 2 | ~isreal(x) | ~isnumeric(x) | ~isa(x, 'uint8')
       error('The input must be a UINT8 image.');  
    end
    if nargin < 2    
       quality = 1;   % Default value for quality.
    end       
    
    m = [16 11  10  16  24  40  51  61        % JPEG normalizing array
         12  12  14  19  26  58  60  55       % and zig-zag redordering
         14  13  16  24  40  57  69  56       % pattern.
         14  17  22  29  51  87  80  62
         18  22  37  56  68  109 103 77
         24  35  55  64  81  104 113 92
         49  64  78  87  103 121 120 101
         72  92  95  98  112 100 103 99] * quality;
    
    order = [1 9  2  3  10 17 25 18 11 4  5  12 19 26 33  ...
            41 34 27 20 13 6  7  14 21 28 35 42 49 57 50  ...
            43 36 29 22 15 8  16 23 30 37 44 51 58 59 52  ...
            45 38 31 24 32 39 46 53 60 61 54 47 40 48 55  ...
            62 63 56 64];
    
    [xm, xn] = size(x);                % Get input size.
    x = double(x) - 128;               % Level shift input
    t = dctmtx(8);                     % Compute 8 x 8 DCT matrix
    
    % Compute DCTs of 8x8 blocks and quantize the coefficients.
    y = blkproc(x, [8 8], 'P1 * x * P2', t, t');
    y = blkproc(y, [8 8], 'round(x ./ P1)', m);
    
    y = im2col(y, [8 8], 'distinct');  % Break 8x8 blocks into columns
    xb = size(y, 2);                   % Get number of blocks
    y = y(order, :);                   % Reorder column elements
    
    eob = max(x(:)) + 1;               % Create end-of-block symbol
    r = zeros(numel(y) + size(y, 2), 1);
    count = 0;
    for j = 1:xb                       % Process 1 block (col) at a time
       i = max(find(y(:, j)));         % Find last non-zero element
       if isempty(i)                   % No nonzero block values
          i = 0;
       end
       p = count + 1;
       q = p + i;
       r(p:q) = [y(1:i, j); eob];      % Truncate trailing 0's, add EOB,
       count = count + i + 1;          % and add to output vector
    end
    
    r((count + 1):end) = [];           % Delete unusued portion of r
       
    y.size      = uint16([xm xn]);
    y.numblocks = uint16(xb);
    y.quality   = uint16(quality * 100);
    y.huffman   = mat2huff(r);
    

    将压缩过的图像进行解压缩,使用函数jpeg2im进行操作,代码如下:

    function x = jpeg2im(y) 
    
    error(nargchk(1, 1, nargin));             % Check input arguments
    
    m = [16 11  10  16  24  40  51  61        % JPEG normalizing array
         12  12  14  19  26  58  60  55       % and zig-zag reordering
         14  13  16  24  40  57  69  56       % pattern.
         14  17  22  29  51  87  80  62
         18  22  37  56  68  109 103 77
         24  35  55  64  81  104 113 92
         49  64  78  87  103 121 120 101
         72  92  95  98  112 100 103 99];
    
    order = [1 9  2  3  10 17 25 18 11 4  5  12 19 26 33  ...
            41 34 27 20 13 6  7  14 21 28 35 42 49 57 50  ...
            43 36 29 22 15 8  16 23 30 37 44 51 58 59 52  ...
            45 38 31 24 32 39 46 53 60 61 54 47 40 48 55  ...
            62 63 56 64];
    rev = order;                          % Compute inverse ordering
    for k = 1:length(order)
       rev(k) = find(order == k);
    end
    
    m = double(y.quality) / 100 * m;      % Get encoding quality.
    xb = double(y.numblocks);             % Get x blocks.
    sz = double(y.size);
    xn = sz(2);                           % Get x columns.
    xm = sz(1);                           % Get x rows.
    x = huff2mat(y.huffman);              % Huffman decode.
    eob = max(x(:));                      % Get end-of-block symbol
    
    z = zeros(64, xb);   k = 1;           % Form block columns by copying
    for j = 1:xb                          % successive values from x into
       for i = 1:64                       % columns of z, while changing
          if x(k) == eob                  % to the next column whenever
             k = k + 1;   break;          % an EOB symbol is found.
          else
             z(i, j) = x(k);
             k = k + 1;
          end
       end
    end
    
    z = z(rev, :);                                 % Restore order
    x = col2im(z, [8 8], [xm xn], 'distinct');     % Form matrix blocks
    x = blkproc(x, [8 8], 'x .* P1', m);           % Denormalize DCT
    t = dctmtx(8);                                 % Get 8 x 8 DCT matrix
    x = blkproc(x, [8 8], 'P1 * x * P2', t', t);   % Compute block DCT-1
    x = uint8(x + 128);                            % Level shift
    

    运用上面两个函数,进行JPEG压缩及解压缩编写实验代码:

    f=imread('C:\Users\Public\Pictures\Sample Pictures\Fig0804(a).tif');
    c1=im2jpeg(f);   %对原始图像f进行jpeg压缩
    f1 = jpeg2im(c1);  %对压缩后的图像进行解压缩
    imratio(f,c1)    %计算图像压缩后的压缩比
    compare(f,f1,3)   %比较两者误差
    subplot(121),imshow(f),title('原始图像');
    subplot(122),imshow(f1),title('解压缩')
    
    c4 = im2jpeg(f,4);  %使用参数4放大归一化数组后的jpeg压缩
    f4 = jpeg2im(c4);  %解压缩
    imratio(f,c4)     %比较两者压缩比
    compare(f,f4,3)
    subplot(121),imshow(f),title('原始图像');
    subplot(122),imshow(f4),title('参数为4放大后的解压缩图像')
    

    在这里插入图片描述
    比较两者误差,显示其直方图和重建图像差别:
    在这里插入图片描述在这里插入图片描述在这里插入图片描述
    在这里插入图片描述在这里插入图片描述在这里插入图片描述
    实验分析: 对比上面两组图像,看出了放大4倍的jpeg压缩后的图像,比默认值1倍的jpeg压缩图像增加模糊,分辨率变得更低了,产生了棋盘效果,也可以称为块效应。JPEG是一种有损压缩,会把原始数据中不重要的部分去掉,以便可以用更小的体积保存,这是一种牺牲视觉效果而减少存储量的方式。

    (2)JPEG2000

    概念:JPEG 2000基于小波变换的图像压缩标准,由Joint Photographic Experts Group组织创建和维护。JPEG 2000通常被认为是未来取代JPEG(基于离散余弦变换)的下一代图像压缩标准。JPEG 2000文件的副档名通常为.jp2,MIME类型是image/jp2。JPEG2000的压缩比更高,而且不会产生原先的基于离散余弦变换的JPEG标准产生的块状模糊瑕疵。JPEG2000同时支持有损压缩无损压缩。另外,JPEG2000也支持更复杂的渐进式显示和下载。(来自百度百科)

    以下是JPEG2000的压缩模型示意图,包括编码与解码:
    在这里插入图片描述
    在JPEG2000编码系统中,通过减去2m-1来进行图像像素灰度级移动,然后计算图像的行和列的一维离散小波变换,在无损压缩中,使用的变换是双正交的,采用的是5-3系数尺度和小波向量;在有损压缩中,使用9-7系数尺度和小波向量。在任何一种情况下,从最初的4个子带的分解中得到图像的低分辨率近似以及图像的水平、垂直和对角线频率特征。

    实验中可以使用函数im2jpeg2k进行JPEG2000的编码操作,使用函数jpeg2k2im进行压缩后的解压缩操作。下面对这两种函数进行调用,编写代码如下:

    f=imread('C:\Users\Public\Pictures\Sample Pictures\Fig0804(a).tif');
    c1=im2jpeg2k(f,5,[8 8.5]);   %进行尺度为5变换和分别使用参数8和8.5隐式量化后的图像
    f1 = jpeg2k2im(c1);  %对压缩后的图像进行解压缩
    rms1 = compare(f,f1)   %误差
    cr1 = imratio(f,c1)   %两者压缩比
    subplot(121),imshow(f),title('原始图像');
    subplot(122),imshow(f1),title('解压缩')
    
    c2 = im2jpeg2k(f,5,[8 7]);    %进行尺度为5变换和分别使用参数8和7隐式量化后的图像
    f2 = jpeg2k2im(c2);  %解压缩
    rms2 = compare(f,f2)
    cr2 = imratio(f,c2)
    subplot(121),imshow(f),title('原始图像');
    subplot(122),imshow(f2),title('解压缩图像')
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

    c3 = im2jpeg2k(f,1,[1 1 1 1]);   %使用显式量化,设四个子带都是步长为1
    f3 = jpeg2k2im(c3)
    rms3 = compare(f,f3)
    cr3 = imratio(f,c3)
    subplot(121),imshow(f),title('原始图像');
    subplot(122),imshow(f3),title('解压缩图像')
    

    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述实验分析: 上面两幅图分别是压缩比为42:1和88:1进行编码后产生的重建图像,函数im2jpeg2k只是近似于JPEG2000的算术编码,其压缩率与真的JPEG2000编码器得到的结果是不一样的,真实压缩率会近似地以2的因数增加。我们会发现,当压缩比为42:1时,图像显示的误差降低,变得有些模糊,女士肩部部分产生块效应,但是没有对比压缩比为88:1没有很明显。在88:1压缩比的图像中,女士的眼睛和衣服纹理都被棋盘化,产生“格子”的感觉。在最后一幅图中,使用显式量化,压缩前和解压后的图像基本没有改变,也不会产生棋盘效应,比较好地进行了压缩,但从数据上看,是由于其压缩比较小,误差也较小造成的。因此,实验证明,JPEG和JPEG2000都属于有损压缩。压缩比越大,则解压后的图像损失越大,图像存储所使用的数据量就越小。

    (六)视频压缩

    说明:视频是图像序列,称为视频帧,其中的每一帧都是单色或者彩色图像。视频压缩存在时间冗余,这是由于相邻帧的像素间相关。
    在视频压缩中,可以使用imread('filename.tif',idx)一次一个地读取图像,idx是读入序列中帧的整数索引,为了把非压缩帧写入多帧TIFF文件中,使用imwrite函数来进行操作,imwrite(f,'filename','Compression','none','WriteMode',mode)
    其中,当写入初始帧时,mode置为’overmode’;当写入所有的其他帧时置为’append’。注意,imwrite对多帧TIFF文件不提供随机访问支持,帧必须以它们产生的顺序写入。

    (1)Matlab图像序列和电影

    两种方法用于在MATLAB中描述视频,分别是:

    • 第一种,视频的每一帧都沿着4维数组的第4维连接起来,其结果数组是MATLAB的图像序列,第一二维是行维数和列维数,第三维对于单色图像(或者索引)是1,彩色图像是3,第四维则是图像序列的帧数。
    • 第二种,把连续的视频帧插入到称为电影帧的结构矩阵中

    第一种方法编写实验代码:

    i = imread('C:\Users\Public\Pictures\Sample Pictures\sky.gif',3);  %读取一幅gif类型的彩色图像
    frames = size(imfinfo('C:\Users\Public\Pictures\Sample Pictures\sky.gif'),1);    %获取图像的具体信息
    s1 = uint8(zeros([size(i) 1 2]));  % 建立两帧的彩色图像序列
    s1(:,:,:,1) = i;
    s1(:,:,:,2) = imread('C:\Users\Public\Pictures\Sample Pictures\sky.gif',frames);
    size(s1)
    

    以下是原始图像:
    在这里插入图片描述
    在这里插入图片描述
    第二种描述视频方式,代码如下:

    lut = 0:1/255:1;
    lut = [lut' lut' lut'];
    m1(1) = im2frame(s1(:,:,:,1),lut);  %建立第一帧电影帧
    m1(2) = im2frame(s1(:,:,:,2),lut);  %建立最后一帧电影帧
    size(m1)  %显示m1的尺寸
    m1(1)
    

    在这里插入图片描述
    可以用implay函数来观看,包括放映、暂停、单步等:

    implay(frms,fps)   %frms是MATLAB电影或图像序列,fps是回放的帧率(帧每秒),默认是20帧/秒
    

    编写代码如下:

    implay(s1,10)    %播放s1,且回放帧率是10帧/秒
    

    在这里插入图片描述
    当需要调整窗口大小以适应播放的图像时,可以滚动条会使得观看区域尺寸增大

    • 需要多帧同时观看时,可以使用函数montage
    montage(frms,'Indices',idxes,'Size',[rows cols])   %idxes是数字数组,用于组装剪辑;rows和rols用于定义形状
    

    编写代码如下:

    montage(s1,'Size',[2 1])
    

    在这里插入图片描述
    下面将一些转换函数进行说明:

    1. 多帧TIFF文件和MATLAB图像序列之间的转换:
    s = tifs2seq('filename.tif')  %s是MATLAB图像序列
    seq2tifs(s,'filename.tif')   %'filename.tif'是多帧TIFF文件
    
    1. MATLAB电影和多帧TIFF文件的转换:
    m = tifs2movie('filename.tif')  %m是MATLAB电影
    movie2tifs(m,'filename.tif')
    
    1. 多帧TIFF文件与AVI文件的转换:
    moive2avi(tifs2moive('filename.tif'),'filename.avi')   %'filename.avi'是产生的AVI文件名
    

    (2)时间冗余和运动补偿

    信息论的观点来看,描述信源的数据是信息和数据冗余之和,即:数据=信息+数据冗余时间冗余是序列图像和语音数据中经常包含的一种数据冗余,这种冗余的产生跟时间紧密相关。时间冗余与空间冗余类似,时间冗余是由于时间上彼此接近的像素相关。

    实验代码:

    f2 = imread('C:\Users\Public\Pictures\Sample Pictures\Fig0521(a).tif',2);
    ntrop(f2)
    e2 = mat2lpc(f2);    %预测的残留熵
    ntrop(e2,512)    %预测的残留熵其结果是6.1422
    c2 = mat2huff(f2);
    imratio(f2,c2)      %预测和差值处理的压缩比,比值为1.0960
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    f1 = imread('C:\Users\Public\Pictures\Sample Pictures\Fig0521(a).tif',1);
    ne2 = double(f2) - double(f1); 
    ntrop(ne2,512)   % 预测的残留熵的结果是0
    nc2 = mat2huff(ne2);
    imratio(f2,nc2)      %压缩比是7.9973
    

    在这里插入图片描述
    使用帧间预测器,让压缩比增加到7.9973。

    增加最大帧间预测的准确性的方法是解决帧与帧之间的目标运动——运动补偿 的处理方法。

    运动补偿:是一种描述相邻帧(相邻在这里表示在编码关系上相邻,在播放顺序上两帧未必相邻)差别的方法,具体来说是描述前面一帧的每个小块怎样移动到当前帧中的某个位置去。这种方法经常被视频压缩/视频编解码器用来减少视频序列中的空域冗余。它也可以用来进行去交织(deinterlacing)与以及运动插值(motion interpolation)的操作。
    在这里插入图片描述
    运动补偿中的预测编码原理:

    帧内编码通常是以宏块为单位的DCT编码,帧间编码是在帧内编码的基础上进行的,在不同帧之间以对应的宏块为对象进行DPCM编码。所谓运动补偿是指对宏块在下一帧的位置做运动估计,将该运动估计用于确定下一帧对应宏块的位置,再进行DPCM编码,使编码考虑了图象的运动分量,即对运动做了补偿,提高编码效率

    在这里插入图片描述
    如图所示,对于大小为NxM的宏块的运动估计是在参考图象中一定的范围内寻找最佳的匹配的过程。这种估计方法实际上是假设宏块内部象素具有同样的运动参数,即平滑性约束条件。这只能是一种近似方法,宏块越小平滑性就越好,但运动估计的可靠性也越差,因为匹配时考虑的象素数目就越少,另外寻找最佳匹配的快速算法对较大的宏块比较有效。

    展开全文
  • 图像压缩编码是专门研究图像数据压缩的技术,就是尽量减少表示数据图像所需要的数据量目的:减少存储空间、缩短传输时间图像压缩编码从本质上来说就是对要处理的图像数据按照一定的规则进行变换和组合,从而达到以尽...
  • 图像压缩图像处理中应用最好,应用广泛的部分 一阶马尔可夫图像信源:像素之间的关系尽量的少 但是在图像中不现实,图像之间的相关性非常的高,多阶马尔可夫信源(不是很懂) 反正就是KL变换不是很好...
  • 数字图像处理第八章数字图像处理---图像压缩(一) 背景(二) 编码冗余2.1 霍夫曼码2.2 霍夫曼编码2.3 霍夫曼译码(三)空间冗余(四)不相关的信息(五)JPEG 压缩5.1 JPEG5.2 JPEG 2000(六)视频压缩6.1 MATLAB...
  • 一、图像压缩基本概念 1、图像压缩的可能性 2、图像压缩的可能性 二、图像压缩模型 三、信息论要素 四、无损压缩和有损压缩 五、有损压缩 1、有损预测编码 (1)有损压缩的基本概念 (2)量化器 (3)量化...
  • 1.前言: ...图像压缩研究就是寻找高压缩比的方法,且压缩后的图像要有合适的信噪比。因为在压缩之后,我们还要恢复原始信号,并且在压缩、传输、恢复过程,要求图像的失真度小。 图像数据往往存
  • 将调研到的图像视频编解码处理的发展历程国际研究现状整理如下 作为通信、介质存贮、数据发行、多媒体计算机等技术的关键环节,图像压缩编码算法的研究是信息技术中最活跃的研究领域之一。尤其是进入21世纪...
  • 傅里叶变换实现图像压缩 题目 首先将图像分割为8x8的子图像,对每个子图像进行FFT.对每个子图像中的64个系数,排序后,舍去小的变换系数,只保留靠前的16个系数,实现4: I的图像压缩。 代码 t=imread('a6.jpg'); t=...
  • 数据冗余的分类:编码冗余、像素冗余(图像的相邻关系)、视觉心里冗余(人眼无法分辨) 二、衡量压缩的指标 压缩比、压缩算法、失真性(以及编码效率、实时性、失真度、设备复杂程度、经济实用性) 常用混合编码,...
  • matlab中图像压缩

    2018-05-19 12:37:07
    那么这儿总结我自己理解的图像压缩简单流程压缩的方法论:我们首先做图像压缩是在频率域处理的,通过DCT(离散余弦变换)将图像转到频率域。低频部分也存储了图像的大多信息。我们知道,低频部分集中较多能量,含有...
  • 第八章 图像压缩 第八章 图像压缩 本章预留
  • PCA与图像压缩

    2015-08-10 11:39:20
    PCA与图像压缩2015-8-10奇异值分解在图像压缩处理中有着重要的应用。假定一副图像有 n×nn\times n 个像素,如果将这 n2n^2 个数据一起传送,往往会显得数据量太大。因此,我们希望能够改为传送另外一些比较少的数据...
  • 参考 先码。 图像的DCT算法
  • 压缩的方法论:我们首先做图像压缩是在频率域处理的,通过DCT(离散余弦变换)将图像转到频率域。低频部分也存储了图像的大多信息。我们知道,低频部分集中较多能量,含有图像大多平滑信息,而高频部分主要是边缘...
  • 图像压缩编码概述

    2017-04-10 14:35:02
    1.图像压缩编码的必要性 现在是信息爆炸时代,图像数据量特别大,故此在传输或者存储时都需要对数据进行有效的压缩。图像压缩就是对图像数据按照一定的规则进行变换和组合,用少的数据量表示影像。 2.图像压缩编码...
  • 我最近在看实验室里图像压缩解压的代码,遇到一些不懂得概念,咨询了一下师兄,写来了记录一下,百度了一下相关概念很少,这个纯是靠自己的理解写的,如果有错误欢迎在评论区指正。1.码率截取我们都知道码率=图像...
1 2 3 4 5 ... 20
收藏数 112,111
精华内容 44,844
关键字:

图像压缩与图像处理