一、实验目的
掌握JPEG编解码系统的基本原理。初步掌握复杂的数据压缩算法实现,并能根据理论分析需要实现所对应数据的输出。
二、实验设备
安装Windows和Visual Studio软件的个人计算机
三、实验内容
1.jpeg解码原理
解码是编码的逆过程
2.jpeg文件格式
2.1Segment 的组织形式
JPEG 在文件中以 Segment 的形式组织,它具有以下特点:
· 均以 0xFF 开始,后跟 1 byte 的 Marker 和 2 byte 的 Segment length(包含表示Length 本身所占用的 2 byte,不含“0xFF” + “Marker” 所占用的 2 byte);
·采用 Motorola 序(相对于 Intel 序),即保存时高位在前,低位在后;
·Data部分中,0xFF后若为0x00,则跳过此字节不予处理;
2.2JPEG 的 Segment Marker
2.3jpeg解码流程
(1)读取文件
(2)解析segmentmarker:依次解析出SOI、APPO、DCT、SCF0、DHT、SOS、EOI
(3)依据每个分量的水平采样、垂直采样因子计算MCU(微控制单元,即RAM,即要开辟的图像内存?)的大小,并得到每个MCU中8*8宏块的个数。
(4)对每个MCU解码:对每个宏块进行huffman解码得到DCT系数,进行IDCT得到变换之前的数据。
(5)解析到EOI,解码结束
(6)将得到的Y、Cb、Cr转换成需要的色彩空间并保存。
四、编码过程
1、逐步调试JPEG解码器程序。将输入的JPG文件进行解码,将输出文件保存为可供YUVViewer观看的YUV文件。
1)加入yuv格式
2)loadjpeg.c中加入判断输出格式—YUV
3)loadjpeg.c的main函数中增加判断yuv代码
4)在tinyjpeg.c中加入case TINYJPEG_FMT_YUV项
输出yuv文件如图:
2、 程序调试过程中,应做到:
2.1理解程序设计的整体框架
理解三个结构体的设计目的
1)理解struct_huffman
struct huffman_table
{
/*快速查表,用哈夫曼散列比特查看符号,如果符号<0,那么我们需要查看树表 */
short int lookup[HUFFMAN_HASH_SIZE];
/* 给出编码符号的位数 */
unsigned char code_size[HUFFMAN_HASH_SIZE];
/*用于存储未在查找表中编码的值的位置,计算256值是否足以存储所有值
*/
uint16_t slowtable[16-HUFFMAN_HASH_NBITS][256];
};
2)理解struct component
struct component
{
unsigned int Hfactor;//水平采样//
unsigned int Vfactor;//垂直采样//
float *Q_table; /* 指向要使用的量化表的指针*/
struct huffman_table *AC_table;//交流huffman结构体//
struct huffman_table *DC_table;//直流huffman结构体//
short int previous_DC; /*输入前直流系数 */
short int DCT[64]; /* 输入dct系数 */
#if SANITY_CHECK
unsigned int cid;
#endif
};
3)理解 struct jdec_private
struct jdec_private
{
/* 公有变量 */
uint8_t *components[COMPONENTS];
unsigned int width, height; /* 图像大小 长宽 */
unsigned int flags;
/*私有变量 */
const unsigned char *stream_begin, *stream_end;//数据流开始、结束指针//
unsigned int stream_length;//数据流长度//
const unsigned char *stream; /* 指向当前流的指针 */
unsigned int reservoir, nbits_in_reservoir;
struct component component_infos[COMPONENTS];
float Q_tables[COMPONENTS][64]; /* 量化表 */
struct huffman_table HTDC[HUFFMAN_TABLES]; /* 直流霍夫曼表 */
struct huffman_table HTAC[HUFFMAN_TABLES]; /* 交流霍夫曼表 */
int default_huffman_table_initialized;
int restart_interval;//开始//
int restarts_to_go; /* MCU在此重新启动间隔内离开 */
int last_rst_marker_seen; /*Rst标记每次递增 */
/* IDCT之后用于存储每个组件的临时空间 */
uint8_t Y[64*4], Cr[64], Cb[64];
jmp_buf jump_state;
/*内部指针用于颜色空间转换,请勿修改 */
uint8_t *plane[COMPONENTS];
};
2.2理解在视音频编解码调试中TRACE的目的和含义
• 会打开和关闭TRACE
tracef写入txt代码
• 会根据自己的要求修改TRACE
加入水平采样和垂直采样
3.以txt文件输出所有的量化矩阵和所有的HUFFMAN码表。
输入以下代码
(截取部分)
4. 输出DC图像并统计其概率分布。
5. 输出某一个AC值图像并统计其概率分布。