自己用C++实现BaseLine Jpeg解码(要点总结)

        忙活这几天,终于自己用C++完整实现了BaseLine的Jpeg解码算法,中间阅读了一些论文和网上的帖子,发现其中有很多没有说清楚的地方,自己在实现的过程中也受到网上资料的很多误导,现在自己完整地把Jpeg解码算法实现了一遍,把有疑惑的地方都解决了,遂将自己对于Jpeg解码算法的理解要点记录在这篇帖子中,本人初学图形图像的相关内容,本帖内容有谬误的地方敬请各位大贤不吝指教。


解码步骤和要点:

1.获取图像信息

        首先在程序中以二进制方式读入Jpeg图像文件,根据Jpeg文件的标准格式来分析文件中的各个字段,得出图像的一些重要信息,例如图像的宽度和高度,图像的色彩分量个数,每个分量的采样因子,每个色彩分量使用的huffman表和反量化表的编号,量化表精度等等,这些参数决定了后期怎么对图像进行解码,同时还要在分析文件字段的同时将huffman表字段和量化表字段的数据记录下来,并且根据还原huffman表的方法将huffman表恢复出来,将反量化表也记录下来,为后期解码做准备,至于Jpeg文件中各个字段的定义以及还原huffman表的方法,网上有很多帖子都有讲解(这个帖子讲得不错:http://www.cnblogs.com/leaven/archive/2010/04/06/1705846.html),这里就不赘述重复内容了。

这里简单说一下各个参数的作用,图像的宽度和高度就不用说了,它描述了解压后图像矩阵的宽度和高度,色彩分量个数描述了图像是黑白的还是彩色的,这个参数可以是1,3,或4,1表示只有一个亮度的分量,当然图像就是黑白灰度图像,3表示图像使用的是YCbCr的色彩空间,当然就是彩色图像,4表示另外的CMYK的图像格式,这个没有深入研究过是什么东东,先放一边,一般的Jpeg图像都是使用YCbCr色彩空间的彩色图像,下文就以这样的最具代表性的图像为例进行论述。颜色分量的采样因子决定了亮度信号和两个色差信号的采样频率,一般情况下普通的Jpegz真彩图像使用的是4:1:1的采样因子,意思就是一个图像中的MCU由4个8*8的数据块构成,每4个数据块合成一个mcu, 就像下面的图表示的一样假设图像是37pix * 45pix的(懒得再网上找示意图了,自己手画一个):

图里面的红色框起来的部分就是真实的图像涵盖的数据范围,红色方框以外的数据是重复最后一行或者是最后一列数据的出来的,实际上是冗余的数据,但是Jpeg图像的压缩数据是以mcu为最小单位的,所以冗余信息也保存在了图像的压缩数据里面,上面的图是4:1:1的图像格式的,还有其他不同的采样比例的就不多说了,情况是类似的,只不过每个mcu里面包含的数据块的个数不同而已,下面针对4:1:1的这种经常出现的格式进行说明:

    可以看到这种图像的格式中,每个mcu都包含4个8*8的数据块,每个数据块是Jpeg压缩的最小数据单元,对应了相应位置某一个颜色分量的一个解压后的8*8的位图数据块,对于4:1:1的格式而言,简单的说,就是图里面的0,1,2,3这4个数据块的亮度分量Y的数值单独进行

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值