实验目的
- 掌握JPEG编解码系统的基本原理。
- 初步掌握复杂的数据压缩算法实现,并能根据理论分析需要实现所对应数据的输出。
实验原理
- JPEG编码原理
- 色彩空间:
JPEG标准本身并没有规定具体的颜色空间,只是对各分量分别进行编码。
实现中通常将高度相关RGB颜色空间转换到相关性较小的YUV颜色空间,并根据人眼对色度不敏感的视觉特性进行色度下采样,如4:2:2、4:2:0等。
- 零偏置:
对于灰度级是2n的像素,通过减去2n-1,将无符号的整数值变成有符号数,从而使像素的绝对值出现3位10进制的概率大大减少。例如:对于n=8,即将0,255的值域,通过减去128,转换为值域在-128,127之间的值。 - 8*8分块:
如果遇到图像长宽尺寸不为8的整数倍时,用图像边缘上一行、列的像素值进行填充,相比纯黑、纯白、灰色填充可以减少图像高频成分,从而减少数据量。 - DCT变换:
二维8×8 DCT变换矩阵
- 量化表:
因为人眼对亮度信号比对色差信号更敏感,因此使用了两种量化表:亮度量化值和色差量化值,根据人眼的视觉特性(对低频敏感,对高频不太敏感)对低频分量采取较细的量化,对高频分量采取较粗的量化。量化表是JPEG编码重点的优化对象。
实际中不同图像的量化表差异很大。
建议量化表:
- 直流系数:
反映了该子图像中包含的直流成分,通常较大,又由于两个相邻的子图像的直流系数通常具有较大的相关性,所以对DC系数采用差值脉冲编码(DPCM), 即对本象素块直流系数与前一象素块直流系数的差值进行无损编码 :
- 交流系数和Zigzag扫描:
由于量化之后矩阵右下角高频系数大部分为零,采用之字形扫描读取可以制造较长的零游程,提高编码效率。在扫描中,如果后续的系数全部为零,则用 “EOB”表示块结束。非零系数和它前面的相邻的全部零系数分在一组内;每组用两个符号表示[(Run,Level),(Amplitude)]
➢ Run: 最多15个,用4位表示RRRR
➢ Level:类似DC
◼ 分成16个类别,用4位表示SSSS表示类别号
◼ 类内索引
➢ Amplitude:类内索引,定长编码
➢ 对(RRRR, SSSS)联合用Huffman编码
在实际的JPEG编码系统中,一般有4张Huffman码表:亮度DC,亮度AC,色度DC,色度AC。
- JPEG文件格式
JPEG 在文件中以 Segment 的形式组织,它具有以下特点:
- 均以 0xFF 开始,后跟 1 byte 的 Marker 和 2 byte 的 Segment length(包含表示 Length 本身所占用的 2 byte,不含“0xFF” + “Marker” 所占用的 2 byte);
- 采用 Motorola 序(相对于 Intel 序),即保存时高位在前,低位在后;
- Data 部分中,0xFF 后若为 0x00,则跳过此字节不予处理;
- 量化表DQT
- 一般为两个量化表,即亮度和色度各一张
- 以0xFFDB开始
➢量化表长度,一般为00 43(或00 84)
➢量化表信息(1字节)
◼ Bit 0~3 QT号(只能取值为0~3,否则错误)
◼ Bit 4~7 QT精度(0为8比特,否则表示16比特) - 量化表的实际数据
◼ 量化表中的数据按照Z字形保存量化表内8x8的数据
- 帧图像开始SOF0,数值0xFF C0
- SOF长度(2字节) 0x00 11
- 精度(1字节) 每个颜色分量每个像素的位数(通常为8 )
- 图像高度(2字节) 以像素数表示图像的高度
- 图像宽度(2字节) 以像素数表示图像的宽度
- 颜色分量数(1字节) 通常为3
- 对每个颜色分量:
➢颜色索引ID(1字节,从01,02,03)
➢Sample factor(1字节,高四位水平因子, 低四位垂直因子)
➢量化表号(1字节)
说明:这里的sample factor 指的是Y分量水平、垂直方向上分辨率相比色度分量的分辨率。例如:Y分量为2,2;cb cr分量为1,1,表明Y分量分辨率在垂直、水平方向各为色度分量2倍,即4:2:0色度采样。
- 一个或多个Huffman表,数值0xFFC4
以DC码表举例,其内容为
DHT长度:0x 001F(2字节)
Huffman表信息(1字节):
➢高4位:Type,0:DC,1:AC
➢低4位:Index索引
码字数量(16字节):为不同位数的码字的数量
如:00 03 01 01 01 01 01 01 01 00 00 00 00 00 00
表示:没有1位的哈夫曼码字;2位的码字有3 个;3位-9位的码字各有1个;没有9位或以上的码字。
编码内容(可变,为码字数量之和):表示每个码字实际表示的权值
如:04 05 06 03 02 01 00 09 07 08
表示:权值依次为04、05、06、03、02、01、00、09、07、08
在DC码表中:权值就是解码时再需要 读入的bit位数。
在AC码表中:权值的高4位表示当前数值前面有多少个连续的零,低4 位表示该交流分量数值的二进制位数,也就是接下来需要读入的位数。
实验步骤及结果
本次实验中调试的解码器版权信息如下:
/* Small jpeg decoder library
* Copyright (c) 2006, Luc Saillard <luc@saillard.org>
* All rights reserved.*/
- 调试JPEG编码器,解码输入的JPEG文件并将文件输出至YUV格式
对解码器输入参数 test1.jpg yuv420p test1.yuv
将文件保存至YUV格式
原始程序中文件会分别保存为.Y .U .V三个独立文件,在函数write_yuv(const char *filename, int width, int height, unsigned char **components)中添加如下代码:
snprintf(temp, 1024, “%s.YUV”, filename); //输出一个完整的YUV文件
F = fopen(temp, “wb”);
fwrite(components[0], width, height, F);
fwrite(components[1], width * height / 4, 1, F);
fwrite(components[2], width * height / 4, 1, F);
fclose(F);
原图:
YUV程序解码结果:
- 掌握程序内容:
- 理解程序设计的整体框架
该程序将JPEG解码过程中的关键信息封装在下述结构体中,其运行过程和框架如下:
- 理解三个结构体的设计目的
- struct huffman_table
目的:储存解码所用的Huffman码表,codesize储存码长
struct huffman_table
{
/* Fast look up table, using HUFFMAN_HASH_NBITS bits we can have directly the symbol,
* if the symbol is <0, then we need to look into the tree table */
short int lookup[HUFFMAN_HASH_SIZE];
/* code size: give the number of bits of a symbol is encoded */
unsigned char code_size[HUFFMAN_HASH_SIZE];
/* some place to store value that is not encoded in the lookup table
* FIXME: Calculate if 256 value is enough to store all values
*/
uint16_t slowtable[16-HUFFMAN_HASH_NBITS][256];
};
• struct component
目的:存储每个88系数块信息,用于该系数块的解码,包含DC、AC Huffman码表,量化表,色度采样格式和88DCT系数。其中DC系数采用差分编码。
struct component
{
unsigned int Hfactor; /* Horizontal factor */
unsigned int Vfactor; /* Vertical factor */
/** 每个component 的Hfactor 和 Vfactor共同决定色度采样格式 **/
float *Q_table; /* Pointer to the quantisation table to use */
struct huffman_table *AC_table; /* Pointer to the AC table to use */
struct huffman_table *DC_table; /* Pointer to the DC table to use */
/* 量化表、Huffman表均为指针,指向结构体jdec_private中实际数据 */
short int previous_DC; /* Previous DC coefficient */
short int DCT[64]; /* DCT coef */
#if SANITY_CHECK
unsigned int cid;
#endif
};
• struct jdec_private
目的:存储Jpeg图片的基本尺寸信息、数据、量化表、Huffman表
struct jdec_private
{
/* Public variables */
uint8_t *components[COMPONENTS];
/* 指针数组,指向3个分量数据 */
unsigned int width, height; /* 图片尺寸 */
unsigned int flags;
/* Private variables */
const unsigned char *stream_begin, *stream_end;
unsigned int stream_length;
/* stream_begin指示文件在内存中起始地址,stream_end指示结束地址, stream_length 指示除去0xFF和0xD8(SOI)两字节文件长度 */
const unsigned char *stream; /* Pointer to the current stream */
unsigned int reservoir, nbits_in_reservoir;
struct component component_infos[COMPONENTS];
float Q_tables[COMPONENTS][64]; /* quantization tables */
struct huffman_table HTDC[HUFFMAN_TABLES]; /* DC huffman tables */
struct huffman_table HTAC[HUFFMAN_TABLES]; /* AC huffman tables */
int default_huffman_table_initialized;
int restart_interval;
int restarts_to_go; /* MCUs left in this restart interval */
int last_rst_marker_seen; /* Rst marker is incremented each time */
/* Temp space used after the IDCT to store each components */
uint8_t Y[64*4], Cr[64], Cb[64];
jmp_buf jump_state;
/* Internal Pointer use for colorspace conversion, do not modify it !!! */
uint8_t *plane[COMPONENTS];
};
- 理解在视音频编解码调试中TRACE的目的和含义:
#if…#endif是C++种的条件编译预处理命令,当if后表达式为真是,编译其中包含的语句。
音视频编解码器调试中,使用宏定义#define TRACE 1来启动调试,此时#if…#endif中所包含的跟踪语句会被执行,这些语句往往用于将编解码器运行过程中的关键信息输出,如JPEG解码器中的JPEG图像各类segment信息,量化矩阵和Huffman码表等。
- 以txt文件输出所有的量化矩阵和所有的HUFFMAN码表
上述图像的量化矩阵和Huffman码表为:
>DQT marker
Quantization Table 0
02.00 01.39 01.31 02.35 02.00 03.14 02.71 01.66
01.39 01.92 01.81 03.26 04.16 06.54 04.50 02.30
01.31 01.81 03.41 03.07 05.23 06.16 04.95 02.16
01.18 03.26 03.07 04.15 05.88 08.31 05.09 01.95
02.00 02.77 05.23 07.06 07.00 08.64 05.41 02.21
01.57 04.36 06.16 05.54 06.29 06.17 04.68 01.95
02.71 04.50 05.66 05.73 05.41 05.10 03.51 01.49
01.93 03.44 03.60 03.24 03.03 02.17 01.49 00.76
< DQT marker
DQT marker
Quantization Table 1
02.00 02.77 02.61 05.88 10.00 07.86 05.41 02.76
02.77 03.85 05.44 11.42 13.87 10.90 07.51 03.83
02.61 05.44 10.24 15.36 13.07 10.27 07.07 03.60
05.88 11.42 15.36 13.83 11.76 09.24 06.36 03.24
10.00 13.87 13.07 11.76 10.00 07.86 05.41 02.76
07.86 10.90 10.27 09.24 07.86 06.17 04.25 02.17
05.41 07.51 07.07 06.36 05.41 04.25 02.93 01.49
02.76 03.83 03.60 03.24 02.76 02.17 01.49 00.76
< DQT marker
DHT marker (length=29)
Huffman table DC[0] length=12
val=00 code=00000000 codesize=02
val=01 code=00000002 codesize=03
val=02 code=00000003 codesize=03
val=03 code=00000004 codesize=03
val=04 code=00000005 codesize=03
val=05 code=00000006 codesize=03
val=06 code=0000000e codesize=04
val=07 code=0000001e codesize=05
val=08 code=0000003e codesize=06
val=09 code=0000007e codesize=07
val=0a code=000000fe codesize=08
val=0b code=000001fe codesize=09
< DHT marker
DHT marker (length=179)
Huffman table AC[0] length=162
val=01 code=00000000 codesize=02
val=02 code=00000001 codesize=02
val=03 code=00000004 codesize=03
val=00 code=0000000a codesize=04
val=04 code=0000000b codesize=04
val=11 code=0000000c codesize=04
val=05 code=0000001a codesize=05
val=12 code=0000001b codesize=05
val=21 code=0000001c codesize=05
val=31 code=0000003a codesize=06
val=41 code=0000003b codesize=06
val=06 code=00000078 codesize=07
val=13 code=00000079 codesize=07
val=51 code=0000007a codesize=07
val=61 code=0000007b codesize=07
val=07 code=000000f8 codesize=08
val=22 code=000000f9 codesize=08
val=71 code=000000fa codesize=08
val=14 code=000001f6 codesize=09
val=32 code=000001f7 codesize=09
val=81 code=000001f8 codesize=09
val=91 code=000001f9 codesize=09
val=a1 code=000001fa codesize=09
val=08 code=000003f6 codesize=10
val=23 code=000003f7 codesize=10
val=42 code=000003f8 codesize=10
val=b1 code=000003f9 codesize=10
val=c1 code=000003fa codesize=10
val=15 code=000007f6 codesize=11
val=52 code=000007f7 codesize=11
val=d1 code=000007f8 codesize=11
val=f0 code=000007f9 codesize=11
val=24 code=00000ff4 codesize=12
val=33 code=00000ff5 codesize=12
val=62 code=00000ff6 codesize=12
val=72 code=00000ff7 codesize=12
val=82 code=00007fc0 codesize=15
val=09 code=0000ff82 codesize=16
val=0a code=0000ff83 codesize=16
val=16 code=0000ff84 codesize=16
val=17 code=0000ff85 codesize=16
val=18 code=0000ff86 codesize=16
val=19 code=0000ff87 codesize=16
val=1a code=0000ff88 codesize=16
val=25 code=0000ff89 codesize=16
val=26 code=0000ff8a codesize=16
val=27 code=0000ff8b codesize=16
val=28 code=0000ff8c codesize=16
val=29 code=0000ff8d codesize=16
val=2a code=0000ff8e codesize=16
val=34 code=0000ff8f codesize=16
val=35 code=0000ff90 codesize=16
val=36 code=0000ff91 codesize=16
val=37 code=0000ff92 codesize=16
val=38 code=0000ff93 codesize=16
val=39 code=0000ff94 codesize=16
val=3a code=0000ff95 codesize=16
val=43 code=0000ff96 codesize=16
val=44 code=0000ff97 codesize=16
val=45 code=0000ff98 codesize=16
val=46 code=0000ff99 codesize=16
val=47 code=0000ff9a codesize=16
val=48 code=0000ff9b codesize=16
val=49 code=0000ff9c codesize=16
val=4a code=0000ff9d codesize=16
val=53 code=0000ff9e codesize=16
val=54 code=0000ff9f codesize=16
val=55 code=0000ffa0 codesize=16
val=56 code=0000ffa1 codesize=16
val=57 code=0000ffa2 codesize=16
val=58 code=0000ffa3 codesize=16
val=59 code=0000ffa4 codesize=16
val=5a code=0000ffa5 codesize=16
val=63 code=0000ffa6 codesize=16
val=64 code=0000ffa7 codesize=16
val=65 code=0000ffa8 codesize=16
val=66 code=0000ffa9 codesize=16
val=67 code=0000ffaa codesize=16
val=68 code=0000ffab codesize=16
val=69 code=0000ffac codesize=16
val=6a code=0000ffad codesize=16
val=73 code=0000ffae codesize=16
val=74 code=0000ffaf codesize=16
val=75 code=0000ffb0 codesize=16
val=76 code=0000ffb1 codesize=16
val=77 code=0000ffb2 codesize=16
val=78 code=0000ffb3 codesize=16
val=79 code=0000ffb4 codesize=16
val=7a code=0000ffb5 codesize=16
val=83 code=0000ffb6 codesize=16
val=84 code=0000ffb7 codesize=16
val=85 code=0000ffb8 codesize=16
val=86 code=0000ffb9 codesize=16
val=87 code=0000ffba codesize=16
val=88 code=0000ffbb codesize=16
val=89 code=0000ffbc codesize=16
val=8a code=0000ffbd codesize=16
val=92 code=0000ffbe codesize=16
val=93 code=0000ffbf codesize=16
val=94 code=0000ffc0 codesize=16
val=95 code=0000ffc1 codesize=16
val=96 code=0000ffc2 codesize=16
val=97 code=0000ffc3 codesize=16
val=98 code=0000ffc4 codesize=16
val=99 code=0000ffc5 codesize=16
val=9a code=0000ffc6 codesize=16
val=a2 code=0000ffc7 codesize=16
val=a3 code=0000ffc8 codesize=16
val=a4 code=0000ffc9 codesize=16
val=a5 code=0000ffca codesize=16
val=a6 code=0000ffcb codesize=16
val=a7 code=0000ffcc codesize=16
val=a8 code=0000ffcd codesize=16
val=a9 code=0000ffce codesize=16
val=aa code=0000ffcf codesize=16
val=b2 code=0000ffd0 codesize=16
val=b3 code=0000ffd1 codesize=16
val=b4 code=0000ffd2 codesize=16
val=b5 code=0000ffd3 codesize=16
val=b6 code=0000ffd4 codesize=16
val=b7 code=0000ffd5 codesize=16
val=b8 code=0000ffd6 codesize=16
val=b9 code=0000ffd7 codesize=16
val=ba code=0000ffd8 codesize=16
val=c2 code=0000ffd9 codesize=16
val=c3 code=0000ffda codesize=16
val=c4 code=0000ffdb codesize=16
val=c5 code=0000ffdc codesize=16
val=c6 code=0000ffdd codesize=16
val=c7 code=0000ffde codesize=16
val=c8 code=0000ffdf codesize=16
val=c9 code=0000ffe0 codesize=16
val=ca code=0000ffe1 codesize=16
val=d2 code=0000ffe2 codesize=16
val=d3 code=0000ffe3 codesize=16
val=d4 code=0000ffe4 codesize=16
val=d5 code=0000ffe5 codesize=16
val=d6 code=0000ffe6 codesize=16
val=d7 code=0000ffe7 codesize=16
val=d8 code=0000ffe8 codesize=16
val=d9 code=0000ffe9 codesize=16
val=da code=0000ffea codesize=16
val=e1 code=0000ffeb codesize=16
val=e2 code=0000ffec codesize=16
val=e3 code=0000ffed codesize=16
val=e4 code=0000ffee codesize=16
val=e5 code=0000ffef codesize=16
val=e6 code=0000fff0 codesize=16
val=e7 code=0000fff1 codesize=16
val=e8 code=0000fff2 codesize=16
val=e9 code=0000fff3 codesize=16
val=ea code=0000fff4 codesize=16
val=f1 code=0000fff5 codesize=16
val=f2 code=0000fff6 codesize=16
val=f3 code=0000fff7 codesize=16
val=f4 code=0000fff8 codesize=16
val=f5 code=0000fff9 codesize=16
val=f6 code=0000fffa codesize=16
val=f7 code=0000fffb codesize=16
val=f8 code=0000fffc codesize=16
val=f9 code=0000fffd codesize=16
val=fa code=0000fffe codesize=16
< DHT marker
DHT marker (length=29)
Huffman table DC[1] length=12
val=00 code=00000000 codesize=02
val=01 code=00000001 codesize=02
val=02 code=00000002 codesize=02
val=03 code=00000006 codesize=03
val=04 code=0000000e codesize=04
val=05 code=0000001e codesize=05
val=06 code=0000003e codesize=06
val=07 code=0000007e codesize=07
val=08 code=000000fe codesize=08
val=09 code=000001fe codesize=09
val=0a code=000003fe codesize=10
val=0b code=000007fe codesize=11
< DHT marker
DHT marker (length=179)
Huffman table AC[1] length=162
val=00 code=00000000 codesize=02
val=01 code=00000001 codesize=02
val=02 code=00000004 codesize=03
val=03 code=0000000a codesize=04
val=11 code=0000000b codesize=04
val=04 code=00000018 codesize=05
val=05 code=00000019 codesize=05
val=21 code=0000001a codesize=05
val=31 code=0000001b codesize=05
val=06 code=00000038 codesize=06
val=12 code=00000039 codesize=06
val=41 code=0000003a codesize=06
val=51 code=0000003b codesize=06
val=07 code=00000078 codesize=07
val=61 code=00000079 codesize=07
val=71 code=0000007a codesize=07
val=13 code=000000f6 codesize=08
val=22 code=000000f7 codesize=08
val=32 code=000000f8 codesize=08
val=81 code=000000f9 codesize=08
val=08 code=000001f4 codesize=09
val=14 code=000001f5 codesize=09
val=42 code=000001f6 codesize=09
val=91 code=000001f7 codesize=09
val=a1 code=000001f8 codesize=09
val=b1 code=000001f9 codesize=09
val=c1 code=000001fa codesize=09
val=09 code=000003f6 codesize=10
val=23 code=000003f7 codesize=10
val=33 code=000003f8 codesize=10
val=52 code=000003f9 codesize=10
val=f0 code=000003fa codesize=10
val=15 code=000007f6 codesize=11
val=62 code=000007f7 codesize=11
val=72 code=000007f8 codesize=11
val=d1 code=000007f9 codesize=11
val=0a code=00000ff4 codesize=12
val=16 code=00000ff5 codesize=12
val=24 code=00000ff6 codesize=12
val=34 code=00000ff7 codesize=12
val=e1 code=00003fe0 codesize=14
val=25 code=00007fc2 codesize=15
val=f1 code=00007fc3 codesize=15
val=17 code=0000ff88 codesize=16
val=18 code=0000ff89 codesize=16
val=19 code=0000ff8a codesize=16
val=1a code=0000ff8b codesize=16
val=26 code=0000ff8c codesize=16
val=27 code=0000ff8d codesize=16
val=28 code=0000ff8e codesize=16
val=29 code=0000ff8f codesize=16
val=2a code=0000ff90 codesize=16
val=35 code=0000ff91 codesize=16
val=36 code=0000ff92 codesize=16
val=37 code=0000ff93 codesize=16
val=38 code=0000ff94 codesize=16
val=39 code=0000ff95 codesize=16
val=3a code=0000ff96 codesize=16
val=43 code=0000ff97 codesize=16
val=44 code=0000ff98 codesize=16
val=45 code=0000ff99 codesize=16
val=46 code=0000ff9a codesize=16
val=47 code=0000ff9b codesize=16
val=48 code=0000ff9c codesize=16
val=49 code=0000ff9d codesize=16
val=4a code=0000ff9e codesize=16
val=53 code=0000ff9f codesize=16
val=54 code=0000ffa0 codesize=16
val=55 code=0000ffa1 codesize=16
val=56 code=0000ffa2 codesize=16
val=57 code=0000ffa3 codesize=16
val=58 code=0000ffa4 codesize=16
val=59 code=0000ffa5 codesize=16
val=5a code=0000ffa6 codesize=16
val=63 code=0000ffa7 codesize=16
val=64 code=0000ffa8 codesize=16
val=65 code=0000ffa9 codesize=16
val=66 code=0000ffaa codesize=16
val=67 code=0000ffab codesize=16
val=68 code=0000ffac codesize=16
val=69 code=0000ffad codesize=16
val=6a code=0000ffae codesize=16
val=73 code=0000ffaf codesize=16
val=74 code=0000ffb0 codesize=16
val=75 code=0000ffb1 codesize=16
val=76 code=0000ffb2 codesize=16
val=77 code=0000ffb3 codesize=16
val=78 code=0000ffb4 codesize=16
val=79 code=0000ffb5 codesize=16
val=7a code=0000ffb6 codesize=16
val=82 code=0000ffb7 codesize=16
val=83 code=0000ffb8 codesize=16
val=84 code=0000ffb9 codesize=16
val=85 code=0000ffba codesize=16
val=86 code=0000ffbb codesize=16
val=87 code=0000ffbc codesize=16
val=88 code=0000ffbd codesize=16
val=89 code=0000ffbe codesize=16
val=8a code=0000ffbf codesize=16
val=92 code=0000ffc0 codesize=16
val=93 code=0000ffc1 codesize=16
val=94 code=0000ffc2 codesize=16
val=95 code=0000ffc3 codesize=16
val=96 code=0000ffc4 codesize=16
val=97 code=0000ffc5 codesize=16
val=98 code=0000ffc6 codesize=16
val=99 code=0000ffc7 codesize=16
val=9a code=0000ffc8 codesize=16
val=a2 code=0000ffc9 codesize=16
val=a3 code=0000ffca codesize=16
val=a4 code=0000ffcb codesize=16
val=a5 code=0000ffcc codesize=16
val=a6 code=0000ffcd codesize=16
val=a7 code=0000ffce codesize=16
val=a8 code=0000ffcf codesize=16
val=a9 code=0000ffd0 codesize=16
val=aa code=0000ffd1 codesize=16
val=b2 code=0000ffd2 codesize=16
val=b3 code=0000ffd3 codesize=16
val=b4 code=0000ffd4 codesize=16
val=b5 code=0000ffd5 codesize=16
val=b6 code=0000ffd6 codesize=16
val=b7 code=0000ffd7 codesize=16
val=b8 code=0000ffd8 codesize=16
val=b9 code=0000ffd9 codesize=16
val=ba code=0000ffda codesize=16
val=c2 code=0000ffdb codesize=16
val=c3 code=0000ffdc codesize=16
val=c4 code=0000ffdd codesize=16
val=c5 code=0000ffde codesize=16
val=c6 code=0000ffdf codesize=16
val=c7 code=0000ffe0 codesize=16
val=c8 code=0000ffe1 codesize=16
val=c9 code=0000ffe2 codesize=16
val=ca code=0000ffe3 codesize=16
val=d2 code=0000ffe4 codesize=16
val=d3 code=0000ffe5 codesize=16
val=d4 code=0000ffe6 codesize=16
val=d5 code=0000ffe7 codesize=16
val=d6 code=0000ffe8 codesize=16
val=d7 code=0000ffe9 codesize=16
val=d8 code=0000ffea codesize=16
val=d9 code=0000ffeb codesize=16
val=da code=0000ffec codesize=16
val=e2 code=0000ffed codesize=16
val=e3 code=0000ffee codesize=16
val=e4 code=0000ffef codesize=16
val=e5 code=0000fff0 codesize=16
val=e6 code=0000fff1 codesize=16
val=e7 code=0000fff2 codesize=16
val=e8 code=0000fff3 codesize=16
val=e9 code=0000fff4 codesize=16
val=ea code=0000fff5 codesize=16
val=f2 code=0000fff6 codesize=16
val=f3 code=0000fff7 codesize=16
val=f4 code=0000fff8 codesize=16
val=f5 code=0000fff9 codesize=16
val=f6 code=0000fffa codesize=16
val=f7 code=0000fffb codesize=16
val=f8 code=0000fffc codesize=16
val=f9 code=0000fffd codesize=16
val=fa code=0000fffe codesize=16
< DHT marker
- 输出DC图像并统计其概率分布;输出某一个AC值图像并统计其概率分布
选取DCT系数矩阵中(4,4)位置进行统计,结果如下:
原图灰度图直方图:
由结果可以看出,由每个8*8DCT块中直流分量组成的图像分布近似于原图灰度直方图分布,而某一交流分量分布近似于拉普拉斯分布。其结果与下图理论相符: