JPEG格式简介

JPEG( Joint Photographic Experts Group)即联合图像专家组,是用于连续色调静态图像压缩的一种标准,文件后缀名为.jpg或.jpeg,是最常用的图像文件格式。其主要是采用预测编码(DPCM)、离散余弦变换(DCT)以及熵编码的联合编码方式,以去除冗余的图像和彩色数据,属于有损压缩格式,它能够将图像压缩在很小的储存空间,一定程度上会造成图像数据的损伤。尤其是使用过高的压缩比例,将使最终解压缩后恢复的图像质量降低,如果追求高品质图像,则不宜采用过高的压缩比例。[2]

然而,JPEG压缩技术十分先进,它可以用有损压缩方式去除冗余的图像数据,换句话说,就是可以用较少的磁盘空间得到较好的图像品质。而且JPEG是一种很灵活的格式,具有调节图像质量的功能,它允许用不同的压缩比例对文件进行压缩,支持多种压缩级别,压缩比率通常在10;1到40;1,压缩比越大,图像品质就越低;相反地,压缩比越小,图像品质就越高。同一幅图像,用JPEG格式存储的文件是其他类型文件的1/10~1/20,通常只有几十KB,质量损失较小,基本无法看出。JPEG格式压缩的主要是高频信息,对色彩的信息保留较好,适合应用于互联网;它可减少图像的传输时间,支持24位真彩色;也普遍应用于需要连续色调的图像中。 [2]

JPEG格式可分为标准JPEG、渐进式JPEG及JPEG2000三种格式。 [2]

1. 标准JPEG格式;此类型在网页下载时只能由上而下依序显示图像,直到图像资料全部下载完毕,才能看到图像全貌。 [2]

2. 渐进式JPEG;此类型在网页下载时,先呈现出图像的粗略外观后,再慢慢地呈现出完整的内容,而且存成渐进式JPG格式的文档比存成标准JPG格式的文档要来得小,所以如果要在网页上使用图像,可以多用这种格式。 [2]

3. JPEG2000;它是新一代的影像压缩法,压缩品质更高,并可改善在无线传输时,常因信号不稳造成马赛克现象及位置错乱的情况,改善传输的品质

JPEG编码流程

过程分析:

1)零偏置(level offset)

JPEG编码将图像分为8×8的块作为数据处理的最小单位,对于灰度级为 2 n 2^n 2 n的像素,通过减去 2 n − 1 2^{n-1} 2 n−1 ,将无符号数变成有符号数。以灰度级n=8为例,原来图像的灰度范围是[0,255],减去128之后变为了[-128,127]。经过零偏置后,图像平均亮度降低,像素灰度的绝对值被控制在较小的范围内,有利于后续编码。

2)DCT变换

对零偏置后的图像进行DCT变换,以进行能量集中和去相关,同时去除图像的空间冗余,变换后图像的能量都集中在右上角,同时DCT变换是一种无损变换,在变换过程中没有精度损失。如果有些图片并非8×8的整数倍,那么就需要在边缘进行像素填充。

3)量化

因为人眼对亮度信号比对色差信号更敏感,因此使用了两种量化表,分别是亮度量化值和色差量化值。同时因为人眼对低频敏感高频不太敏感,因此对低频分量采取较细的量化,对高频分量采取较粗的量化,因此细节少的原始图像在压缩时去掉的数据要少

4)DC系数的差分编码

8×8的图像块经过DCT变换之后得到的DC直流系数有两个特点:系数的数值比较大;相邻8×8图像块的DC系数值变化不大(存在冗余),因此可以采用DPCM方法,对相邻图像块之间量化DC系数的差值进行编码,编码方式采用熵编码(Huffman编码),亮度信号与色度信号的DC系数采用不同的Huffman编码表
5)AC系数的zig-zag扫描与游程编码

JPEG解码流程

解码就是编码的逆过程,其大致流程如下:

读取文件>解析文件segment>解析SOI,判断是否是JPEG文件>解析SOF>解析DQT,获取量化表相关信息>解析SOS>解析DHT,获取Huffman码表相关信息>解析DRI>以MCU为单位进行解码>解码Huffman数据>解码DC差值>重构量化后的系数>DCT逆变换>丢弃填充的行/列>反0偏置>对丢失的CbCr分量差值(下采样的逆过程)>YCbCr->RGB

JPEG代码分析

MAIN

int main(int argc, char *argv[])
{int output_format = TINYJPEG_FMT_YUV420P;char *output_filename, *input_filename;clock_t start_time, finish_time;unsigned int duration;int current_argument;int benchmark_mode = 0;
#if TRACE     //设定trace,边解码边写入文件p_trace=fopen(TRACEFILE,"w");if (p_trace==NULL){printf("trace file open error!");}
#endifif (argc < 3)usage();current_argument = 1;while (1){if (strcmp(argv[current_argument], "--benchmark")==0)   //strcmp字符串比较,用于比较两个字符串,如果二者相等返回0benchmark_mode = 1;   //如果相等,说明设置了benchmark,因此benchmark_mode置1elsebreak;current_argument++;}if (argc < current_argument+2)usage();input_filename = argv[current_argument];    //输入文件名,是argv[1]if (strcmp(argv[current_argument+1],"yuv420p")==0)    //argv[2]判断输出格式,这里选择yuv420poutput_format = TINYJPEG_FMT_YUV420P;else if (strcmp(argv[current_argument+1],"rgb24")==0)output_format = TINYJPEG_FMT_RGB24;else if (strcmp(argv[current_argument+1],"bgr24")==0)output_format = TINYJPEG_FMT_BGR24;else if (strcmp(argv[current_argument+1],"grey")==0)output_format = TINYJPEG_FMT_GREY;elseexitmessage("Bad format: need to be one of yuv420p, rgb24, bgr24, grey\n");output_filename = argv[current_argument+2];   //输出文件名,设为argv[3]start_time = clock();    //开始if (benchmark_mode)   //是否多次解码,若设置了benchmark_mode就调用load_multiple_times,否则就调用convert_one_imageload_multiple_times(input_filename, output_filename, output_format);elseconvert_one_image(input_filename, output_filename, output_format);    //核心函数finish_time = clock();  //结束duration = finish_time - start_time;snprintf(error_string, sizeof(error_string),"Decoding finished in %u ticks\n", duration);
#if TRACEfclose(p_trace);
#endifreturn 0;
}

主要进行输入输出文件的获取、输出格式和解码方式的选择等。

huffman_table

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

component

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_CHECKunsigned int cid;
#endif
};

jdec_private

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

实验结果

概率分布:

总结

本次实验学习理解了JPEG编解码的基本过程,

JPEG原理分析及JPEG解码器调试相关推荐

  1. JPEG原理分析及JPEG解码器的解析

    文章目录 JPEG原理分析及JPEG解码器的调试 原理分析 JPEG编解码流程图 DC系数编码 AC系数编码 JPEG文件格式 Segment组织形式 JPEG 的 Segment Marker no ...

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

    文章目录 数据压缩实验(五) 一.JPEG原理分析 1.概述 优点 缺点 2.JPEG编解码原理 (1)彩色空间 (2)Level offset--零偏置电平下移 (3)8x8 DCT--离散余弦变换 ...

  3. 【数据压缩-实验5】JPEG原理分析及JPEG解码器的调试

    目录 JEPG原理 简述 优点 缺点 JPEG文件格式 常用标记码 编解码原理 编码原理 Level offset-零偏置 DCT变换 量化 DC系数差分编码 AC系数的之字形扫描+游程编码 解码原理 ...

  4. 【数据压缩】实验:JPEG原理分析及JPEG解码器的调试

    一.JPEG编解码原理 1.1 JPEG图像压缩标准基本介绍 JPEG是Joint Photographic Experts Group(联合图像专家小组)的缩写,文件后缀名为.jpg或.jpeg,是 ...

  5. 【数据压缩】实验五——JPEG原理分析及JPEG解码器的调试

    (一)实验目的 掌握JPEG编解码系统的基本原理.初步掌握复杂的数据压缩算法实现,并能根据理论分析需要实现所对应数据的输出. JPEG( Joint Photographic Experts Grou ...

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

    一.JPEG编码原理 1.将RGB转换为YUV空间.(相关性较小) 2.零偏置.(使最大的绝对值大的无符号数变为绝对值小的有符号数,减小数据平均的位数,例如0~255变为-128~127) 3.做8* ...

  7. 实验五—JEPG 原理分析及 JPEG 解码器的调试

    文章目录 一.JPEG编码原理 1.Level Offset(水平偏移)能量的重新分配 2.DCT变换 3.Uniform scalar quantization 均匀标量量化 4.DC系数差分编码 ...

  8. 数据压缩实验五 JPEG原理分析JPEG解码器的调试

    一.实验原理 1.JPEG原理及编码流程   JPEG是常见的一种图像格式,由ISO与CCITT建立并开发,是一个国际数字图像压缩标准.JPEG文件的扩展名为.jpg或.jpeg,用有损方式去除冗余的 ...

  9. JPEG 原理详细实例分析及其在嵌入式 Linux 中的应用

    http://www.ibm.com/developerworks/cn/linux/l-cn-jpeg/index.html 一.系统架构 本文以一个实际的产品为例,来说明 JPEG 在其中的应用. ...

最新文章

  1. 040_Unicode对照表六
  2. 我的 CSS3 笔记
  3. Docker 使用Dockerfile构建Docker(三)
  4. 鼠标移动到ul图片会摆动_我们可以从摆动时序分析中学到的三件事
  5. LabelStudio + MMDetection 实现目标分割预标注
  6. 江苏机器人竞赛南航_挑战不止 热血不息!1000余名青少年决战江苏省机器人普及大赛!...
  7. 上:Spark VS Flink – 下一代大数据计算引擎之争,谁主沉浮?
  8. android 安全的未来(II)
  9. python实现JWT
  10. Atitit 图片压缩功能 attilax艾提拉总结 缩略图功能 小于一定分辨率不压缩,防止小图放大 Resize图片缩小 图像质量参数 等比压缩 Gm的事业使用 1.更改当前目录下*
  11. 国密 sm系列 java实现_国密标准SM3算法,java实现
  12. 打开SVN server图形化管理界面
  13. 2011年12月13日 timeout 与 refused windows clipbrd
  14. 免费杀毒软件真的能杀木马吗?
  15. java dismiss_为什么我的dismiss()方法无法关闭自定义警报对话框
  16. 中文计算机期刊影响因子排名,最新计算机类中文核心期刊影响因子排名
  17. 终于搞懂Dijkstra算法了
  18. 机器学习_决策树与信息熵
  19. knn K近邻算法python实现
  20. python经典程序实例代码,python编程应用实例

热门文章

  1. 裴健加入京东是“数据AI”之战,也是新零售的内核之战
  2. 阿里巴巴风鸣:做技术Leader要有危机意识
  3. Vue 3.3 正式发布 [浪客剑心]
  4. 【本地网络服务器】(一)Windows安装CentOS双系统
  5. web服务器显示禁用,win10系统打开ppt提示默认情况下禁用对此web服务器的访问的处理办法...
  6. 逻辑漏洞学习-身份验证漏洞
  7. 关于keil和proteus联调失败的原因探究
  8. 2021考研——复习规划(408篇)
  9. kotlin面向对象之枚举、印章类
  10. 42th Unicode Conference随笔(一)