数据压缩学习实验(六)JPEG原理分析及JPEG解码器的调试

实验目的

  1. 掌握JPEG编解码系统的基本原理。
  2. 初步掌握复杂的数据压缩算法实现,并能根据理论分析需要实现所对应数据的输出。

实验原理

  1. 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。
  1. JPEG文件格式
    JPEG 在文件中以 Segment 的形式组织,它具有以下特点:
  • 均以 0xFF 开始,后跟 1 byte 的 Marker 和 2 byte 的 Segment length(包含表示 Length 本身所占用的 2 byte,不含“0xFF” + “Marker” 所占用的 2 byte);
  • 采用 Motorola 序(相对于 Intel 序),即保存时高位在前,低位在后;
  • Data 部分中,0xFF 后若为 0x00,则跳过此字节不予处理;
    在这里插入图片描述
  1. 量化表DQT
  • 一般为两个量化表,即亮度和色度各一张
  • 以0xFFDB开始
    ➢量化表长度,一般为00 43(或00 84)
    ➢量化表信息(1字节)
    ◼ Bit 0~3 QT号(只能取值为0~3,否则错误)
    ◼ Bit 4~7 QT精度(0为8比特,否则表示16比特)
  • 量化表的实际数据
    ◼ 量化表中的数据按照Z字形保存量化表内8x8的数据
  1. 帧图像开始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色度采样。
  1. 一个或多个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.*/
  1. 调试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程序解码结果:
    在这里插入图片描述
  2. 掌握程序内容:
  • 理解程序设计的整体框架
    该程序将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码表等。
  1. 以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

  1. 输出DC图像并统计其概率分布;输出某一个AC值图像并统计其概率分布
    选取DCT系数矩阵中(4,4)位置进行统计,结果如下:
    在这里插入图片描述
    在这里插入图片描述
    原图灰度图直方图:
    在这里插入图片描述
    由结果可以看出,由每个8*8DCT块中直流分量组成的图像分布近似于原图灰度直方图分布,而某一交流分量分布近似于拉普拉斯分布。其结果与下图理论相符:
    在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值