精华内容
下载资源
问答
  • 目录参考文章基于DCT变换的JPEG图像压缩原理图像数据压缩图像处理为什么可以进行图像压缩?颜色空间转换RGBCMYHSV/HSI/HSB/HSLYUV/YCbCrYCbCr与RGB的相互转换分块离散余弦变换正交变换Z字形扫描量化JPEG2000的压缩...

    参考文章

    https://blog.csdn.net/lxj_bsplee/article/details/53215077
    https://blog.csdn.net/ytang_/article/details/76571635

    基于DCT变换的JPEG图像压缩原理

    图像数据压缩

    数字图像需要大量数据来表示,因此必须对其进行数据压缩。但在压缩的过程中,也会对传输介质、传输方法和存储介质等提出较高要求。常用的图像数据压缩方法主要有哈夫曼编码、行程编码、算术编码、离散余弦变换编码以及混合编码等,今天我们做的就是其中的一种,离散余弦变换编码

    图像处理

    图像处理,是指将一幅图像变为另外一幅经过修改的图像,是一个图像到图像的过程。一般图像处理技术分为两类:模拟方式与数字方式。如今普遍采用数字图像处理,包括以下内容:图像复原、图像压缩、图像重建、模式识别等。图像压缩的首要目的就是压缩数据量,提高有效性。

    为什么可以进行图像压缩?

    因为图像数据具有可压缩性,有大量的所谓统计性质的多余度,从而产生生理视觉上的多余度,去掉这部分图像数据并不影响视觉上的图像质量,甚至去掉一些图像细节对于实际图像的质量也无致命的影响。正因为如此,可以在允许保真度的条件下压缩待存储的图像数据。
    ###小结
    图像压缩是图像处理的一种方式,同时DCT变换是图像压缩的一种方式,因为图像数据具有冗余性,所以进行图像渊薮之后是不会影响视觉效果的,跟原图没有什么太大区别。
    下面介绍一种比较常见的编码方式,huffman编码。

    颜色空间转换

    颜色空间:是针对不同行业而用途来衡量同一个颜色对象

    RGB

    扫描仪器和显示设备,计算机系统,随着互联网的兴起,这也是我们日常接触较多的一种方式。

    CMY

    打印机,印刷出版

    HSV/HSI/HSB/HSL

    图像处理和计算机视觉

    YUV/YCbCr

    YCbCr或Y’CbCr有的时候会被写作:YCBCR或是Y’CBCR,是色彩空间的一种,通常会用于影片中的影像连续处理,或是数字摄影系统中。Y’为颜色的亮度(luma)成分、而CB和CR则为蓝色和红色的浓度偏移量成份。Y’和Y是不同的,而Y就是所谓的亮度(luminance),表示光的浓度且为非线性,使用伽马修正(gamma correction)编码处理

    JPEG 采用YCbCr或者RGB

    YCbCr与RGB的相互转换

    Y = 0.257R+0.504G+0.098B+16
    Cb = -0.148
    R-0.291G+0.439B+128
    Cr = 0.439R-0.368G-0.071B+128
    R = 1.164
    (Y-16)+1.596*(Cr-128)
    G = 1.164*(Y-16)-0.392*(Cb-128)-0.813*(Cr-128)
    B = 1.164*(Y-16)+2.017*(Cb-128)

    分块

    后续的DCT变换是基于88像素块的,因为图像的分辨率长宽不一定是8的倍数,怎么办呢?对其边缘补成8的倍数,然后进行分块,然后对每个像素点减去2^p(p为采样精度在采样的时候我们对Y采样多于Cb,Cy,因为研究显示人类对于Y的敏感度大于其他两个变量)。这样像素点的值就从正变成了正或者负。
    这样一个8
    8的像素块就被分成了三张表格,分别是Y,Cb,Cy

    离散余弦变换

    当分块为8*8的时候,
    DCT
    在这里插入图片描述
    IDCT
    在这里插入图片描述

    在这里插入图片描述

    正交变换

    正交变换不会对图形进行拉伸、压缩,它能够使变换后的图形保持原来图形的几何形状,如下图所示,ABC构成的空间正交变换到A’B’C’,其大小和形状都不会改变。

    在这里插入图片描述
    上面的正交变换是从变换的结果来进行直观的解释,可以看到这种变换拥有良好的性质——能够保持空间的不变性,保证不会对原空间产生压缩拉伸,往深了说,就是这种变换不会损失信息,因为它保持了原空间的内部结构,这在工程上是很有用的。
    二维DCT变换是一种正交变换??

    Z字形扫描

    经过DCT变换之后,数据变少了,因为抛弃了高频信息,所有矩阵中数据表示的像素点可能是不相邻的,这样每一行的结尾点和下一行的开始点不米奇额,所以就使用Z字形扫描使得在数列里面相邻的点在图片上也是相邻的。

    量化

    为了进一步提高压缩比,对于不同分辨率的部分采用不用的量化处理,因为Y分量相比Cr,CB分量对于人眼更加重要,所以对Y进行细量化,对Cb,Cr采用粗量化。

    JPEG2000的压缩原理

    在JPEG2000中用到了DWT,在JPEG2000中不需要将图像强制分为8*8的小块,但是为了降低内存的需求和方便压缩域可以将图像分割为不重叠的矩阵块,分块会对图像的质量有影响,所以应该分块大一点。

    有损压缩

    采用整数小波变换

    无损压缩

    采用实数型小波变换

    展开全文
  • 基于DCT变换的JPEG图像压缩原理

    千次阅读 2020-05-28 00:42:30
    1、为什么要进行图像压缩       众所周知,当今人类社会具有三大支柱,即物质、能量、信息。当下已由物质过渡到信息,从农业现代化到工业现代化,再到当今的信息化时代。信息具有通用性、抽象性...
    1、为什么要进行图像压缩

           众所周知,当今人类社会具有三大支柱,即物质、能量、信息。当下已由物质过渡到信息,从农业现代化到工业现代化,再到当今的信息化时代。信息具有通用性抽象性无限性。其通用性表现在信息的无所不在和无时不在特点上;抽象性表现在信息不是一个具体的物理物质,没有重量,没有长度;而无限性表现在物质的不可分性,也可以理解为通信网络发展的不可预测,以及电话线模式的不断发展,带来通信信息的扩展以及通信模式的不断更新,变化。

           随着信息技术的发展,图像信息被广泛应用于多媒体通信和计算机系统中,不仅使社会环境更加绚丽多彩,同时给信息化时代的用户提供一种更加直观、确定的获取信息资源的一种便利方法。但是图像信息庞大的数据量,不经压缩处理,不仅会超出计算机的存储和处理能力,同时在现有通信信道的带宽下,无法既在保证图像质量的情况下,又进行大量多媒体信息快速和实时的传输,造成网络负载加剧,计算机处理能力降低,从而影响用户交互心情。


           因此,为了更好的、有效的存储处理以及传输这些图像数据信息,必须进行Image Compression。

    2、什么是图像压缩

           目前常用的图像文件格式有十几种,其中JPEG格式由于占用空间小,图像质量高,而为用户广泛采用。JPEG即联合图像专家组(Joint Photographic Experts Group),隶属于ISO国际标准化组织,主要负责定制静态数字图像的编码方法,即所谓的JPEG算子。她适用于各种不同类型、不同分辨率的彩色和黑白二值静止图像。现阶段,JPEG专家小组开发出2种压缩算法,2种熵编码方法以及4种编码模式,如下:

           压缩算法:

           (1)有损的离散余弦变化DCT(Discrete Cosine Transform);

           (2)无损的预测压缩技术;

          熵编码方法:

           (1)Huffman编码

           (2)算术编码;

           编码模式:

           (1)基于DCT的顺序模式:编码、解码通过一次扫描完成;

           (2)基于DCT的渐进模式:编码、解码需要多次扫描完成,扫描效果由粗到精,逐级递增;

           (3)无损模式:基于DPCM,保证解码后完全精确恢复到原图像采样值;

           (4)层次模式:图像在多个空间分辨率中进行编码,可根据需要只对低分辨率数据解码,放弃高分辨率信息;

           实际生活中采用以上红色标注的压缩方法。这是JPEG的基本压缩系统。其中压缩过程一共分为以下9个步骤:颜色空间转换采样分块离散余弦变换(DCT)(Zigzag Z字形扫描排序)量化DC系数的DCPM编码AC系数的游程长度编码熵编码压缩。


    3、JPEG压缩过程详解

    (1)颜色空间转换

           颜色通常可以使用三种不同的属性对之进行描述,三个独立变量综合作用,就构成了空间坐标,这就是颜色空间。而颜色可以从不同的角度,用三个一组的不同属性加以描述,这就构成了不同的颜色空间。描述的颜色对象是客观的,不同的颜色空间只是从不同的角度去刻画衡量同一个颜色对象。所以,颜色空间的出现大多是面向具体的应用和行业的。

           颜色空间(也叫彩色模型、彩色系统、色彩空间)的概念其实质是一种用途,是一种针对不同应用而采用某接受的方式对彩色加以说明的彩色模型(这里可接受我们可以理解为上面所说的三种不同属性的变量)。

    市场上大概推出了上百种颜色空间,常见的有:

           RGB  用于扫描仪和显示设备、计算机系统(将颜色的亮度、色度、饱和度融为一体)[red,green,blue]

           CMY  用于打印机、印刷出版业[cyan,magenta,yellow]

           HSV/HSI/HSB/HSL   广泛用于图像处理和计算机视觉          

                  [hue,saturation,value/intensity/brightness/luminance(or lightness)色度,饱和度,亮度]

           YUV/YCbCr  用于视频和电视,JEPG采用的是YCbCr颜色空间,但同时大多数计算机系统采用的是RGB颜色空间。

           采用YUV颜色空间的重要性是它的亮度信号Y和色度信号U、V是分离的(Y表示亮度,U(Cb)、V(Cr)表示色度,有时候分别又说表示色度和饱和度)。如果只有Y信号分量而没有U、V分量,那么这样表示的图就是黑白灰度图。彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机的兼容问题,使黑白电视机也能接收彩色信号。

           电视信号在发射时,转换成YUV形式,接受时再还原成RGB三基色信号,由显像管显示(RGB->YUV->编码发送------YUV->RGB->显示

           这里主要利用了HVS(Human Visual System)对亮度比色度更敏感的特点,而计算机系统没有人眼这样的识别功能,所以主要使用RGB三基色原理(世界中任一颜色都可以使用RGB以不同的权重联合起来表示)。

           因此,针对图像压缩,CV等需要将RGB颜色空间的图像转换为YUV彩色模型的图像,方便后续的图像处理(如压缩,增强,恢复等)。

           RGB->YUV:

           Y = 0.299R+0.587G+0.114B

           Cb = -0.1687R-0.3313G+0.5B+128

           Cr = 0.5R=0.418G-0.0813B+128

           (一般来说,C值(包括Cb、Cr)应该是一个有符号的数字,但这里通过加上128,使其变为8位的无符号整数,从而方便数据的存储和计算。)

           YUV->RGB:

           R = Y+1.402(Cr-128)

           G = Y-0.34414(Cb-128)-0.71414(Cr-128)

           B = Y+1.772(Cb-128)

    (2)采样

           根据生物学研究表明,HVS对亮度比色度更敏感。因此我们可以认为将彩色信息的清晰度较低些,这样可显著压缩色度所需带宽,也就是Y分量比Cb和Cr的分量重要的多。在图片格式国际标准BMP中,采用的RGB颜色空间三个分量就需要3个字节进行采样,也就是我们说的RGB888模式。在JPEG中主要采用411和422的采样方式。(也就是在2X2的空间域中,本应总共需要4个Y,4个U,4个V,总共需要4+4+4=12字节,422采样意思为每4个像素单元有4个Y,2个U,2个V,此时只需要4+2+2=8字节,411则是6字节,相应的420类似。其中420格式广泛用于数字电视、会议电视、DVD中)

           采用这样的采样方式,虽然损失了一定的精度,但是在HVS观察不到的前提下较少了数据量。

    (3)分块

           因为后续的DCT变换是基于8X8大小的像素块的,因此针对一副数字图像在DCT之前需要进行分块。由于图像的YUV三个分量是交替出现的,首先需要将依次分量分开存入3张表中;然后依次从左到右,从上到下,读取8X8的子块,存放到64长度的表中,然后进行DCT变换,量化,编码,然后在读取下一块进行类似操作。

           JPEG编码是以8X8的块为单位进行处理的,但是一幅图像的分辨率中长宽不一定都是8的倍数,此时需要对之边缘补成8的倍数,然后进行分块,依次处理。这里需要注意,分为8X8的块后,需要对每个像素点减去2p(p为采样精度),将像素数据从无符号整数变为有符号整数再带入DCT公式,也就是输入时把[0,2p]变为[-2p-1,2p-1-1]。

          以下是将一张原灰度图像转换为8X8的small block,每block都有64个pixels:


    (4)离散余弦变换

           DCT的变换结果只有实数部分,没有复数部分。任何连续的实对称函数的傅里叶变换中只含有余弦项,DCT同FFT一样具有明确的物理意义。DCT是先将原MXN的图像进行分块,然后在逐一的进行DCT。

           分为正向DCT:FDCT

     

           反向DCT:IDCT


           
           

           这里:M=N=8,F(u,v)公式中的从左至右的16由2M,2N所得)

           在这里,详细说明DCT变换的数学意义,其实质,根据上述公式,二维DCT是一种正交的线性变换,因此为方便计算机计算,常常转换为矩阵的形式表示:

           FDCT:

           IDCT:

          其中,C为一个正交矩阵,满足


          变换后:8X8的original pixels A都变成了另外8X8的数字阵列B,变换后的每一个数都是由original 64 data通过basis function组合而得的。阵列B可以很好地将original image的能量(低频部分)集中在左上角,其余高频分布于右下角。当u,v为0时,左上角F(0,0)是所有像素的一个均值(it is the average of all original pixels),叫做直流分量DC或直流系数,随着u,v的增加,阵列B其余元素为交流分量AC,或者交流系数。

          在这里我们只考虑一个方向上的DCT信号变换,如下图所示: 


          其中原图信号波经过DCT变换后分解为了8个不同振幅的波形,其中第一幅为直流成分,其余7副为交流部分。从直流到交流,高频信息越显著。

          F(n)=C(n)*E(n),其中E(n)是一个基底,C(n)是DCT系数,F(n)则是图像信号;当考虑垂直方向的变化时,就需要一个二维的基底。傅里叶变换中提到任何信号都可以被分解为基波和不同幅度的谐波的组合,而DCT变换的物理意义正是如此。

          由于大多数图像的高频分量比较小,相应的图像高频分量的DCT系数经常接近于0,再加上高频分量中只包含了图像的细微的细节变化信息,而人眼对这种高频成分的失真不太敏感,因此考虑将这一些高频成分予以抛弃,从而降低需要传输的数据量。操作以后,传送DCT变换系数的所需要的编码长度要远远小于传送图像像素的编码长度。到达接收端之后通过反离散余弦变换就可以得到原来的数据,虽然这么做存在一定的失真,但人眼是可接受的,而且对这种微小的变换是不敏感的。

    (5)Z字形扫描排序

          有了以上的知识,我们知道DCT变换后将8X8的数组变成了另外一种元素更小的8X8的数组。在计算机中数组的存放一般按照行方式存储,但是如果这样的话,每一行的结尾点和下一行的开始点(或者说元素点之间的相邻性)不密切,因此在JPEG中采用以下的顺序存储:



          这样保证了数列里的相邻点在图片上也是相邻的。不难发现,这种数据的扫描、保存、读取方式,是从8X8矩阵的左上角开始,按照英文字母Z的形状进行扫描的,一般将其称之为Zigzag扫描排序。如下图所示:


    (6)量化

          所谓量化就是用像素值÷量化表对应值(量化步长)所得的结果。由于量化表左上角的值较小,右上角的值较大,这样就起到了保持低频分量,抑制高频分量的目的。JPEG使用的颜色是YUV格式。我们知道,Y分量相比UV分量对人眼而言更重要,因此我们对Y采用细量化,对UV采用粗量化,可进一步提高压缩比。所以上面所说的量化表通常有两张,一张是针对Y的;一张是针对UV的。

          通过量化可以reducing the number of bits and eliminating some of the components,达到通低频减高频的效果,如下图所示就是两张量化表的例子:


          比如左边那个量化表,最右下角的高频÷99,这样原先DCT后[-127,127]的范围就接近变成了[-1,1],固然减少了码字(从8位减至1位)。这样做,也是为了在一定程度上得到相对清晰的图像和更高的压缩率。另一个重要原因是所有的图片的点与点之间会有一个色彩过渡的过程,而大量的图象信息被包含在低频率空间中,经过DCT处理后,在高频率部分将出现大量连续的零。

          DCT变换是在最小均方误差准则下得出的次最佳正交变换,并且有快速算法,因此它在硬件中也很容易实现。

    (7)DC系数的DCPM编码

          经过DCT、量化过后得到的8×8图像块中的DC直流系数有两个特点:直流系数的数值比较大相邻8×8图像块的DC系数值变化不大

          根据这个特点,JPEG算法使用了差分脉冲编码调制(DPCM)技术,对相邻图像块之间的DC系数的差值(Delta)进行编码,是一种预测编码,即

          其差值用两个变长码表示:(SIZE,VALUE)

          SIZE:Bit size of DC Delta value

          VALUE:DC Delta value

          eg:当前块的直流系数为15,与它相邻的上一块为12,那个Delta为3(11):此时存储为(2,3)

          前者SIZE采用Huffman编码,后者VALUE采用VLI编码

    (8)AC系数的RLE编码

          经过量化和Z字型扫描后AC系数中包含有许多“0”系数,并且许多“0”是连续的。因此可以使用非常简单的游程长度编码(RLE)对它们进行编码,如下图所示:

          AC系数首先用RLE编码符号对(连续0的个数,下一个非零值)来表示。例如图AC系数为:(1,-2),(0,-1),(0,-1),(0,-1),(2,-1),(0,0) --EOB

     

          JPEG中的编码系数对,采用1个字节的高4位来表示连续“0”的个数;使用它的低4位来表示编码下一个非“0”系数所需要的位数;跟在它后的是非零的量化AC系数的数值(变长码)。

          记为: (RUN/SIZE,VALUE)

          RUN:Run-length of zeros(use 4 bit as it,NNNN)

          SIZE:Bit size of Non-zero value(use 4 bit as it,SSSS)

          VALUE:Non-zero value

          例如: AC系数(1,-2)表示为(1/2,-2)

          注意,如果AC系数之间连续0的个数超过16,则用一个扩展字节(15,0)来表示16连续的0。

          前者RUN/SIZE采用Huffman编码,后者VALUE采用VLI编码

    (9)熵编码

          DPCM编码后的直流DC系数和RLE编码后的交流AC系数的RUN/SIZE在统计上还呈现出一定的规律,因此JPEG标准提供了两种熵编码方式:Huffman编码和算术编码。JPEG基本系统规定采用Huffman编码(因为不存在专利问题),但JPEG标准并没有限制JPEG算法必须用Huffman编码方式或者算术编码方式。因此使用霍夫曼编码来进一步压缩。对出现频度比较高的符号分配比较短的代码,而对出现频度较低的符号分配比较长的代码。

          Huffman编码时DC系数与AC系数分别采用不同的Huffman编码表,对于亮度和色度也采用不同的Huffman编码表。因此,需要4Huffman编码表才能完成熵编码的工作。具体的Huffman编码采用查表的方式来高效地完成。然而,在JPEG标准中没有定义缺省的Huffman表,用户可以根据实际应用自由选择,也可以使用JPEG标准推荐的Huffman表。或者预先定义一个通用的Huffman表,也可以针对一副特定的图像,在压缩编码前通过搜集其统计特征来计算Huffman表的值。

          霍夫曼码表分为DC表和AC表,事先进行定义:


    (这里没有给出色度对应的DC和AC Huffman表格)

    (10)JPEG压缩举例

          Eg:假如某图像被分成8X8块大小时中经过DCT、量化后的阵列为下图:

     

          此时,假定前一个块DC=12,则量化后系数为: 15-12, (1,-2), (0,-1), (0,-1), (0,-1), (2,-1), EOB

          前者SIZE采用Huffman编码,后者VALUE采用VLI编码(查表)DC: 3->(2,3)-T1->011,11

          前者RUN/SIZE采用Huffman编码,后者VALUE采用VLI编码(查表)

          AC:(1,-2)->(1/2-2)-T2-> 11011, (-2-1)mod2 -> 11011,01

                (0,-1)->(0/1-1)-T2->    00, (-1-1)mod2 -> 00,0

                (0,-1)->(0/1-1)-T2->    00, (-1-1)mod2 -> 00,0

                (0,-1)->(0/1-1)-T2->    00, (-1-1)mod2 -> 00,0

                (2,-1)->(2/1-1)-T2-> 11100, (-1-1)mod2 -> 11100,0

                EOB->1010

          压缩后的VLC(Variable Length Code)比特数:5+7+3+3+3+6+4 = 31 bits;

          压缩前:8*8*8=512 bits;

          压缩比为:512/31= 16.5:1,相当于一个像素只需要半个比特(这里一个像素使用8b量化)

    4、基于DCT变换的JPEG图像压缩MATLAB实现 

          在MATLAB中,进行DCT变换主要有两种方法,dct()和dct2(),这里我们使用dct2进行模拟:

          <1>方法一:针对gray image图像

    [plain] view plain copy
    1. img = imread('len_gray.jpg');%the is a gray image  
    2. I = im2double(img);%T1 = dctmtx(8);%处理后返回一个8 x 8的DCT变换矩阵  
    3. %block1 = blkproc(I1,[8 8],'P1*x*P2',T,T');%对图像I1的每个不同8 x 8块应用矩阵'P1*x*P2'进行处理,必要时补0  
    4. mask = [1 1 1 1 1 1 1 1  
    5.         1 1 1 1 1 1 1 1  
    6.         1 1 1 1 1 1 1 1  
    7.         1 1 1 1 1 1 1 1   
    8.         1 1 1 1 1 1 1 1  
    9.         1 1 1 1 1 1 1 1  
    10.         1 1 1 1 1 1 1 1  
    11.         1 1 1 1 1 1 1 1];%选取10个DCT系数重构图像  
    12. %block2 = blkproc(block1,[8 8],'P1*x',mask);  
    13. %I2 = blkproc(block2,[8 8],'P1*x*P2',T,T');  
    14. I1 = dct(I);  
    15. I2 = idct(I1);  
    16. subplot(2,2,1);imshow(img);title('原图像');  
    17. subplot(2,2,2);imshow(I2);title('经过IDCT变换后得到的重构图像');  
    18. subplot(2,2,3);imshow(abs(I-I2));title('原图像与重构图像之差,反应失真程度');  
    19. subplot(2,2,4);mesh(dct2(I1));title('dct2(dct(im2double(img)))光谱图');  
    20. colorbar('vert')%在水平轴旁增加一颜色等级条  

          仿真结果:


          仿真结果分析:

          可以看到,进过DCT变换后重构所得到的的图像与原图像在HVS上没有显著的区别,也可以从第三幅图中看到,原图和重构图像素之间差值几乎为0,为黑色。

     <2>方法二:针对彩色图像

    [plain] view plain copy
    1. rgb = imread('lena_rgb.jpg');%read a RGB image it's format is 'jpg'   
    2. gray = rgb2gray(rgb);%trasform the RGB to gray  
    3. img = im2double(gray);%does turn the gray image I into format of 'double'  
    4. img1 = dct2(img);%does 2dim DCT for I0,and the DCT coefficients return into I1  
    5. img2 = idct2(img1);%get the reverse transform by doing 2dim  
    6.    
    7. subplot(3,2,1);imshow(rgb);title('original image rgb');  
    8. subplot(3,2,2);imshow(gray);title('to gray gray');  
    9. subplot(3,2,3);imshow(img);title('to 2double');  
    10. subplot(3,2,4);imshow(img1);title('the gray image dct');  
    11. subplot(3,2,5);imshow(img2);title('the gray image idct');  
    12. subplot(3,2,6);imshow(abs(img-img2));title('original 2double image - idct');  
    13. figure,mesh(img1);title('变换谱三维彩色图');  
    14. colorbar('vert');  

          仿真结果:


          仿真结果分析:

          基本结果同方法一,这里注意看,进过DCT变换后的系数矩阵,低频部分集中在左上角,高频部分集中在右下角。

    5、JPEG2000简介

     <1>核心

          放弃了JPEG中以离散余弦变换DCT为基础的区块编码方式,采用离散小波变换为基础的多解析编码方式;

    JPEG2000将彩色静态画面采用的JPEG编码方式2值图像采用的JBIG(Joint Binary Image Group)编码方式无损低压缩率采用的JPEG LS统一起来,成为应对各种图像的通用编码方式。

      <2>优势

          高压缩率 

          无损压缩 

          渐进传输 

          感兴趣区域压缩

      <3>应用

          目前,支持JPEG2000的软件已经出现,如ACD See JPEG2000 插件,相信在不久的将来,JPEG2000无论是在传统的JPEG市场(如数码相机、扫描仪等),还是在网路传输、无线通讯、医疗影像等应用领域都将大有发展。 

    展开全文
  • 图像压缩算法 DCT变换

    2015-07-15 11:11:16
    讲述了图像压缩的的原理DCT变换原理,分析了图像的相关性,以及DCT对于图像压缩的意义
  • MATLAB DCT变换原理和源码

    万次阅读 2017-01-16 09:15:37
    图像处理中常用的正交变换除了傅里叶变换外,还有其他一些有用的...离散余弦变换表示为DCT( Discrete Cosine Transformation),常用于图像处理和图像识别等。 一维离散余弦变换变换  (1)  

    图像处理中常用的正交变换除了傅里叶变换外,还有其他一些有用的正交变换,其中离散余弦就是一种。离散余弦变换表示为DCT( Discrete Cosine Transformation),常用于图像处理和图像识别等。

    一维离散余弦变换

    正变换

                                       (1)

                                (2)

    式中F(u)是第u个余弦变换系数,u是广义频率变量,u=1,2,3......N-1; f(x)是时域N点序列, x=0,1,2......N-1

    反变换

      (3)

    显然,式(1)式(2)和式(3)构成了一维离散余弦变换对。

    二维离散余弦变换

    正变换

      (4)

    式(4)是正变换公式。其中f(x,y)是空间域二维向量之元素, x,y=0,1,2,......N-1;F(u,v)是变换系数阵列之元素。式中表示的阵列为N×N

    反变换

     (5)

    式中的符号意义同正变换式一样。式(4)和式(5)是离散余弦变换的解析式定义。

    矩阵表示法

    更为简洁的定义方法是采用矩阵式定义。根据以上公式定义可知,离散余弦变换的系数矩阵可以写成如下:



    如果令N=4,那么由一维解析式定义可得如下展开式。


    写成矩阵式


    若定义F(u)为变换矩阵,A为变换系数矩阵,f(x)为时域数据矩阵,则一维离散余弦变换的矩阵定义式可写成如下形式

    [F(u)]=[A][f(x)]                       6

    同理,可得到反变换展开式


    写成矩阵式

    [f(x)]=[A]T[F(u)]                      (7

    二维离散余弦变换也可以写成矩阵式:

    [F(u,v)]=[A][f(x,y)][A]T            (8

    [f(x,y)]=[A]T[F(u,v)][A]                     

    式中[f(x,y)]是空间数据阵列,A是变换系数阵列,[F(u,v)]是变换矩阵,[A]T是[A]的转置。

    对二维图像进行离散余弦变换

    由以上对二维离散余弦变换的定义及公式(7)可知,求二维图像的离散余弦变换要进行以下步骤:

    1.获得图像的二维数据矩阵f(x,y)

    2.求离散余弦变换的系数矩阵[A];

    3.求系数矩阵对应的转置矩阵[A]T;

    4.根据公式(7[F(u,v)]=[A][f(x,y)][A]T 计算离散余弦变换;

    源代码:

    [java] view plain copy
    1. package cn.edu.jxau.image;  
    2.   
    3. import java.awt.image.BufferedImage;  
    4.   
    5. /** 
    6.  * 图像的变换 
    7.  * @author luoweifu 
    8.  * 
    9.  */  
    10. public class Transformation {  
    11.     /** 
    12.      * 要进行DCT变换的图片的宽或高 
    13.      */  
    14.     public static final int N = 256;  
    15.       
    16.     /** 
    17.      * 傅里叶变换 
    18.      * @return 
    19.      */  
    20.     public int[] FFT() {  
    21.           
    22.         return null;  
    23.     }  
    24.       
    25.     /** 
    26.      * 离散余弦变换 
    27.      * @param pix 原图像的数据矩阵 
    28.      * @param n 原图像(n*n)的高或宽 
    29.      * @return 变换后的矩阵数组 
    30.      */  
    31.     public int[] DCT(int[] pix, int n) {          
    32.         double[][] iMatrix = new double[n][n];   
    33.         for(int i=0; i<n; i++) {  
    34.             for(int j=0; j<n; j++) {  
    35.                 iMatrix[i][j] = (double)(pix[i*n + j]);  
    36.             }  
    37.         }  
    38.         double[][] quotient = coefficient(n);   //求系数矩阵  
    39.         double[][] quotientT = transposingMatrix(quotient, n);  //转置系数矩阵  
    40.           
    41.         double[][] temp = new double[n][n];  
    42.         temp = matrixMultiply(quotient, iMatrix, n);  
    43.         iMatrix =  matrixMultiply(temp, quotientT, n);  
    44.           
    45.         int newpix[] = new int[n*n];  
    46.         for(int i=0; i<n; i++) {  
    47.             for(int j=0; j<n; j++) {  
    48.                 newpix[i*n + j] = (int)iMatrix[i][j];  
    49.             }  
    50.         }  
    51.         return newpix;  
    52.     }  
    53.     /** 
    54.      * 矩阵转置 
    55.      * @param matrix 原矩阵 
    56.      * @param n 矩阵(n*n)的高或宽 
    57.      * @return 转置后的矩阵 
    58.      */  
    59.     private double[][]  transposingMatrix(double[][] matrix, int n) {  
    60.         double nMatrix[][] = new double[n][n];  
    61.         for(int i=0; i<n; i++) {  
    62.             for(int j=0; j<n; j++) {  
    63.                 nMatrix[i][j] = matrix[j][i];  
    64.             }  
    65.         }  
    66.         return nMatrix;  
    67.     }  
    68.     /** 
    69.      * 求离散余弦变换的系数矩阵 
    70.      * @param n n*n矩阵的大小 
    71.      * @return 系数矩阵 
    72.      */  
    73.     private double[][] coefficient(int n) {  
    74.         double[][] coeff = new double[n][n];  
    75.         double sqrt = 1.0/Math.sqrt(n);  
    76.         for(int i=0; i<n; i++) {  
    77.             coeff[0][i] = sqrt;  
    78.         }  
    79.         for(int i=1; i<n; i++) {  
    80.             for(int j=0; j<n; j++) {  
    81.                 coeff[i][j] = Math.sqrt(2.0/n) * Math.cos(i*Math.PI*(j+0.5)/(double)n);  
    82.             }  
    83.         }  
    84.         return coeff;  
    85.     }  
    86.     /** 
    87.      * 矩阵相乘 
    88.      * @param A 矩阵A 
    89.      * @param B 矩阵B 
    90.      * @param n 矩阵的大小n*n 
    91.      * @return 结果矩阵 
    92.      */  
    93.     private double[][] matrixMultiply(double[][] A, double[][] B, int n) {  
    94.         double nMatrix[][] = new double[n][n];  
    95.         double t = 0.0;  
    96.         for(int i=0; i<n; i++) {  
    97.             for(int j=0; j<n; j++) {  
    98.                 t = 0;  
    99.                 for(int k=0; k<n; k++) {  
    100.                     t += A[i][k]*B[k][j];  
    101.                 }  
    102.                 nMatrix[i][j] = t;          }  
    103.         }  
    104.         return nMatrix;  
    105.     }  
    106.       
    107. }  

    展开全文
  • JPEG图像压缩原理DCT离散余弦变换

    千次阅读 2018-03-13 17:12:03
    原文网址:http://blog.csdn.net/newchenxf/article/details/51719597 转载请注明出处喔 1 前言 JPEG是joint Photographic Experts Group(联合图像专家组)的缩写,文件后辍名为”.jpg”或”...



    原文网址:http://blog.csdn.net/newchenxf/article/details/51719597
    转载请注明出处喔


    1 前言

    JPEG是joint Photographic Experts Group(联合图像专家组)的缩写,文件后辍名为”.jpg”或”.jpeg”。
    jpg图片可以说是最常见的图片格式了,基本上你的自拍照,要么是png的,要么就是jpeg的了。(有关jpeg和png的区别,请参考我的另一博文【jpeg 与 png 图片格式的区别】)
    但它是一种有损压缩。支持多种压缩级别,压缩比率通常在10:1到40:1之间,压缩比越大,品质就越低;相反地,压缩比越小,品质就越好。

    那么,JPEG是如何压缩的呢?靠的就是传说中的DCT(离散余弦变换)。

    下图是JPEG压缩/解压缩的流程图。我想你最大的疑问估计就是DCT了。
    这里写图片描述

    2 JPEG压缩流程

    2.1 以8x8的图象块为基本单位进行编码

    如下图所示。比如一个160x160大小的原始图像,就可以分成20x20个8x8图像块。
    这里写图片描述
    每个图像块共64个像素。像素可以用RGB或YUV表示,需要3个byte。所以严格来说,上图3个箭头代表的数据,指的是RGB/YUV的某一个值,比如Y。

    2.2 将RGB转换为亮度-色调-饱和度系统(YUV),并重新采样

    YUV是什么?它也是一种很不错的图像数据表示方法,特别是在视频领域。
    Y:指颜色的明视度、亮度、灰度值;
    U:指色调;
    V:指饱和度。

    YUV是一个统称,其实有很多具体格式,比如YUV420, YUV444, YUV422。
    YUV的某些格式,和RGB比起来,其数据量要少很多。
    比如YUV420,每个像素需要一个Y,每4个像素需要一个U/V,因此一个8*8图像块,数据量只要8x8x3/2 = 96byte。而RGB需要8x8x3 = 192byte。少了一半的数据量。现在很多视频都是YUV420作为色域。
    当然啦,在本次转换,用的是YUV444, 也就是每个像素都有YUV的值。

    YUV与RGB可以互相转换。
    Y=0.299R+0.587G+0.114B
    U=0.148R-0.289G+0.473B
    V=0.615R-0.515G-0.1B

    2.3 FDCT与IDCT

    一个是正变换,一个是逆变换。反正都可以称为离散余弦变换。
    根据8*8的二维DCT定义
    这里写图片描述
    其中:0<= u, v < 8
    这里写图片描述
    a(v) = a(u)
    这里写图片描述 是输入8x8像素的坐标。
    这里写图片描述 是输出的8x8变换结果的坐标。

    不要把上式看的有多难,也不要被“离散余弦变换”这个词给吓到,其实他没什么(如果你非要去追究,那就打开“信号与系统”的书复习一下吧,我拦不住你哈),上式其实就是一个运算公式而已。
    输入就是8x8的数据矩阵,经过计算,输出还是一个8x8的数据矩阵。
    其实上式可以简化为:
    这里写图片描述
    并且A和A转置矩阵都是已知的。所以,说白了,就是个矩阵运算。对程序来说,很简单。

    称G(0,0),也就是输出8x8矩阵的(0,0)坐标的值,为直流系数,其他为交流系数。
    之所以称它为直流系数,是因为当u, v = 0时,cos()结果都为0,所以最后结果就是输入矩阵的8x8的每个数值的和,再乘于a(u) x a(v) x 1/4 = 1/8。

    当然了,输入数据其实是有3个的,也就是YUV,因此对每个8x8的原始图像数据,需要做3次DCT。

    2.4 量化与反量化

    定义:将DCT变换后的临时结果,除以各自量化步长并四舍五入后取整,得到量化系数。
    为什么可以量化?!
    因为经过DCT后,数据就不同了,左上方都是大数值,右下方都是小数值。比如左上方都是几十几百的,右下方附近,都是个位数,那么,大数值和小数值就可以分别量化。

    在术语里,左上方称为低频数据,右下方称为高频数据
    你要是不理解,可以这么想,既然G(0,0)都是直流分量了,那频率不就是0?不就是所谓的低频?^^

    还是不理解?好吧,那你也可以这么想:
    比如cos(ax),a是常数,x是变量。那么,根据频率f = a/2π,a越大,函数的频率越高。
    看看DCT公式:
    这里写图片描述
    u,v 越大,则越在右下方对吧。当计算某个G(u, v)时,x, y是变量,u, v相当于常数,当u/v越大,则频率越高!
    这就是为啥右下方称为高频数据了!

    好了,别走偏了,还继续说量化。
    JPEG系统分别规定了亮度分量和色度分量的量化表,色度分量相应的量化步长比亮度分量大。

    对量化系数的处理和组织
    思想:JPEG采用定长和变长相结合的编码方法。
    直流系数:通常相邻8*8图象块的DC分量很接近,因此JPEG对量化后的直流分量采用无失真DPCM编码。通常JPEG要保存所需比特数和实际差值。

    交流系数:经过量化后,AC分量出现较多的0。JPEG采用对0系数的行程长度编码。而对非0值,则要保存所需数和实际值。
    ZIG-ZAG排序:为使连续的0个数增多,采用Z形编码。
    这里写图片描述
    你要是不理解,看看下面的例子,就知道为啥ZIG-ZAG可以俘获更多的0了!

    3 应用举例

    3.1 编码

    某个图象的一个8*8方块,的亮度值。
    这里写图片描述

    由于一个字节是0~255,为了减小绝对值波动,先把数值移位一下,变成-128~127。
    这里写图片描述

    接着,根据DCT变换公式,各种计算,获得临时结果。
    这里写图片描述

    根据亮度量化表量化后得到的量化系数矩阵
    这里写图片描述

    获得量化结果:
    这里写图片描述

    可见,新的数据,很小,很多是0。正如上文所说,这么多0,完全可以用游程编码,大大缩小数据量。

    3.2 解码

    先游程编码恢复为
    这里写图片描述

    然后,根据量化表,恢复
    这里写图片描述

    再根据反离散余弦变换的公式:
    这里写图片描述

    结果为:
    这里写图片描述

    再右移127,恢复原始。
    这里写图片描述

    和原始图像的数据相比,基本是一样的,或者近似的!

    4 其他

    必须再强调的是,JPEG压缩是有损失的,从上面的例子就看出来,输出结果并不是完全等于输入。
    此外,JPEG压缩比例是可以控制的,只不过图像质量会变差。比如
    压缩率:10
    这里写图片描述

    压缩率:50
    这里写图片描述

    JPEG压缩比例,就是通过控制量化的多少来控制。比如,上面的量化矩阵Q,如果我把矩阵的每个数都double一下,那是不是会出现更多的0?!说不定都只有G(0, 0)非0,其他都是0,如果这样,那编码时就可以更省空间啦,N个0只要一个游程编码搞定,数据量超小。但也意味着,恢复时,会带来更多的误差,图像质量也会变差了。

    参考:
    https://en.wikipedia.org/wiki/JPEG#Discrete_cosine_transform

    展开全文
  • 图像DCT原理C语言实现

    2020-04-04 21:35:20
    DCT 离散余弦变换,常用图像变换算法 分割:将图像分割成88或1616的小块 DCT变换:对每块进行DCT变换 舍弃高频系数(AC系数),保留低频系数(DC系数) 高频系数一般保存的是图像的边界、纹理信息 低频系数保存的...
  • 图像DCT变换

    千次阅读 2018-05-05 14:36:04
    参考1:JPEG压缩原理DCT离散余弦变换参考2:H.264中整数DCT变换,量化,反量化,反DCT究竟是如何实现的?(无代码,无真相)
  • 目的:对图像进行离散傅立叶变换(DFT)、离散余弦变换(DCT)变换,并对图像傅立叶变换的结果进行必要解释,使用IDFT、IDCT对图像进行重建,分析重建后的图像。操作过程中获取两帧图像,对这两帧图像分别进行 DFT、DCT...
  • 图像dct变换matlab代码 ImageProcessing 图像视频处理的代码 根据拍摄的图像完成以下任务(Matlab 语言实现):(30 分) 1、编程实现图像傅立叶高通、低通滤波,给出算法原理及实验结果; 2、找一幅曝光不足的灰度...
  • 主要就是实现了数字水印的嵌入提取和在不同攻击如旋转剪切噪声等下的提取效果差异的比对1 DCT变换原理2 DCT变换的特点 在基于DCT的变换...图像经DCT后,得到的DCT图像有三个特点: (1). 系数值全部集中到0值附...
  • JPEG是joint Photographic Experts Group(联合图像专家组)的缩写,文件后辍名为”.jpg”或”.jpeg”。  jpg图片可以说是最常见的图片格式了,基本上你的自拍照,要么是png的,要么就是jpeg的了。(有关jpeg和...
  • 本节介绍图像压缩编码的基本原理图像数据压缩和解压缩电路的基本结构。它们是看影碟机电路图的基础知识。  一、图像压缩的基本途径  图像的数据量极大,必须对其数据总量大大压缩,才能够存储在直径12cm的光盘...
  • 图像DCT变换2.1 DCT原理分析2.2 DCT变换的过程分析2.3 彩色图片的DCT变换2.4 图片的分块变换2.5用客观质量评估方法评价压缩后图像使用客观质量评估方法的原因SSIM的原理简述MATLAB实现SSIM3. 图像的DFT变换3.1 ...
  •   与一维的有限长离散非周期信号存在傅里叶变换(DFT)一样,图像作为一个二维离散信号同样存在着二维离散变换(注意这里是介绍一个通用的概念,二维离散变换,包括了DFT、DCT等多种变换在内的一种通式写法),其...
  • DCT变换和JPEG量化对图像质量的影响

    千次阅读 2019-03-23 11:23:56
    a)框架: ...首先将图像分为8X8大小的非重叠块,对每个块进行DCT变换变换公式为 变换完成之后,对于每个块进行量化,量化表为 量化完成后,正向过程结束。接下来是恢复过程,恢复过程分为...
  • 理解JPEG图像压缩算法,DCT变换

    万次阅读 多人点赞 2018-07-03 11:57:35
    理解JEPG原理 JEPG不是一种文件格式,而是一类图像压缩算法. 1.彩色图像 灰度图像 灰度,一个pixel取值0-255. 彩色图像 需要比灰度图像更多的存储空间, 事实上, 所有颜色都可以用红绿蓝三原色的组合表示...
  • 常用于图像数据的压缩,通过将图像分成大小相等(一般为8*8)的块,利用DCT对其进行变换,得到更加简洁的数据。因为图像像素间存在较大的空间相关性,DCT可以大大减小这些相关性,使图像能量集中在左上角区域,从而...
  • 本试验是在信息论与编码课程中必做的一个试验 对于;理解DCT变换原理和方法都是很重要 的 本论文提供比较完整的论文 程序 图片 等等
  • 这几天一直在看MPEG编解码的原理,由于利用ffmpeg实在提不出DCT系数,就根据MPEG的编码原理来看看这个DCT系数到底什么样,于是在OpenCV中实现了一下图像压缩这一块,基于8*8块DCT变换,同时也再进行了一下反变换,...
  • 靠的就是传说中的DCT(离散余弦变换)。 2 JPEG压缩流程 2.1 以8x8的图象块为基本单位进行编码 如下图所示。比如一个160x160大小的原始图像,就可以分成20x20个8x8图像块。 每个图像块共64个像素。像素可...
  • DCT算法的原理和优化

    万次阅读 多人点赞 2017-12-07 18:58:39
    未经博主允许,禁止转载! 离散余弦变换DCT for Discrete Cosine Transform)是与傅里叶变换相关...在压缩算法中,现将输入图像划分为8*8或16*16的图像块,对每个图像块作DCT变换;然后舍弃高频的系数,并对余下...
  • DCT变换浅析-应用于图像压缩

    千次阅读 2013-06-13 10:20:25
    DCT实际就是把信号源的数据内容转换到另一种信号空间,在这种新的信号空间中更加容易理解、编码压缩。...其中我们有时候是用0---(N-1)的,但是一般图像都是已8*8为块结构的,图像处理单元是块,所以这里就直接
  • JPEG压缩原理DCT离散余弦变换 量化

    千次阅读 2018-05-24 15:11:32
    JPEG压缩原理DCT离散余弦变换2016年06月20日 15:58:47阅读数:19214原文网址:http://blog.csdn.net/newchenxf/article/details/51719597 转载请注明出处喔1 前言JPEG是joint Photographic Experts Group(联合...
  • 本文首先介绍了正交变换的性质和变换编码的原理,然后将图像序列作为平稳马尔柯夫序列,对1×8DCT图像压缩编码作了理论分析和计算机模拟。模拟结果与分析是一致的。
  • 二维DCT变换的实现

    千次阅读 2017-11-01 21:12:30
    DCT原理参考离散余弦变换原理与应用 JPEG压缩原理 JPEG压缩原理与DCT离散变换 JPEG图像压缩算法流程详解JPEG压缩算法流程二维DCT变换实现代码#include #include #include #include #include #include usin
  • openGL shader实现DCT变换

    2019-01-22 20:55:46
    目标:实现图像的DCT变换 过程:  1)通过opencv读取图像;  2) 构建openGL窗口及... 4) 通过FBO离屏渲染得到DCT图像;  5) 和opencv自带的DCT函数结果对比。  4)在窗口中显示图像。   上代码: ...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 193
精华内容 77
关键字:

dct图像变换原理