本博文为概览性介绍。后面有空了再分几篇博文分别介绍所用到的技术细节。

1.编解码目标

编码和解码是个逆过程。jpeg编码的目的在于图形去冗余,进行数据压缩,解码的目的在于还原图像,使能够进行预览。

2.编码过程

贴一张网上的图片,但缺少了一些步骤,下面用文字来描述每一个步骤。

2.1.采样。

8位采样,像素值的范围锁定在0-255,无符号,都为正数。

2.1.分块(block)

补成8x8的block,以应对宽和高不是8的整数倍的情况,方便后续进行8x8的DCT2变换。

2.2.零偏置(LevelOffset)

通过减28-1=128,使各个像素值以0为中心分布,变换后的值有的为正,有的为负,在[-128,127]区间分布。

2.2.8x8的二维离散余弦变换(DCT2)。

DCT变换是最小均方误差条件下的得出的最佳正交变换。可以去相关性,将时域数据变换到频域,将能量集中于低频分量附近。

变换后可以看到:变换前的8x8个数据值,大小都很接近;变换后,能量集中于左上角,右下角的较小。左上角——直流分量值的绝对值一般变成了最大的值。
    2.4.z字形编码(zigzag scan)。

由2维变1维,一般后扫描到的值的绝对值小于先扫描的。

2.3.量化(quantization)。

将较大的值按一定的倍数进行缩小,而这个缩小倍数视位置不同而不同。(补充:该步骤可以与上一步颠倒)(如果先量化再扫描,可以看到:在量化后,后下角的值大部分都变成接近0的较小的值)

2.5.差分脉冲编码(DPCM)对直流系数(DC)进行编码。

相同component分量的每个block的直流分量值,设置为一个差值,为:cur_block_dc_val - last_block_dc_val,DPCM也由此而来,即DC值的差分。
    2.6.行程编码(RLE)对交流系数(AC)进行编码。

8x8的数据块,除了第一个DC值外,其他63个都是交流值,需要用到RLE编码。

  RLE也称为游程编码,由一对值来表示,例如(m,n),m表示距离下一个非零值的距离,n表示下个值的值大小。例如(0,12)表示紧接着的值是12,而(4,6)表示中间经过4个0后,下个值为6。
    2.7.熵编码(entropy encode)。

一般使用范式霍夫曼编码(huffman_encode——可变长编码算法中的一种),高概率的字符分配较短的code来表示,低概率的字符分配较长的code来表示。

3.其他补充说明

采样和量化都是有损编码,而DCT变换、DPCM、RLE、HuffmanEncode为无损编码。

最新文章

  1. monkeyrunner之测试结果判断(八)
  2. Android setVisibility()
  3. iOS10 拍照崩溃问题
  4. GoLang 通过http Post获取数据
  5. BZOJ 3675 序列分割
  6. vbox 不识别u盘的问题
  7. IOS - 唯一标识符的获得和更新
  8. C# 工程中引用出现感叹号
  9. js将long日期格式转换为标准日期格式
  10. HDU 4734
  11. 【epub.js|翻译|原创】开源中间件epub.js的使用及其中文文档
  12. Java Servlet 笔记4
  13. 测试CentOS-7-x86_64-Minimal-1708.iso这种光盘安装效果
  14. Java并发编程之同步
  15. 详解C程序编译、链接与存储空间布局
  16. BZOJ2428 HAOI2006均分数据(模拟退火)
  17. Python调shell
  18. Dream------scala--函数定义、流程控制、异常处理
  19. sublime php插件
  20. jsp+mysql的字符过滤器

热门文章

  1. xmind8 破解激活教程
  2. Java集合 Collection、Set、Map、泛型 简要笔记
  3. ssm框架(Spring Springmvc Mybatis框架)整合及案例增删改查
  4. oeasy教您玩转linux010102查看发行版
  5. webdriver实现简单的窗口切换
  6. Unity插件介绍——Odin
  7. Linux 基础指令2
  8. Java使用POI的SXSSFWorkbook与HSSFWorkbook导出复杂表头
  9. eslint prettier vetur eslint
  10. 自定义注解-方法重试@RetryProcess