JPEG原理分析及JPEG解码器的调试

目录

一、实验目的

二、实验原理

1.JPEG简介

2.JPEG编码原理

(1)零偏置(level offset)

(2)DCT变换

​​(3)量化

(4)DC系数编码

(5)AC系数之字形扫描和游程编码

(6)Huffman编码

3.JPEG文件格式

(1)Segment组织形式

(2)Segment Marker ​编辑

三. 代码调试

1.JPEG解码流程

(1)读取文件

(2)解析 Segment Marker

(3)依据每个分量的水平、垂直采样因子计算 MCU 的大小,并得到每个 MCU 中 8*8 宏块的个数

(4)对每个 MCU 解码(依照各分量水平、垂直采样因子对 MCU 中每个分量宏块解码)

(5)解析到 EOI,解码结束

(6) 将 Y、Cb、Cr 转化为需要的色彩空间并保存

2.调试过程

(1)文件读取

(2)解析 Segment Marker

(3)解析JPEG实际数据

(4)解析MCU

3.结构体解析

(1)huffman_table结构体

(2)component结构体 

(3)jdec_private结构体

4.TRACE的目的和含义

四、实验结果

1.将输出文件保存为可供YUVViewer观看的YUV文件

2.以txt文件输出所有的量化矩阵和所有的Huffman码表 

 (1)4张Huffman码表

 (2)两张量化表

 3.输出DC图像、某一个AC值图像并分别统计它们的概率分布

在tinyjpeg_decode中添加如下代码

DC图像及其概率分布:

AC图像及其概率分布:


一、实验目的

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

二、实验原理

1.JPEG简介

       JPEG( Joint Photographic Experts Group)即联合图像专家组,是用于连续色调静态图像压缩的一种标准,文件后缀名为.jpg或.jpeg,是最常用的图像文件格式。其主要是采用预测编码(DPCM)、离散余弦变换(DCT)以及熵编码的联合编码方式,以去除冗余的图像和彩色数据,属于有损压缩格式,它能够将图像压缩在很小的储存空间,一定程度上会造成图像数据的损伤。

2.JPEG编码原理

JPEG编码流程图如下:

(1)零偏置(level offset)

对于灰度级是 2^{n} 的像素,通过减去 2^{n}-1,将无符号的整数值变成有符号数;对于 n=8,即将 0~255 的值域,通过减去 128,转换为值域在-128~127 之间的值。

目的:使像素的绝对值出现 3 位 10 进制的概率大大减少。

(2)DCT变换

       首先对图像进行8×8的分块(若图像的宽高不是8的倍数,可对图像进行补0,补至8的倍数),之后进行DCT(离散余弦变换)变换,经DCT变换后,8×8的图像块将变为8×8的DCT系数块。经过DCT变换后,能量集中在左上角,使得左上角数值较大,右下角数值较小。

目的:利用 DCT 变换的特性实现去相关和能量集中,去除冗余信息,提高编码效率。

二维DCT变换计算公式:

​(3)量化

       我们可以通过量化减少数据的编码位数,从而提高编码效率。

       量化表可以选用建议量化表,也可以对建议量化表进行缩放,当然也可以根据实际情况与需求自定义。

  • 因为人眼对亮度信号比对色差信号更敏感,因此使用了两种量化表:亮度量化值和色差量化值。
  • 根据人眼的视觉特性(对低频敏感,对高频不太敏感)对低频分量采取较细的量化,对高频分量采取较粗的量化。

(4)DC系数编码

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

  • 系数的数值比较大;
  • 相邻8×8图像块的DC系数值变化不大(产生冗余)

根据以上特点, JPEG 选用了差分编码(DPCM),对相邻图像块之间量化 DC 系数的差值 DIFF 进行编码。

(5)AC系数之字形扫描和游程编码

① 之字形编码

由于量化之后右下角高频系数大部分为0,在编码是为了制造更长的0游程提高编码效率,采用之字形扫描读取法。经过之字形扫描读出后把二维系数矩阵转换为一维数据序列。在最后, 如果都是零,给出 EOB (End of Block) 即可。 

② 游程编码

JPEG中,游程编码的格式规定为:(run,level)

  • 表示连续run个0,后面跟着值为level的AC系数
  • run:最多15个,故用4位表示RRRR
  • level:类似DC系数,分为类别ID与类内索引。用4位表示类别ID:SSSS
  • (RRRR, SSSS) 联合用 Huffman 编码;对类内索引用定长码编码

(6)Huffman编码

 对DC系数进行差分编码后的结果和AC系数进行游程编码后的结果进行Huffman编码,分成类别: 

  • 类别ID采用一元码编码
  • 类内索引采用定长码编码

由此可知,JPEG 中共采用了四张 Huffman 码表:亮度 DC、亮度 AC、色度 DC、色度 AC

3.JPEG文件格式

(1)Segment组织形式

JPEG在文件中以Segment的形式组织的,它具有以下特点:

  • 均以 0xFF 开始,后跟 1 byte的标记标识符 Marker  和2 byte的标记长度 Segment length(包含表示length 本身所占用的 2 byte,不含“0xFF” + “Marker” 所占用的 2 byte) 以及该标记所对应的payload
  • 标记长度Segment length 部分高位在前,低位在后
  • 熵编码部分的数据在 0xFF 后由编码器插入 0x00 ,解码器解码时跳过此字节不予处理

(2)Segment Marker 

① SOI与EOI

  • SOI:表示图像的开始,固定值为0xFFD8
  • EOI:表示图像的结束,固定值为0xFFD9

② APP0 Segment (0xFFE0)

应用程序保留标记0

③ APPn segment(0xFFEn)

应用细节信息

④ DQT(0xFF DB)

DCT量化表,一般为两个量化表,即亮度(QT号:0)和色度(QT号:1)各一张

⑤ SOF0(0xFF C0)

帧图像的开始,记录每一帧图像的数据长度、样本数据的位数、图像的宽高、颜色分量数、颜色分量信息。 

⑥ DHT(0xFF C4)

Huffman码表,其中包括:

  • Huffman 表的长度:包含长度本身的2 bytes(2 bytes)
  • 类型 AC DC )(1 byte)
  • 索引 Index )(16 bytes)
  • 位表 bit table
  • 表值 value table

Huffman表的类型:

  •  0x00表示DC直流0号
  • 0x01表示DC直流1号
  • 0x02表示AC交流0号
  • 0x03表示AC直流1号 

⑦ SOS(0xFF DA)

标记代码,表示扫描开始

三. 代码调试

1.JPEG解码流程

(1)读取文件

(2)解析 Segment Marker

  1. 解析SOI
  2. 解析APP0:检查标识“JFIF”及版本得到一些参数
  3. 解析DQT:得到量化表长度(可能包含多张量化表)
                      得到量化表的精度
                      得到及检查量化表的序号(只能是 0到3)
                      得到量化表内容(64 个数据)
  4. 解析SOF0:得到每个 sample 的比特数、长宽、颜色分量数
                        得到每个颜色分量的 ID、水平采样因子、垂直采样因子、使用的量化表序号                        (与 DQT 中序号对应)
  5. 解析DHT:得到 Huffman 表的类型(AC、DC)、序号,依据数据重建 Huffman 表
  6. 解析SOS:得到解析每个颜色分量的 DC、AC 值所使用的 Huffman 表序号(与 DHT中序号                     对应)

(3)依据每个分量的水平、垂直采样因子计算 MCU 的大小,并得到每个 MCU 中 8*8 宏块的个数

(4)对每个 MCU 解码(依照各分量水平、垂直采样因子对 MCU 中每个分量宏块解码)

  1. 对每个宏块进行 Huffman 解码,得到 DCT 系数
  2. 对每个宏块的 DCT 系数进行 IDCT,得到 Y、Cb、Cr
  3. 遇到Segment Marker RST 时,清空之前的 DC DCT 系数

(5)解析到 EOI,解码结束

(6) 将 Y、Cb、Cr 转化为需要的色彩空间并保存

2.调试过程

(1)文件读取

读取命令行中的文件信息,进入main主函数:

int main(int argc, char *argv[])

调用convert_one_image(),来进行JPEG解码过程:

int convert_one_image(const char *infilename, const char *outfilename, int output_format)

(2)解析 Segment Marker

解析JPEG文件头函数:

int tinyjpeg_parse_header(struct jdec_private *priv, const unsigned char *buf, unsigned int size)

解析marker标识:

static int parse_JFIF(struct jdec_private *priv, const unsigned char *stream)

解析SOF:

static int parse_SOF(struct jdec_private *priv, const unsigned char *stream)

解析量化表DQT:

static int parse_DQT(struct jdec_private *priv, const unsigned char *stream)

建立量化表(parse_DQT()内):

static void build_quantization_table(float *qtable, const unsigned char *ref_table)

解析SOS:

static int parse_SOS(struct jdec_private *priv, const unsigned char *stream)

解析Huffman表DHT:

static int parse_DHT(struct jdec_private *priv, const unsigned char *stream)

建立Huffman表:

static void build_default_huffman_tables(struct jdec_private *priv)

(3)解析JPEG实际数据

int tinyjpeg_decode(struct jdec_private *priv, int pixfmt)

(4)解析MCU

static void decode_MCU_2x2_3planes(struct jdec_private *priv)

3.结构体解析

(1)huffman_table结构体

该结构体用于存储Huffman码表。

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];
};

(2)component结构体 

该结构体内定义了解码过程中需要使用到的数据(包括水平垂直采样因子、两张Huffman码表、一张量化表),也定义了在解码过程中需要实时更新的数据(包括前一个块的DC值、相应一个块的DCT系数矩阵)。

struct component 
{
  unsigned int Hfactor;  
  unsigned int Vfactor;
  float *Q_table;		/* Pointer to the quantisation table to use */
  struct huffman_table *AC_table;
  struct huffman_table *DC_table;
  short int previous_DC;	/* Previous DC coefficient */
  short int DCT[64];		/* DCT coef */
#if SANITY_CHECK
  unsigned int cid;
#endif
};

(3)jdec_private结构体

该结构体内定义了JPEG数据流结构体,指示了解码过程中所需要的相关信息,如码流参数(开始、结束位置,持续时间)、图像数据(宽高比)、量化表、Huffman码表等,并定义了存储IDCT解码后的Y、U、V分量的值。

struct jdec_private
{
  /* Public variables */
  uint8_t *components[COMPONENTS];
  unsigned int width, height;	/* Size of the image */
  unsigned int flags;

  /* Private variables */
  const unsigned char *stream_begin, *stream_end;
  unsigned int stream_length;

  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];

};

4.TRACE的目的和含义

目的:随着文件的解析,输出中间过程中的某些变量,或者错误信息到txt文件

使用:

  • 令TRACE=1
    #define TRACE 1
    #define  TRACEFILE "trace_jpeg.txt"//add by nxn   //定义输出的trace文件的文件名
  • 需要写入TRACE时,采用判断语句打开TRACE,结束后关闭即可

    #if TRACE
      ... ...
    #endif

四、实验结果

1.将输出文件保存为可供YUVViewer观看的YUV文件

  • 找到输入图像需要调用的函数write_yuv(),在write_yuv()中添加输出yuv文件的相关代码
/**
 * Save a buffer in three files (.Y, .U, .V) useable by yuvsplittoppm
 */
static void write_yuv(const char *filename, int width, int height, unsigned char **components)
{
  FILE *F;
  char temp[1024];

  //yuv分别写入三个文件
  snprintf(temp, 1024, "%s.Y", filename);
  F = fopen(temp, "wb");
  fwrite(components[0], width, height, F);
  fclose(F);
  snprintf(temp, 1024, "%s.U", filename);
  F = fopen(temp, "wb");
  fwrite(components[1], width*height/4, 1, F);
  fclose(F);
  snprintf(temp, 1024, "%s.V", filename);
  F = fopen(temp, "wb");
  fwrite(components[2], width*height/4, 1, F);
  fclose(F);
  printf("write y+u+v\n");

  //yuv写入同一个文件
  snprintf(temp, 1024, "%s.yuv", filename);
  F = fopen(temp, "wb");
  fwrite(components[0], width, height, F);   //写Y
  fwrite(components[1], width * height / 4, 1, F);
  fwrite(components[2], width * height / 4, 1, F);    //写UV
  fclose(F);   //关闭文件
  printf("write yuv\n");
}

结果如下:

2.以txt文件输出所有的量化矩阵和所有的Huffman码表 

 (1)4张Huffman码表

Huffman表在trace_jpeg.txt中已存在

亮度DC:

 亮度AC:

 色度DC:

 色度AC:

 (2)两张量化表

在build_quantization_table()中添加相关输出代码,将量化表记录在trace_jpeg.txt中:

static void build_quantization_table(float *qtable, const unsigned char *ref_table)
{
  int i, j;
  static const double aanscalefactor[8] = {
     1.0, 1.387039845, 1.306562965, 1.175875602,
     1.0, 0.785694958, 0.541196100, 0.275899379
  };
  const unsigned char *zz = zigzag;

  for (i=0; i<8; i++) {
     for (j=0; j<8; j++) {
       *qtable++ = ref_table[*zz++] * aanscalefactor[i] * aanscalefactor[j];
     }
   }

  #if TRACE
  const unsigned char* zz1 = zigzag;
  for (int i = 0; i < 8; i++) {
      for (int j = 0; j < 8; j++) {
          fprintf(p_trace, "%d\t", ref_table[*zz1++]);
          if (j == 7) {
              fprintf(p_trace, "\n");
          }
      }
  }
  #endif

}

结果如下:

 3.输出DC图像、某一个AC值图像并分别统计它们的概率分布

DC图像为直流系数对应构成的图像,某一个AC图像为某一交流分量对应构成的图像。

本次实验选取的jpg图像大小为1024×1024,由采用的为8×8的DCT变化,因此DC图像与AC图像的大小均为128×128。

tinyjpeg_decode中添加如下代码

FILE* DCFile = fopen("DC.yuv", "wb");
  FILE* ACFile_1 = fopen("AC_1.yuv", "wb");
  FILE* ACFile_20 = fopen("AC_20.yuv", "wb");
  if (DCFile == NULL)
  {
      printf("Fail to open DC\n");
      return 0;
  }
  if (ACFile_1 == NULL)
  {
      printf("Fail to open AC_1\n");
      return 0;
  }
  if (ACFile_20 == NULL)
  {
      printf("Fail to open AC_20\n");
      return 0;
  }
  /* Just the decode the image by macroblock (size is 8x8, 8x16, or 16x16) */
  for (y=0; y < priv->height/ystride_by_mcu; y++)
   {
     //trace("Decoding row %d\n", y);
     priv->plane[0] = priv->components[0] + (y * bytes_per_blocklines[0]);
     priv->plane[1] = priv->components[1] + (y * bytes_per_blocklines[1]);
     priv->plane[2] = priv->components[2] + (y * bytes_per_blocklines[2]);
     for (x=0; x < priv->width; x+=xstride_by_mcu)
      {
	decode_MCU(priv);

    *******************************添加代码部分*************************************
    //获取DC与AC系数
    DC_buffer = (unsigned char)((priv->component_infos->DCT[0] + 512) / 4.0);
    fwrite(&DC_buffer, 1, 1, DCFile);
    AC_buffer = (unsigned char)(priv->component_infos->DCT[1] + 128);
    fwrite(&AC_buffer, 1, 1, ACFile);

    //统计每个值的出现次数
    for (int i = 0; i < 256; i++)
    {
        if (DC_buffer == i)
            DC_freq[i]++;
        if (AC_buffer == i)
            AC_freq[i]++;
    }
    ********************************************************************************
   
	convert_to_pixfmt(priv);
	priv->plane[0] += bytes_per_mcu[0];
	priv->plane[1] += bytes_per_mcu[1];
	priv->plane[2] += bytes_per_mcu[2];
	if (priv->restarts_to_go>0)
	 {
	   priv->restarts_to_go--;
	   if (priv->restarts_to_go == 0)
	    {
	      priv->stream -= (priv->nbits_in_reservoir/8);
	      resync(priv);
	      if (find_next_rst_marker(priv) < 0)
		return -1;
	    }
	 }
      }
   }
#if TRACE
  fprintf(p_trace,"Input file size: %d\n", priv->stream_length+2);
  fprintf(p_trace,"Input bytes actually read: %d\n", priv->stream - priv->stream_begin + 2);
  fflush(p_trace);
#endif

**************************************添加代码部分***************************************
  unsigned char UV_buffer = 128;
  for (int i = 0; i < priv->width * priv->height / 32; i++)
  {
      fwrite(&UV_buffer, 1, 1, DCFile);
      fwrite(&UV_buffer, 1, 1, ACFile);
  }
  
  fclose(DCFile);
  fclose(ACFile);

  //计算概率分布
  for (int i = 0; i < 256; i++)
  {
      DC_freq[i] = DC_freq[i] / (priv->width * priv->height / 64);
      AC_freq[i] = AC_freq[i] / (priv->width * priv->height / 64);
  }

  //输出概率分布
  FILE* ACfre = fopen("AC_freq.txt", "wb");
  if (ACfre == 0)
  {
      printf("Fail to open AC_freq.txt\n");
      return 0;
  }

  fprintf(ACfre, "数值\t概率\n");
  for (int i = 0; i < 256; i++)
  {
      fprintf(ACfre, "%d\t%f\n", i, AC_freq[i]);
  }

  FILE* DCfre = fopen("DC_freq.txt", "wb");
  if (DCfre == 0)
  {
      printf("Fail to open DC_freq.txt\n");
      return 0;
  }

  fprintf(DCfre, "数值\t概率\n");
  for (int i = 0; i < 256; i++)
  {
      fprintf(DCfre, "%d\t%f\n", i, DC_freq[i]);
  }
 ****************************************************************************************

  return 0;

DC图像及其概率分布:

数值    概率
0    0.000000
1    0.000000
2    0.000000
3    0.000000
4    0.000000
5    0.000000
6    0.000000
7    0.000000
8    0.000000
9    0.000000
10    0.000000
11    0.000000
12    0.000000
13    0.000000
14    0.000000
15    0.000000
16    0.000000
17    0.000000
18    0.000000
19    0.000000
20    0.000000
21    0.000000
22    0.000000
23    0.000000
24    0.000000
25    0.000000
26    0.000000
27    0.000000
28    0.000000
29    0.000000
30    0.000000
31    0.004700
32    0.005676
33    0.004395
34    0.002686
35    0.004333
36    0.003418
37    0.003113
38    0.003235
39    0.003174
40    0.002625
41    0.003113
42    0.002747
43    0.003906
44    0.003296
45    0.003479
46    0.002625
47    0.003113
48    0.003906
49    0.002258
50    0.003540
51    0.004089
52    0.002258
53    0.003662
54    0.003296
55    0.002625
56    0.003418
57    0.003906
58    0.003113
59    0.003296
60    0.002380
61    0.003784
62    0.002869
63    0.002808
64    0.003662
65    0.003296
66    0.003662
67    0.003845
68    0.003418
69    0.002808
70    0.003296
71    0.003235
72    0.003540
73    0.003113
74    0.003784
75    0.003357
76    0.004211
77    0.010193
78    0.012085
79    0.011047
80    0.010925
81    0.010376
82    0.010254
83    0.009827
84    0.010559
85    0.009277
86    0.009949
87    0.010010
88    0.011536
89    0.009521
90    0.010254
91    0.010559
92    0.009827
93    0.009033
94    0.010681
95    0.010376
96    0.010315
97    0.009644
98    0.011230
99    0.009155
100    0.010315
101    0.010071
102    0.011108
103    0.011963
104    0.011292
105    0.002136
106    0.003174
107    0.002319
108    0.002747
109    0.002014
110    0.002258
111    0.001892
112    0.002258
113    0.001770
114    0.002014
115    0.002380
116    0.002747
117    0.002808
118    0.001831
119    0.002136
120    0.002319
121    0.002563
122    0.002502
123    0.002808
124    0.001709
125    0.002136
126    0.002441
127    0.002380
128    0.001892
129    0.002136
130    0.002441
131    0.002808
132    0.001648
133    0.002380
134    0.002319
135    0.002319
136    0.002808
137    0.002380
138    0.002502
139    0.002136
140    0.002136
141    0.001892
142    0.002502
143    0.001770
144    0.002319
145    0.001953
146    0.002686
147    0.002747
148    0.002197
149    0.002258
150    0.007507
151    0.014282
152    0.010620
153    0.010071
154    0.009888
155    0.010376
156    0.009583
157    0.011475
158    0.009949
159    0.010254
160    0.010010
161    0.010864
162    0.008545
163    0.010864
164    0.009277
165    0.010376
166    0.011292
167    0.011230
168    0.009277
169    0.009277
170    0.009399
171    0.011230
172    0.009460
173    0.010193
174    0.011108
175    0.011780
176    0.011169
177    0.014160
178    0.002869
179    0.003235
180    0.003662
181    0.003662
182    0.003540
183    0.002930
184    0.003235
185    0.002747
186    0.003784
187    0.003601
188    0.002991
189    0.003418
190    0.003479
191    0.003845
192    0.003479
193    0.003235
194    0.003113
195    0.002014
196    0.003357
197    0.003601
198    0.003113
199    0.003418
200    0.003174
201    0.002991
202    0.003235
203    0.003174
204    0.003479
205    0.002747
206    0.004028
207    0.003418
208    0.003113
209    0.003113
210    0.002930
211    0.003235
212    0.002869
213    0.003723
214    0.003052
215    0.002380
216    0.003113
217    0.003052
218    0.003357
219    0.004150
220    0.003479
221    0.004272
222    0.004700
223    0.006348
224    0.000000
225    0.000000
226    0.000000
227    0.000000
228    0.000000
229    0.000000
230    0.000000
231    0.000000
232    0.000000
233    0.000000
234    0.000000
235    0.000000
236    0.000000
237    0.000000
238    0.000000
239    0.000000
240    0.000000
241    0.000000
242    0.000000
243    0.000000
244    0.000000
245    0.000000
246    0.000000
247    0.000000
248    0.000000
249    0.000000
250    0.000000
251    0.000000
252    0.000000
253    0.000000
254    0.000000
255    0.000000

AC图像及其概率分布:

 数值    概率
0    0.000000
1    0.000000
2    0.000000
3    0.000000
4    0.000000
5    0.000000
6    0.000061
7    0.000000
8    0.000000
9    0.000000
10    0.000000
11    0.000000
12    0.000000
13    0.000000
14    0.000000
15    0.000000
16    0.000000
17    0.000000
18    0.000000
19    0.000000
20    0.000000
21    0.000000
22    0.000000
23    0.000000
24    0.000000
25    0.000000
26    0.000000
27    0.000000
28    0.000000
29    0.000000
30    0.000000
31    0.000000
32    0.000000
33    0.000061
34    0.000000
35    0.000000
36    0.000000
37    0.000000
38    0.000061
39    0.000000
40    0.000000
41    0.000000
42    0.000000
43    0.000000
44    0.000000
45    0.000000
46    0.000000
47    0.000000
48    0.000000
49    0.000000
50    0.000000
51    0.000000
52    0.000000
53    0.000000
54    0.000000
55    0.000000
56    0.000061
57    0.000000
58    0.000000
59    0.000000
60    0.000000
61    0.000000
62    0.000000
63    0.000000
64    0.000000
65    0.000061
66    0.000000
67    0.000122
68    0.000000
69    0.000000
70    0.000000
71    0.000000
72    0.000000
73    0.000000
74    0.000000
75    0.000000
76    0.000000
77    0.000000
78    0.000000
79    0.000000
80    0.000000
81    0.000000
82    0.000000
83    0.000000
84    0.000061
85    0.000061
86    0.000000
87    0.000061
88    0.000000
89    0.000122
90    0.000000
91    0.000061
92    0.000000
93    0.000610
94    0.007690
95    0.009888
96    0.006104
97    0.004822
98    0.004456
99    0.004517
100    0.003357
101    0.003784
102    0.003052
103    0.003235
104    0.002808
105    0.003723
106    0.005188
107    0.006470
108    0.005615
109    0.006897
110    0.008362
111    0.015686
112    0.032166
113    0.020935
114    0.016907
115    0.014465
116    0.013245
117    0.012817
118    0.012634
119    0.013611
120    0.016052
121    0.016663
122    0.034180
123    0.058716
124    0.032654
125    0.026917
126    0.024719
127    0.024597
128    0.029419
129    0.025452
130    0.024048
131    0.025574
132    0.028503
133    0.034851
134    0.051819
135    0.019043
136    0.012573
137    0.012207
138    0.012451
139    0.013123
140    0.014526
141    0.015747
142    0.008545
143    0.007874
144    0.008667
145    0.010437
146    0.013977
147    0.007324
148    0.006165
149    0.008179
150    0.005981
151    0.007019
152    0.006836
153    0.007324
154    0.007263
155    0.009033
156    0.010071
157    0.009399
158    0.011230
159    0.014893
160    0.026184
161    0.009827
162    0.000122
163    0.000183
164    0.000488
165    0.000244
166    0.000122
167    0.000244
168    0.000244
169    0.000183
170    0.000305
171    0.000061
172    0.000122
173    0.000305
174    0.000061
175    0.000000
176    0.000244
177    0.000183
178    0.000061
179    0.000000
180    0.000183
181    0.000183
182    0.000000
183    0.000305
184    0.000122
185    0.000000
186    0.000122
187    0.000183
188    0.000122
189    0.000061
190    0.000122
191    0.000000
192    0.000183
193    0.000061
194    0.000000
195    0.000000
196    0.000061
197    0.000000
198    0.000183
199    0.000061
200    0.000061
201    0.000000
202    0.000000
203    0.000061
204    0.000122
205    0.000000
206    0.000000
207    0.000061
208    0.000000
209    0.000000
210    0.000061
211    0.000061
212    0.000061
213    0.000000
214    0.000122
215    0.000000
216    0.000000
217    0.000061
218    0.000061
219    0.000000
220    0.000000
221    0.000061
222    0.000000
223    0.000000
224    0.000000
225    0.000000
226    0.000000
227    0.000000
228    0.000000
229    0.000000
230    0.000000
231    0.000000
232    0.000000
233    0.000000
234    0.000000
235    0.000000
236    0.000000
237    0.000061
238    0.000000
239    0.000000
240    0.000000
241    0.000000
242    0.000000
243    0.000061
244    0.000000
245    0.000000
246    0.000000
247    0.000000
248    0.000000
249    0.000000
250    0.000000
251    0.000000
252    0.000000
253    0.000000
254    0.000061
255    0.000000

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值