JPEG图像压缩

5
我正在研究将多个JPEG图像一起存储为单个更大的图像时如何减少存储空间的问题。基本想法是图像往往具有某些相似性(例如在同一位置或时间点拍摄的图像),我们能否利用这种相似性来节省空间?
总体流程为:输入JPG图像->将每个图像转换为RGB图像块->重新组织相似的RGB图像块->再次转换为JPG格式。当检索图像时,我们需要反转这个过程。
使用Y分量的直流系数作为图像块重新组织的相似性度量,我为10个图像获得了约8%的空间节省。当我对100个图像执行此操作时,节省的空间降低到约3%。
1. 在图像块重新组织后如何实现节省 - 即JPEG编码过程的哪个部分利用了这个图像块重新组织? 2. 除了Y分量的直流系数之外,您能想到其他一些指标可以更好地被JPEG编码利用吗?
修改后:
除了JPG之外,是否有其他图像格式可以更好地利用聚合多个图像时的相似性?比如PNG?
2个回答

5
您很可能正在使用JFIF进行编码。
我不确定您希望这种方法如何工作。如果我理解正确,您将图像分割成瓷砖,将它们聚合成一个超级图像,并将“相似”的瓷砖排列在彼此靠近的位置。
据我所知,JPEG实现对图像中每个单独的8x8瓷砖(称为“宏块”)执行单独的DCT。换句话说,JPEG不能利用相邻宏块之间的一致性(这似乎是您的压缩技术的基本假设)。
如果您自己的瓷砖比宏块更大,则除了图像头部空间的节省外,您将看不到任何改进。
例如:用1个替换10个JPG图像头文件将使您节省90%的空间,但仅适用于标题。当您查看整个文件时,标题只是整个文件的一小部分,因此您的空间节省非常少。将100个图像头文件替换为1个时,您可以节省99%,但再次仅适用于标题。在这两种情况下,所有宏块仍然按照以前的方式进行编码和存储。

谢谢,这很有道理!我使用libjpeg进行编码和解码。由于JPEG在8x8宏块内执行DCT,因此大于宏块的瓷砖之间的相似性可能并没有太大帮助。但是,我认为相邻宏块的DCT系数是相对编码的,通过这种瓷砖重新组织可能在一定程度上改善这种情况。我已经修改了我的问题-请看一下。 - user655617
很高兴我能帮助澄清事情。是的,libjpeg是IJG对JPEG标准的参考JFIF实现。我不记得DCT系数使用增量编码(在相邻的宏块之间)。据我所知,每个宏块都成为一个8x8系数矩阵,然后被抽取(除以减少存储所需位数的数量 - 这就是有损压缩中“损失”的来源),并以蛇形方式读出。这种排序产生了长时间的0运行,通过运行长度编码有效地压缩(而不是存储17个零,我们存储17,0)。 - Rahul Banerjee

2
有两个方面可以看到好处:
首先,当您将相似区域放在一起时(特别是如果图像的边缘完美地相互匹配而没有不连续性——虽然这种情况非常罕见),jpeg算法的DCT(频率空间)部分通过逐步逼近大区域(不确定最大尺寸是多少),然后查看大区域和多个较小区域之间的误差,并生成更局部化的校正来工作。
我怀疑这种影响很小,除非您的图像非常相似或者非常小(因此它们的边缘与其面积成比例很长)。
其次,JPEG压缩的霍夫曼编码部分将获得好处,因为相同的位模式将出现在多个子图像中,并且使用相同的(短)标记进行压缩。
这个方面不会取决于您压缩图像的排列方式——只要它们在同一张图片中。

谢谢您的回复!我不确定您的第一部分。但是,如果我将最终输出拆分为多个图像,并且每个图像具有相似的瓷砖,则我认为哈夫曼编码可以在某种程度上利用这一点。但是,我不认为这解释了我获得的空间节省。我已经重新表述了我的问题-请看一下。 - user655617

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接