JPEG图像压缩编解码的设计与实现

——程序设计实践报告

目录

一.工作总结 ..............................................................................................................................2

9月 3-4 日:...........................................................................................................................2

9月 5-7 日:....................................................................................................................……..2

9月 7-10日:..................................................................................................................……….2

9月11-18日: .......................................................................................................................2

二. JPEG 简介  ..........................................................................................................................2

三.JPEG 压缩步骤  ...................................................................................................................3

3.1  颜色模式转换 .............................................................................................................……..3

3.2  采样.........................................................................................................................................3

3.3  分块........................................................................................................................................3

3.4  离散余弦变换 .....................................................................................................................3

3.5  Zigzag扫描排序 .............................................................................................................…….4

3.6  量化.........................................................................................................................................4

3.7  DC系数的差分脉冲调制编码 ............................................................................................5

3.8  AC系数的行程长度编码(RLC) ............................................................................................5

3.9  熵编码 .................................................................................................................................5

四. JPEG解码算法流程详解............................................................................................................5

4.1读取Huffman表........................................................................................................................5

4.2构建Huffman树........................................................................................................................5

4.3 DC系数的Huffman解码..........................................................................................................6

4.4 AC系数的Huffman解码..........................................................................................................6

4.5 反量化......................................................................................................................................7

4.6 反Zig-zag扫描.........................................................................................................................7

4.7 DCT逆变换................................................................................................................................8

4.8 颜色模式转换.........................................................................................................................10

五.程序说明 ............................................................................................................................10

5.1 程设目标 .............................................................................................................................10

5.2 功能说明 ....................................................................................................………………………10

六.程序测试与分析 ..................................................................................................................11

6.1  编码.......................................................................................................................................11

6.2  解码.....................................................................................................................................12

6.3  修改 DCT 参数并求 PSNR..................................................................................................15

七.总结与心得 .........................................................................................................................16

八. 参考资料.................................................................................................................................17

九. 附录.........................................................................................................................................17

一.工作总结

二.JPEG 简介

JPEG 是 Joint Photographic Exports Group 的英文缩写,中文称之为联合图像专家小组。该小组隶属于 ISO 国际标准化组织,主要负责定制静态数字图像的编码方法,即所谓的 JPEG算法。JPEG 专家组开发了两种基本的压缩算法、两种熵编码方法、四种编码模式。如下所示:

压缩算法:

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

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

熵编码方法:

(1)Huffman 编码;

(2)算术编码;

编码模式:

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

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

递增;

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

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

在实际应用中,JPEG 图像编码算法使用的大多是离散余弦变换、Huffman 编码、顺序编码模式。这样的方式,被人们称为 JPEG 的基本系统。这里介绍的 JPEG 编码算法的流程,也是针对基本系统而言。基本系统的 JPEG 压缩编码算法一共分为 11 个步骤:颜色模式转换、采样、分块、离散余弦变换(DCT)、Zigzag  扫描排序、量化、DC 系数的差分脉冲调制编码、DC系数的中间格式计算、AC 系数的游程长度编码、AC 系数的中间格式计算、熵编码。

三.JPEG 压缩步骤

3.1 颜色模式转换

JPEG 采用的是 YCrCb 颜色空间,而 BMP 采用的是 RGB 颜色空间,要想对 BMP 图片进行压缩,首先需要进行颜色空间的转换。YCrCb颜色空间中,Y 代表亮度,Cr,Cb则代表色度和饱和度(也有人将 Cb,Cr 两者统称为色度),三者通常以 Y,U,V 来表示,即用 U 代表 Cb,用 V 代表 Cr。RGB 和 YCrCb之间的转换关系如下所示.

Y = 0.299R+0.587G+0.114B

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

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

3.2 采样

研究发现,人眼对亮度变换的敏感度要比对色彩变换的敏感度高出很多。因此,我们可以认为Y分量要比Cb,Cr 分量重要的多。在 BMP 图片中,RGB 三个分量各采用一个字节进行采样,也就是我们常听到的 RGB888 的模式;而 JPEG 图片中,通常采用两种采样方式:YUV411 和 YUV422,它们所代表的意义是 Y,Cb,Cr 三个分量的数据取样比例一般是 4: 1: 1 或者 4:2:2(4:1:1 含义就是:在 2x2 的单元中,本应分别有4个 Y,4个 U,4个V值,用12个字节进行存储。经过 4:1:1 采样处理后,每个单元中的值分别有4个 Y、1个U、1个V,只要用6个字节就可以存储了)。这样的采样方式,虽然损失了一定的精度但也在人眼不太察觉到的范围内减小了数据的存储量。当然, JPEG 格式里面也允许将每个点的 U,V 值都记录下来;

3.3 分块

由于后面的 DCT 变换是是对 8x8 的子块进行处理的,因此,在进行 DCT 变换之前必须把源图象数据进行分块。源图像中每点的 3个分量是交替出现的,先要把这 3 个分量分开,存放到 3 张表中去。然后由左及右,由上到下依次读取 8x8 的子块,存放在长度为 64 的表中,即可以进行 DCT 变换。注意,编码时,程序从源数据中读取一个 8x8 的数据块后,进行DCT 变换,量化,编码,然后再读取、处理下一个8*8的数据块。

JPEG编码是以每 8x8个点为一个单位进行处理的.  所以如果原始图片的长宽不是  8  的倍数,都需要先补成 8 的倍数, 使其可以进行分块的处理。将原始图像数据分为 8*8 的数据单元矩阵之后,还必须将每个数值减128,然后一一带入DCT变换公式,即可达到 DCT变换的目的。图像的数据值减128,是因为DCT公式所接受的数字范围是-128 到 127之间。

3.4 离散余弦变换

DCT(Discrete Cosine Transform,离散余弦变换),是码率压缩中常用的一种变换编码方法。任何连续的实对称函数的傅里叶变换中只含有余弦项,因此,余弦变换同傅里叶变换一样具有明确的物理意义。DCT 是先将整体图像分成 N*N 的像素块,然后针对 N*N 的像素块逐一进行 DCT 操作。需要提醒的是,JPEG 的编码过程需要进行正向离散余弦变换,而解码过程则需要反向离散余弦变换。

3.5 Zigzag 扫描排序

DCT将一个8x8的数组变换成另一个8x8的数组.  但是内存里所有数据都是线形存放的,  如果我们一行行的存放这 64个数字,  每行的结尾的点和下行开始的点就没有什么关系,  所以JPEG规定按如下图中的数字顺序依次保存和读取64个DCT的系数值。这样数列里的相邻点在图片上也是相邻的了。不难发现,这种数据的扫描、保存、读取方式,是从 8*8 矩阵的左上角开始,按照英文字母 Z 的形状进行扫描的,一般将其称之为Zigzag 扫描排序。如下图所示:

3.6 量化

图像数据转换为 DCT 频率系数之后,还要进行量化阶段,才能进入编码过程。量化阶段需要两个 8*8 量化矩阵数据,一个是专门处理亮度的频率系数,另一个则是针对色度的频率系数,将频率系数除以量化矩阵的值之后取整,即完成了量化过程。当频率系数经过量化之后,将频率系数由浮点数转变为整数,这才便于执行最后的编码。不难发现,经过量化阶段之后,所有的数据只保留了整数近似值,也就再度损失了一些数据内容。在 JPEG 算法中,由于对亮度和色度的精度要求不同,分别对亮度和色度采用不同的量化表。前者细量化,后者粗量化。

下图给出 JPEG 的亮度量化表和色度量化表,该量化表是从广泛的实验中得出的。当然,你也可以自定义量化表。


3.7 DC 系数的差分脉冲调制编码

8*8 的图像块经过 DCT 变换之后得到的 DC 系数有两个特点:

(1)系数的数值比较大;

(2)相邻的 8*8 图像块的 DC 系数值变化不大;

根据这两个特点,DC 系数一般采用差分脉冲调制编码 DPCM(Difference  Pulse  Code Modulation),即:取同一个图像分量中每个 DC 值与前一个 DC 值的差值来进行编码。对差值进行编码所需要的位数会比对原值进行编码所需要的位数少了很多。假设某一个 8*8 图像块的 DC 系数值为 15,而上一个 8*8 图像块的 DC 系数为 12,则两者之间的差值为 3。

3.8  AC 系数的行程长度编码(RLC)

量化之后的 AC 系数的特点是, 63 个系数中含有很多值为 0 的系数。因此,可以采用行程编码 RLC(Run Length Coding)来更进一步降低数据的传输量。利用该编码方式,可以将一个字符串中重复出现的连续字符用两个字节来代替,其中,第一个字节代表重复的次数,第二个字节代表被重复的字符串。例如,(4,6)就代表字符串“6666”。但是,在 JPEG 编码中,RLC 的含义就同其原有的意义略有不同。在 JPEG 编码中,假设 RLC 编码之后得到了一个(M,N)的数据对,其中 M 是两个非零AC系数之间连续的 0 的个数(即,行程长度),N是下一个非零AC系数的值。采用这样的方式进行表示,是因为 AC 系数当中有大量的 0,而采用 Zigzag 扫描也会使得 AC 系数中有很多连续的 0 的存在,如此一来,便非常适合于用RLC 进行编码。

3.9  熵编码

在得到 DC 系数的中间格式和 AC 系数的中间格式之后,为进一步压缩图象数据,有

必要对两者进行熵编码。JPEG 标准具体规定了两种熵编码方式:Huffman 编码和算术编码。

JPEG 基本系统规定采用Huffman编码(因为不存在专利问题),但JPEG标准并没有限制 JPEG算法必须用 Huffman 编码方式或者算术编码方式。

Huffman 编码:对出现概率大的字符分配字符长度较短的二进制编码,对出现概率小的字符分配字符长度较长的二进制编码,从而使得字符的平均编码长度最短。 Huffman 编码的原理请参考数据结构中的 Huffman 树或者最优二叉树。

四. JPEG解码算法流程详解

 

文件格式,将JPEG文件相关的字段信息一一读取出来,并进行相应的解析。例如,图像的宽度、高度、量化表、Huffman表、水平/垂直采样因子等。一般而言,JFIF格式文件的读取顺序依次为:SOI字段;APP0字段;APPn字段;DQT字段;SOFO字段;DHT字段;SOS字段;压缩数据字段;EOI字段;

读取JPEG文件相关信息的时候,有两点需要特别注意:

(a)由于JPEG中以0XFF来做为特殊标记符,因此,如果某个像素的取值为0XFF,那么实际在保存的时候,是以0XFF00来保存的,从而避免其跟特殊标记符0XFF之间产生混淆。所以,在读取文件信息的时候,如果遇0XFF00,就必须去除后面的00;即,将0XFF00当做0XFF;

(b)JPEG文件中,一个字(16位)的存储是采用了Motorola格式(big-endian),而不是我们常用的Intel格式(little-endian)。因此,如果需要的话,请在处理之间进行依次高低字节的转换。

4.1  读取Huffman表

在标记码DHT之后,包含了一个或者多个Huffman表(通常是4个表)。对于一个Huffman表而言,它包含了以下三部分内容:

(a)表ID和表类型;1个字节;仅有4个可选的取值,0X00,0X01,0X10,0X11,分别表示DC直流0号表,DC直流1号表,AC交流0号表,AC交流1号表;

(b)不同位数的码字数量;前面提到,JPEG中的Huffman编码表是按照编码长度的位数以表格的形式保存的,而且,Huffman编码表的位数只能是1--16位,因此,这里用16个字节来分别表示1--16位的每种位长的编码在Huffman树中的个数。

(c)编码内容;该字段记录了Huffman树中各个叶子节点的权重,上一个字段(不同位数的码字数量)的16个数值之和,就是本字段的长度,也就是Huffman树中叶子节点的个数。

这里,我们不妨以下面一段Huffman表的数据为例来说明情况(均以16进制表示):

11 00 02 02 00 05 01 06 01 00 00 00 00 00 00 00 00

00 01 11 02 21 03 31 41 12 51 61 71 81 91 22 13 32

以上数据串中第一行代表了Huffman表ID、表类型、不同位数的码字数量信息;

第一行的第一个字节0X11代表了表的ID和类型是AC交流1号表;

第一行的第2到第17字节代表了不同位数码字的数量。即,第2个字节00表示没有位数为1的编码;第3个和第4个字节的02表示位数为2和位数为3的编码各有两个;第5个字节的00表示没有位数为5的编码。。。。此外,通过这些数据我们发现,此Huffman树有0+2+2+0+5+1+6+1=17个叶子节点。

第二行为编码的内容,表明17个叶子节点按照从小到大的顺序排列,即,权值依次为0,1,11,2,21,3,31,41...

4.2  构建Huffman树

读取到Huffman表的数据之后,就需要构建Huffman树了。其具体规则如下

(a)第一个编码的数字必定为0;如果第一个编码的位数为1,就被编码为0;如果第一个编码的位数为2,就被编码为00;如果第一个编码的位数为3,就被编码为000。。。

(b)从第二个编码开始,如果它和它前面编码具有相同的位数,则当前编码是它前面的编码加1;如果它的编码位数比它前面的编码位数大,则当前编码时它前面的编码加1之后再在后面添加若干个0,直到满足编码位数的长度为止。

还是以上面的数据为例:

第一行的第2个字节00表示没有位数为1的编码;

第一行的第3个字节02表示位数为2的编码有2个;由于没有位数为1的编码,因此这里位数为2的编码中的第一个为00,第二个为00+1=01;

第一行的第4个字节02表示位数为3的编码有2个;因此,这里位数为3的编码中的第一个为01+1=10,然后添加1个“0”,得到100;位数为3的编码中的第二个为100+1=101;

依次类推,可以得到如下的Huffman树

序号

码字长度

码字

权值

1

2

00

0x00

2

2

01

0x01

3

3

100

0x11

4

3

101

0x02

5

5

11000

0x21

6

5

11001

0x03

7

5

11010

0x31

8

5

11011

0x41

9

5

11100

0x12

10

6

111010

0x51

11

7

1110110

0x61

12

7

1110111

0x71

13

7

1111000

0x81

14

7

1111001

0x91

15

7

1111010

0x22

16

7

1111011

0x13

17

8

11111000

0x32

特别提醒的是,如果中间有某个位数的编码缺失,例如,没有4位的编码,则应该在3位的编码后面加1,添加2个“00”补足5位,形成下一个5位编码。

4.3 DC系数的Huffman解码

JPEG编码阶段我们讲到,DC系数是以(A,B)的中间形式进行编码的。其中的A代表了B的二进制编码位数,B则利用VLI进行编码。另外,8*8的图像块经过DCT变换之后得到的8*8的系数矩阵,经过Huffman编码及RLE编码之后,写入编码数据的时候,DC系数也是被写在数据流最前面的。因此,解码的时候,DC系数也是最先被读取出来,假设,我们一次性读入了若干个字节长度的数据。其中的第一个字节代表了DC系数的Huffman编码,通过查找DC系数的Huffman表(亮度表或色度表),得到该Huffman编码所在的组编号,该编号就是DC系数中间格式(A,B)中的A,也就是B的位数。例如,A=2,就代表B采用2位二进制数进行编码。这样一来,读取接下来的A位二进制数,将其译码为十进制,就得到了DC系数的差值。将该差值与上一个DC系数值相加,就得到了真正的当前DC系数的值。

4.4  AC系数的Huffman解码

处理完DC系数之后,接下来进行AC系数的译码工作,显然,这里依然需要读取一个Huffman编码,通过查找AC系数的Huffman编码表,进行解码,我们得到(A,B)的数据对,其中的A代表了0的个数,而B则代表了后面数据的位数。例如,(2,3)就代表了当前AC系数之前有2个0,下一个需要读取的二进制数据是3位。需要提醒的是,(0,0)代表EOB,即8*8块的编码结束。接着,读取B位二进制数据,进行译码,我们就得到了AC系数的值。如此反复循环,直到遇到EOB,或者读取了63个AC系数,我们就完成了一个8*8块的系数矩阵的译码工作。

4.5  反量化

在译码得到了8*8的系数矩阵之后,我们需要进行反量化工作。该步骤,就是将前一个步骤得到的8*8系数矩阵分别乘以8*8的量化矩阵即可。

4.6  反Zig-zag扫描

JPEG编码过程中,为了编码方便,采用了Zig-zag扫描,因此,这里需要进行反Zig-zag扫描,重新排列8*8的反量化系数矩阵。反Zig-zag扫描的输入时8*8矩阵,输出依然是8*8矩阵,只不过,数据的排列方式有所不同而已。

4.7  DCT逆变换

DCT变换,将原始图像变换到频域,而DCT逆变换,就是要将数据从频域变换回时域.DCT逆变换的计算公式为:






左边为未转秩的数据顺序,右边为转秩之后的数据顺序。

4.8颜色模式转换

BMP图片是以RGB颜色空间进行保存的,因此,将JPEG解码为BMP必须进行颜色模式的转换。另外,由于DCT要求的定义域对称,所以,在编码的时候将RGB的数值范围从[0,255]统一减去128,将数值范围转换到[-128,127]的范围内。因此,解码的时候,必须为每个颜色分量加上128。另外需要注意的是,通过解码变换之后得到的RGB的值有可能超过255或者小于0;如果小于0,就截断为0,如果大于255,就截取为255;

五.程序说明

5.1 程设目标

5.1.1. 对于任意给定的bmp格式图像进行压缩输出JPEG图像,并给出两者之间的PSNR值。

5.1.2. 对于任意给定的JPEG图像,能对其进行解码并正确显示,并能读出其量化表、量化后DCT系数等等。

5.1.3.对于任意给定的JPEG图像,对其量化后部分DCT系数(随机选取)进行适度修改(如+-1),然后再将其存储为JPEG图像。给出该图像与原JPEG图像之间的PSNR值。

5.2 功能说明

直接运行程序,按提示进行操作。已实现的功能为bmp 压缩为jpg、jpg 解压为bmp。

5.2.1 bmp 压缩为jpg

直接运行程序,按提示进行操作。(输入文件名,在原目录下输出名为“lena3.jpg”的压缩后图像。若输入的文件不是jpg后缀的图像,程序会报错。)

5.2.2 jpg 解压为bmp

直接运行程序,按提示进行操作。(输入文件名,在原目录下输出名为“lena3.bmp”的解码后图像。同时会在控制台显示读出其量化表、量化后DCT系数。要求输入的文件后缀为bmp)

5.2.3 修改DCT 参数并求 PSNR

对其量化后部分 DCT 系数(随机选取)进行适度修改(如+-1),然后再将其存储为 JPEG图像。给出该图像与原 JPEG 图像之间的 PSNR 值。

六.程序测试与分析

 

6.1 编码

6.1.1直接运行程序,按提示进行操作。在目录下生成lena3.jpg图像。

同时窗口显示图像信息和压缩前后图像的PSNR值(如图)。

对比压缩前后的图像易知,压缩后的图像稍显模糊,但由于DCT变换有使图像能量集中在左上方的特性,因此压缩图像保留了原始图像大部分的图像特征,其视觉效果与原始图像相差不大。

6.1.2用附录的Matlab程序对结果进行验证

1.PSNR值

2.显示压缩前图像信息

 

3.显示压缩后图像信息

 

 

6.2  解码

将刚刚被压缩的RGB图像lena3.jpg 解压到 lena3.bmp.直接运行程序,按提示进行操作。在目录下生成lena3.bmp图像。同时在程序控制台显示读出其量化表、量化后DCT系数。程序运行结果如图。

用 MATLAB 的 jpeg_toolbox 工具箱打开该图像

查找资料,知道所使用的Matlab JPEG_toolbox工具箱中获得量化表的函数所带参数之一为主成分(默认为第一主成分),该参数会影响量化表结果。

 

DCT变换的特点是变换后图像大部分能量集中在左上角,因为左上放映原图像低频部分数据,右下反映原图像高频部分数据。

6.3修改DCT 参数并求 PSNR

对其量化后部分 DCT 系数(随机选取)进行适度修改(如+-1),然后再将其存储为 JPEG图像。给出该图像与原 JPEG 图像之间的 PSNR 值。将量化后 DCT 参数保存在 DCT .TXT 文件中,并在控制台口显示该图像与原 JPEG 图像之间的 PSNR 值。

PSNR,峰值信噪比,通常用来评价一幅图像压缩后和原图像相比质量的好坏,当然,压缩后图像一定会比原图像质量差的,所以就用这样一个评价指标来规定标准了。PSNR越高,压缩后失真越小。这里主要定义了两个值,一个是均方差MSE,另一个是峰值信噪比PSNR,公式如下:

此功能未能用C++实现,故用Matlab进行分析。

以下是用不同的量化系数进行压缩图像所形成的结果当图像压缩比增大时,图像的质量也将降低。  图像经过不同的压缩比后,图像的质量变化的同时,图像的信噪比也跟着变化。压缩比增大,信道传输的时候丢失的信息就越多,这样使得信号与噪声的比值变小。压缩比增大时,图像的质量会降低,并且图像的信噪比会变小。PSNR越高,图像和原图越接近。

随着DCT系数保留得越多,图像的误差越小,图像的质量越好,且它们之间是单调关系。DCT保留量化系数为1时,图片细节很模糊;DCT保留量化系数为5时,图像质量明显发生改善,但是一些细节部分处理的还是不好,但在边沿地方(如帽檐、头发)存在模糊;DCT保留量化系数继续增大到10,结果跟前结果相比图像质量又有进一步提高,图片细节已经很清楚了,此时图像用肉眼已经分辨不出跟原图的差别。显然当DCT保留系数更多时,图像将会更加清晰,图像质量将会更好。


即:如果DCT系数舍去(归0)数量越多,则图像的压缩率越高,但是图像的质量越差。图像质量跟舍去的数量呈单调关系,即舍去的点越多,图像质量越差。

七.总结与心得

八.参考资料
[1].吕凤军,《数字图像处理编程入门》, 第1版,人民邮电出版社.

[2].黄贤武、王家俊、李家华,《数字图像处理与压缩编码技术》,第1版,电子科技大学出版社.
[3].何斌、马天予、王运坚、朱红莲,《Visual C++数字图像处理》,第1版,人民邮电出版社.

[4].覃凤清. 基于DCT的图像压缩及其MATLAB实现. [期刊论文] –大众科技,2006(3).

[5].贺勤,张亚东,田勇.基于DCT和小波变换的图像压缩及Matlab实现[J].大众科技,2008,107(7):43-46.

.附录:

MATLAB程序 

%图像压缩处理
I=imread('G:\lena3.bmp’);%读取图像
I1=im2double(I);%图像存储类型转换
T=dctmtx(8);%离散余弦变换矩阵
B=blkproc(I1,[8 8],'P1*x*P2',T,T');%对源图像进行DCT变换
mask=[1 1 1 1 0 0 0 0       1 1 1 0 0 0 0 0       1 1 0 0 0 0 0 0       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]
B2=blkproc(B,[8 8],'P1*x',mask);%数据压缩,舍弃右下角高频数据
I2=blkproc(B2,[8 8],'P1*x*P2',T',T);%进行DCT反变换 ,得到压缩后的图像
subplot(1,2,1)
imshow(I1)%显示原始图像
title('原始图像')
figure;
subplot(1,2,2)
imshow(I2)%显示压缩后的图像
title('压缩后的图像')%求PSNRx1=imread('G:\lena3.bmp');
I=imread('G:\lena3.jpg');
x2=rgb2gray(I); %图像格式是bmp,如果不是则要加RGB2GRAY函数转化
x1=double(x1);
x2=double(x2);
[m,n]=size(x1);
[m2,n2]=size(x2);
if m2~=m||n2~=n;
error('图像选择错误');
end;
msevalue=0;
for i=1:m;
for j=1:n;
msevalue=msevalue+(x1(i,j)-x2(i,j))^2;
end;
end;
msevalue=msevalue/(m*n);
disp(['输入数据的mse为:',num2str(msevalue)]);
psnrvalue=255^2/msevalue;
psnrvalue=10*log10(psnrvalue);%反量化
%读入指定途径的图像
rgb=imread(' G:\lena3.jpg ');  %RGB转换为YUV,即YCbCr
yuv=rgb2ycbcr(rgb);
%将得到的YUV转换为可进行数学运算的double类型,原来为uint8 类型
yuv=double(yuv);
%分别提取其中的Y,U,V矩阵
y=yuv(:,:,1);
u=yuv(:,:,2);
v=yuv(:,:,3);
%设定量化步长
eql=8;
%设定块操作时dct矩阵
T = dctmtx(8);
%将Y,U,V矩阵分割为8*8 的小块,并对每个小块进行DCT变换
y_dct=blkproc(y,[8,8],'P1*x*P2',T, T');
u_dct=blkproc(u,[8,8],'P1*x*P2',T, T');
v_dct=blkproc(v,[8,8],'P1*x*P2',T, T');
%将得到的DCT系数除以量化步长
y_dct=y_dct/eql;
u_dct=u_dct/eql;
v_dct=v_dct/eql;
%将量化后的系数四舍五入
y_dct_c=fix(y_dct);
u_dct_c=fix(u_dct);
v_dct_c=fix(v_dct);
%反量化
y_dct_c=y_dct_c*eql;
u_dct_c=u_dct_c*eql;
v_dct_c=v_dct_c*eql;
%进行DCT反变换
y_idct=blkproc(y_dct_c,[8,8],'P1*x*P2', T^-1,(T')^-1);
u_idct=blkproc(u_dct_c,[8,8],'P1*x*P2', T^-1,(T')^-1);
v_idct=blkproc(v_dct_c,[8,8],'P1*x*P2', T^-1,(T')^-1);
%恢复为YUV矩阵,转换为uint8 类型,
yuv(:,:,1)=y_idct;
yuv(:,:,2)=u_idct;
yuv(:,:,3)=v_idct;
yuv=uint8(yuv);
%YUV转换为RGB
rgb1=ycbcr2rgb(yuv);
%显示两幅图像
subplot(211),imshow(rgb),title('原始图像');
subplot(212),imshow(rgb1),title('处理后图像');%读取jpg图像量化表jobj =jpeg_read('G:\lena3.jpg');%读取图像%To access the quantization table used by the first component:
Qt=jobj.quant_tables{jobj.comp_info(1).quant_tbl_no}
%luminance channels quantization table when quotiety is 75 亮度量化表
LC=jpeg_qtable(75,0)% chromatic channels quantization table when quality is 75 色度量化表
CC=jpeg_qtable(75,1)%修改DCT系数后保存图像并求修改前后的PSNR值

JPEG图像编码解码相关推荐

  1. 最近做Jpeg编解码遇到的问题

    最近做Jpeg编解码遇到的问题 2011-03-05 10:41:32|  分类: 技术系列 |  标签:解码  sos  jpegencoder  myjpeg  字节    字号:大中小 订阅 h ...

  2. 【STM32F407VET6开发】第三章 jpeg编解码实验(有误,待修改)

    目录 一.硬件连接(STM32F407VETx.仿真器) 二.配置Debugger 三.通过串口协议,实现对jpeg图片编解码后传回电脑验证 四.结果 一.硬件连接(STM32F407VETx.仿真器 ...

  3. 数据压缩第七周作业——JPEG编解码

    目录 一.实验目的 二.实验原理 1.JPEG编码器:​编辑 2.JPEG解码器 3.JPEG文件解析 三.实验内容 (1)调试和理解JPEG解码器程序 (2)理解程序设置 1.结构体理解 2.梳理代 ...

  4. JPEG编解码基本技术回顾

    JPEG格式是一个很老的格式了,笔者刚刚认识5寸软盘的时代就知道这种文件是用来保存图片的,而且比同尺寸的"bmp"图片要小很多.很多年过去了,信息技术各个领域全面发展,视频编解码技 ...

  5. 基于matlab的JPEG彩色图像编码解码源码

    %% 清空环境 close all; clc; clear; %% 图像压缩 filePath='2.bmp';%被压缩的图像的途径 quantizationFactor=0.5;%该变量为量化因子, ...

  6. ---WebCam网络摄像头12 ---图像编码解码,视频编码解码

    1.图像格式与图像编码,图像显示 图像被拍摄后,一般都会按照某种编码方式被压缩,使得占用更少的空间来存放(或传输).然后再播放的时候又会使用想用的解码方式将图像还原成源图像(指显示器认可的图像格式,一 ...

  7. java jpeg压缩解码_图片压缩(iOS)

    场景很简单,上传图片前压缩图片,节省流量和发图时间.最近看了看 iOS 的静态图片压缩,这里记个笔记.本人之前没学过 iOS 和 Swift,本文是一篇入门文章,描述不到位之处请大家多多批评斧正. ̄ω ...

  8. java jpeg压缩解码_JPEG图像压缩原理简介

    JPEG(发音:[ˈdʒeɪpɛg])是一种针对照片视频而广泛使用的有损压缩标准方法. 这个名称代表 Joint Photographic Experts Group(联合图像专家小组).联合图像专家 ...

  9. 使用libjpeg进行JPEG图像解码

     如题:如何对test.jpg进行解码? 注:这里使用libjpeg库进行图像解码.也可以不使用libjpeg库,但是比较繁琐. 直接上代码: #include "jpeglib.h&q ...

最新文章

  1. 01012_计算机常用单词
  2. 期末Java面向对象程序设计复习稳过不挂指南(更新中)
  3. fedora删除旧版本内核
  4. unity让对象作为参数_unity-container – 一个unity容器可以将自身的引用作为构造函数参数传递吗?...
  5. [译]ABP vNext介绍
  6. 嵌入式操作系统内核原理和开发
  7. 贴出一个php的批量搜索吧
  8. 万圣节 数据_万圣节的五个3D打印项目
  9. Oracle【IT实验室】数据库备份与恢复之三:OS备份/用户管理的备份与恢复
  10. 190511每日一句
  11. android移动开发慕课版本_Android移动开发基础教程(慕课版)
  12. 【雷达】一维和二维自适应波束形成(DBF))DBF附matlab代码
  13. 干货分享 | 4万字全面解读数据中台、数据仓库、数据湖(建议收藏)
  14. 单片空间后方交会 python实现
  15. UCT(信心上限树算法)解四子棋问题——蒙特卡罗法模拟人机博弈
  16. d3 企业图谱 仿天眼查 企查查
  17. SDWebImage第三方库加载图片生硬
  18. linux右键无法解压gz文件夹,Linux/centos下zip、tar、gz压缩解压命令
  19. MYSQL分区表学习
  20. cad打开卡死_求助,cad 一打开就卡死,完全没办法运行,怎么处理

热门文章

  1. 浅谈发电机组接入动环系统
  2. 您的公司能从渐进式网页应用中受益吗?
  3. 实验5-9 使用函数输出水仙花数_正点原子STM32F407探索者开发板资料连载第五十三章 手写识别实验
  4. OpenStack Magnum 项目简单介绍
  5. uni-app接入阿里图标使用以及图标旋转
  6. 51单片机中断嵌套,返回主函数
  7. UA PHYS515A 电磁理论IV 时变电磁场理论5 电磁场的角动量
  8. 岩板铺地好吗_岩板可以铺贴地面吗
  9. python防止程序多开,打包EXE实现
  10. 科大讯飞解决 唤醒未初始化