2013-03-07 264 views
5

我正在查看将多个JPEG图像作为单个较大图像一起存储时,减少存储空间的问题。基本的直觉是,图像往往有一些相似之处(如在同一地点或在同一时间点采取的),我们可以利用这种相似性来节省空间吗?JPEG图像压缩

整个流程是:输入图像JPG - >每个图像转换成RGB图像平铺 - >重新组织相似RGB瓦片一起 - >再次变换到JPG格式。当然,在检索图像时,我们需要反向的过程。

使用Y分量的DC系数作为瓷砖重组的相似度量,对于10幅图像我获得了〜8%的空间节省。当我为100张图片做这件事时,节省下降到〜3%。

  • 如何在重新组织后得到储蓄 - 即JPEG编码过程的哪个部分利用了此图像块重组?

  • 相反Y分量的DC系数,在那里你能想到的,其他一些指标将通过JPEG编码来更好地利用


修订:

有一些其他除JPG以外的图像格式可以利用这种相似性聚合多个图像时更好吗?比如像PNG?

回答

5

你很可能使用JFIF进行编码。

我不确定您希望这种方法如何工作。如果我理解正确,那么您将图像分解为多个图像,将它们聚合成一个超大图像,并将“相似”的图块彼此靠近排列。AFAIK,JPEG实现在图像中为每个单独的8x8瓦片执行单独的DCT,称为宏块。换句话说,JPEG不能利用相邻宏块之间的一致性(这似乎是压缩技术的基本假设)。

如果你自己的图块大于宏块,除了图像头部空间的节省之外,你不会看到任何改进。例如:将10个JPG图像头替换为1会节省90%的空间,但只能在头部。当您查看整个文件时,标题只是整个文件的一小部分,因此节省的空间很小。当将100个图像标题替换为1时,您节省了99%,但是仅在标题上再次提供。在这两种情况下,所有的宏块仍然被编码和存储,完全像以前一样。

+0

谢谢,这很有道理!我使用libjpeg来进行编码和解码。由于JPEG在8x8宏块内进行DCT,所以瓷砖之间的相似性(大于宏块)可能没有多大帮助。但是,我认为相邻宏块的DCT系数是相对编码的,这可能在一定程度上通过这种块重组而得到改善。我修改了我的问题 - 请看看。 – user655617 2013-03-08 00:14:09

+0

很高兴我能帮助澄清事情。是的,libjpeg是IJG参考JPEG标准的JFIF实现。我不记得使用delta编码的DCT系数(在相邻的宏块之间)。 AFAIR中,每个宏块都变成一个单一的8x8系数矩阵,然后对其进行抽取(分割以减少存储它们所需的位数 - 这是有损压缩中的“损失”来自哪里),并在zig中读出时尚。这种排序产生长时间运行的0,它们通过运行长度编码被有效地压缩(而不是存储17个零,我们存储17,0)。 – 2013-03-08 06:14:10

2

有两个领域,你会看到好处:

首先,当你把相似的区域相邻(特别是在图像的边缘匹配完美,没有间断 - 尽管这将是非常罕见),jpeg算法的DCT(频率空间)部分通过逐渐逼近大区域(不确定最大大小是多少)来工作,然后查看大区域近似和多个较小区域之间的误差,并制作更多的本地化修正。

我怀疑这种影响很小,除非你的图像是相似,或者很小(因此它们的边缘与它们的面积成比例)。

其次,JPEG压缩的Huffman coding部分将看到一个好处,因为相同的比特模式将出现在多个子图像,并用相同的(短)被压缩令牌)。

这个方面将不取决于您压缩图像的方式 - 只要它们在相同的图像。

+0

感谢您的回应!我不确定你的第一部分。但是,我认为霍夫曼编码可以利用这一点_some_ extent_if_我将最终输出分割成多个图像,每个图像具有相似的图块。但是,我认为这不能解释我获得的空间节省。我已经修改了我的问题 - 请看看。 – user655617 2013-03-08 00:09:47