【原创】这次更新比较慢,译码过程比想象中复杂一些,更主要是译出来的DCT系数无法确定是否正确,要想验证就需要再进行正向压缩编码,再次形成jpeg图像验证正确,后续工作正在开展,这里就说一说译码的主要思路和过程。

说到译码过程,首先要了解jpeg图像数据流的组成:

数据流是以MCU(最小编码单元)为基本单位的,一个MCU又由若干个Y,Cr,Cb颜色分量单元组成,这里的颜色分量单元可以看作是一个8*8的矩阵,也就是译码过程中的最小单元了,可能读者对于这些结构的关系还不是很了解,OK,我们来看看下面这个图(word绘制,简洁易懂~)

一个MCU中的颜色分量单元个数由jpeg文件头中SOF0段中定义,SOF0段中有定义每个颜色分量的水平和垂直采样因子,这里假设水平,垂直采样因子分别为2:1:1,2:1:1。这个采样因子是什么意思呢,我们来看看上图。假设上图是一个16*16(像素)的图片,可以分成四个8*8的小矩阵,每个8*8小矩阵都是一个颜色分量单元,Y分量的水平采样因子为2则说明在一个MCU的水平方向上采样两次,垂直采样因子同理,因此在本例中一个MCU会有4个Y颜色分量单元,1个Cr颜色分量单元,1个Cb颜色分量单元。从这里我们也能得知一个MCU的大小是由水平、垂直采样因子的最大值决定的,假设分别为V_max和H_max,则MCU的大小为(V_max*8)*(H_max*8)。这些结构的关系如下:

颜色分量单元组成MCU,MCU组成数据流

现在再来看看图片中含有多个MCU的情况,假设有四个,允许我再盗用一下上面的图哈,

可以看到,一幅图像里MCU是按行排列的,在数据流中保存的顺序就是MCU1、MCU2、MCU3、MCU4。。。。每个MCU中的顺序为Y1、Y2、Y3、Y4、Cr、Cb(这里是按采样因子4:1:1,其他也类似,总之就是按Y、Cr、Cb的顺序)。

了解了数据流的组成,下面就要开始译码工作了,这也是个烦杂的过程。。。。

在JPEG压缩过程中,不仅使用了哈夫曼编码,还使用了RLE行程编码和差分编码,真是极尽压缩啊。。。这三种编码在JPEG中是综合运用的,可以达到很好的压缩效果。本人这里就从解码的角度来进行介绍了,个人觉得从解码角度来理解更为方便~

首先,JPEG中直流和交流系数是分开进行编码的,也就是说译码的过程有些许不同,而且采用的哈夫曼树也是不同的,其次,JPEG中的每个颜色分量也是分开进行编码的,不同颜色分量采用的哈夫曼树也是不同的,具体的每个颜色分量的交直流系数采用的哈夫曼树ID可以从文件头的SOF0段中得知,SOF0段的内容可以看我的另一篇博文

http://www.cnblogs.com/gungnir2011/p/3615273.html

在数据流中是以bit为单位存储信息的,每个DCT系数(8*8)矩阵都有1个直流分量和63个交流分量,每个矩阵的译码都先译直流分量,再译交流分量,具体的步骤如下:

1.按bit读取,对直流哈夫曼树进行搜索,直到搜索到叶子节点,说明这时命中了一个编码,哈夫曼树的权值代表还需继续读取多少bit,比如权值为0x04,则说明继续读取4bit,这4bit的值根据译码表(后面会给出)获取的值就是直流DCT系数。

2.继续按bit读取,这时是对交流哈夫曼树进行搜索,直到叶子节点,这里的权值和直流不一样,权值的高四位代表即将译出的交流DCT系数前面有多少个0,这里是行程编码,低四位代表还需继续读取多少bit,之后获得系数和直流一样。

3.不断重复步骤2,直到满足结束条件:

  • 读到的权值为0,则该矩阵中之后的所有值都为0,并结束该矩阵的译码;
  • 63个交流分量都已全部译完。

译码表:

编码数值 实际数值
0,1 -1,1
00,01,10,11 -3,-2,2,3
000,001,010,011,100,101,110,111 -7,-6,-5,-4,4,5,6,7
................. ......................

之后就是译完一个矩阵译下一个,译完一个颜色分量译下一个,直到所有译完~~

当然这只是理论,在实践过程中会遇到各种奇葩问题,下次更新中会详细说说我遇到的各种奇葩错误,现在还未完全写完译码部分,为了进度现在直接在研究libjpeg开源库,之后可能会找个时间把译码做完,未完待续~~

---------------------------------------------------分割线-------------------------------------------------------------

现在来说说我遇到的各种奇葩问题:

首先,关于权值问题,刚开始译码的时候没有考虑到交流权值的低四位和直流权值为0的情况,运行自然就挂掉了。。。遇到这种情况,就说明继续读取0bit,0bit的值就是0,所以遇到这种情况得到的系数值就应该是0。

其次,有些8*8的矩阵译码有时候会出现译出第65个值,按道理来说应该只有64个值的,这种情况我还没有弄清楚是什么原因,但是在没有出现这种情况以前译码的结果都是对的,当出现这种情况以后大概再过几个矩阵之后所有的译码结果基本上都不对。。。具体原因我会继续分析,因此在这里再次推荐使用库函数进行操作。

再来说说一些注意事项和建议吧:

  • 记录当前读取到第几个字节的第几位时,记录位数一定要计算好,一位出错,之后全错。。。像一些系数译出来要退出,以及其他退出情况时,退出之前要将位数往后移;
  • 对于继续读取的位数为0的情况最好单独进行处理,逻辑也容易清晰一些;
  • 读取出来的二进制要根据上述译码表进行译码,不能直接转换,否则结果不对;

其他就是一些编程时需要注意的小问题了,就不一一叙说了。

转载于:https://www.cnblogs.com/gungnir2011/p/3624715.html

【原创】JPEG图像密写研究(三) 数据流译码相关推荐

  1. JPEG图像密写研究(一) JPEG图像文件结构

    [转载]转载自http://www.cnblogs.com/leaven/archive/2010/04/06/1705846.html JPEG压缩编码算法的主要计算步骤如下: (0) 8*8分块. ...

  2. 【图像隐写】基于LSB+DWT+DCT三种算法实现图像和音频水印嵌入提取含Matlab源码

    1 简介 基于LSB+DWT+DCT三种算法实现图像和音频水印嵌入提取. 1.1 LSB算法 根据LSB算法简单易实现的特点,结合在图像置乱技术中很好特性的Arnold变换.利用变化产生影子图像.通过 ...

  3. nsf5隐写算法 matlab,基于纹理复杂度的JPEG图像自适应隐写

    0 引言 隐写术是一种利用载体的掩蔽效应将秘密信息隐藏,实现信息秘密传递的技术.隐写载体可以是图像.音频.视频.文本等网络数字媒体.由于JPEG已成为目前互联网上进行图像传输时最常用的图像格式,因此以 ...

  4. 图像隐写分析——生成含密图像 Stego Image

    文章目录 一 图像隐写分析的数据集 二 含密图像展示 三 结语 一 图像隐写分析的数据集   小编本科毕设的题目是<基于深度学习的图像隐写分析>,图像隐写分析问题本质上是一个二分类(bin ...

  5. 图像信噪比计算公式_CT 科研设计之图像质量对比研究三步曲

    CT科研是CT技术的窗口,帮助医务工作者开展CT科研也是我们的责任和义务! 问 如何科学地比较不同重建技术的图像质量? 答 首先要排除其他影响图像质量的因素, 然后进行客观指标的比较, 最后进行主观指 ...

  6. java写三次函数导数,用导数研究三次函数

    <用导数研究三次函数>由会员分享,可在线阅读,更多相关<用导数研究三次函数(14页珍藏版)>请在人人文库网上搜索. 1.用导数研究三次函数1. 知识点解析1.定义:定义1.形如 ...

  7. 深度学习之图像隐写去除(DDSP模型 Steganography Removal)

    文章目录 一 前言 二 论文内容 2.1 Abstract 2.2 Introduction 2.3 Background 2.3.1 Prior Work 2.3.2 Super Resolutio ...

  8. Deep Learning Hierarchical Representations for Image Steganalysis【Ye-Net:图像隐写分析的深度学习层次表示】

    Deep Learning Hierarchical Representations for Image Steganalysis [Ye-Net:图像隐写分析的深度学习层次表示] Abstract ...

  9. Efficient feature learning and multi-size image steganalysis based on CNN【Zhu-Net基于高效特征学习与多尺度图像隐写分析】

    摘要 对于隐写分析,许多研究表明卷积神经网络比传统机器学习方法的两部分结构具有更好的性能.然而,仍然有两个问题需要解决:降低隐写分析特征映射的信噪比和对任意大小的图像进行隐写分析.一些算法需要固定大小 ...

最新文章

  1. 关于Access数据库执行Update语句后,不报错,但影响行数总是返回0的问题
  2. android电视工程模式,智能电视如何打开ADB?进入工程模式方法
  3. python【蓝桥杯vip练习题库】BASIC-15字符串对比(水题)
  4. 你觉得你个性上最大的优点是什么?
  5. 中职高级计算机操作员,计算机操作员专业排行榜
  6. Java学习笔记之 IO包 字节流
  7. Staked 回应节点遭到 slash 惩罚:由技术性问题导致,将全额赔偿受影响客户
  8. java里oop思想_(一)OOP思想详解
  9. android 整合最新X5WebView 以及离线安装教程
  10. GTD时间管理学习心得(2)
  11. masm32踩坑总结
  12. 如何写好一篇科技论文?
  13. VMware12版虚拟机怎么安装win7系统(win7镜像ios安装版)
  14. L298N模块的使用介绍
  15. 【Python】快速简单实现图像背景更换
  16. 技术专题 | 浅析细菌内毒素检测现状
  17. CTO和技术副总裁应该如何分工?谁才是技术领导者?
  18. Java方法 的学习
  19. kafka中彻底删除topics
  20. python什么意思g_在laymans术语中,Python字符串格式“g”实际上是什么意思?

热门文章

  1. java字体大小设置快捷键_【转】Eclipse,MyEclipse快捷键及字体设置
  2. Mysql高频面试题(后端大数据面试必备)
  3. 【高数】函数有原函数与函数可积的区别与联系
  4. Tomcat启动项目慢
  5. (三)ubuntu20.04搭建gitlab服务器
  6. 连续子数组数量-腾讯音乐娱乐集团2023校园招聘技术类岗位
  7. ubuntu安装VIM教程与命令详解
  8. Windows11系统外接屏幕不亮
  9. 代码实现任意维度矩阵求逆(C语言 用伴随矩阵实现)
  10. 怎么从H5广告页内复制微信号直接调起微信客户端关注公众号