我正在处理大量地球卫星图像档案,每张图像都是在同一地区每隔 15 分钟拍摄一次,因此彼此非常相似。两个连续的图像如下所示:
视频算法在压缩多张相似图像方面表现非常出色。但是,这些图像对于视频来说太大了(10848x10848),使用视频编码器会删除图像的元数据,因此即使我使用视频编码器来处理如此大的图像,提取它们并恢复元数据也会很麻烦。
为了进行一些测试,我将一天的 96 张图片缩小到 1080x1080 像素,总计 40.1MB,并尝试了不同的压缩方法,结果如下:
- 压缩包:39.8 MB
- rar:39.8 MB
- 7z:39.6 MB
- tar.bz2:39.7 MB
- zpaq v7.14:38.3 MB
- fp8 v2:32.5 MB
- paq8pxd v45:30.9 兆
最后三种方法应该可以更好地利用上下文,并且确实比传统压缩效果更好,但与可以将其压缩到 15 MB 甚至更少同时保持图像质量的 mp4 视频相比,压缩率仍然很差。
然而,这些压缩实用程序所使用的算法似乎都没有像视频压缩那样利用图像的相似性。事实上,使用包装JPG,对每个图像分别进行压缩,整个集合大小降至 32.9 MB,相当接近 fp8 和 paq8pxd,但却没有利用图像之间的相似性(因为每个图像都是单独压缩的)。
在另一个实验中,我在 Matlab 中计算了上面两幅图像的差异,结果如下:
使用 fp8 压缩两个原始图像(总共 219.5 + 217.0 = 436.5 kB)可将其压缩至 350.0 kB(80%),但压缩其中一个图像和差异图像(作为相同质量并使用 122.5 kB 的 jpg)时,文件大小为 270.8 kB(62%),因此(如 mp4 和 packJPG 比较所示),fp8 似乎没有充分利用相似性。即使使用 rar 压缩,一个图像加上差异图像在原始图像上的表现也比 fp8 更好。在这种情况下,rar 将其压缩至 333.6 kB(76%)。
我想这个问题一定有一个很好的压缩解决方案,因为我可以想象到很多应用。除了我的情况,我想很多专业摄影师由于连续拍摄或延时拍摄等原因会拍摄很多类似的照片。所有这些情况都会受益于这种压缩。
此外,我不需要无损压缩,至少对于图像数据不需要(必须保留元数据)。
所以... 是否存在一种压缩方法可以利用被压缩图像之间的相似性?
答案1
我不知道有哪个软件可以做到这一点,但有一些关于这个主题的研究。例如,请参阅文章压缩相似图像集作者:Samy Ait-Aoudia、Abdelhalim Gabis、Amina Naimi 和使用混合压缩模型压缩相似图像集作者:Jiann-Der Lee、Shu-Yen Wan、Chemg-Min Ma、Rui-Feng Wu。
在更实际的层面上,您可以扩展减法技术,例如通过编写使用图像魔术师计算连续图像之间的差异,将结果保存为 jpeg(或压缩的 png,如果您希望它无损)。您将获得一个基本图像和一组应该小得多的压缩“增量”图像。要使用 ImageMagick 计算差异:
convert image2.png image1.png -compose MinusSrc -composite -depth 24 -define png:compression-filter=2 -define png:compression-level=9 -define png:compression-strategy=1 difference-2-1.png
通过添加重新计算:
convert image1.png difference-2-1.png -compose Plus -composite image2-reconstructed.png
(您可以使用 jpg 执行相同的操作并节省大量空间)。
答案2
希望其他人也能压缩类似的图像/PNG,并通过搜索找到这里:
我不确定我所研究的用例是否适用于 ops 照片,因为链接不再有效。我的用例类似但不相同 - 我希望压缩非常相似的计算机程序屏幕截图,因此可能比仅压缩 PNG 文件更容易压缩。我通过搜索找不到解决方案,所以我想出了自己的解决方案,最终得到了惊人的 4.4% 压缩率(而不是通过简单使用简单压缩 PNG 而获得的 96%):
我的数据集是 300 个 PNG 文件,分辨率为 1920x1080,原始大小为 431.8mb,使用我能找到的 bz2、7z 和类似工具的最佳设置压缩后大小仅为 417.4mb。我的理解是,源文件在 PNG 级别上的压缩效果并不理想,因为各种 PNG 最小化工具设法将原始大小从每个文件的 1.4mb 减少到 900kb。
我的想法是,问题在于压缩工具无法确定数据已被压缩,原始数据的微小变化可能会导致压缩文件有很大差异。因此,我使用ffmpeg
设置对文件进行了解压缩,据我所知,这不会导致任何数据丢失:
for FILE in screenshot-2024*; do ffmpeg -loglevel error -i $FILE -vframes 1 -compression_algo raw -pix_fmt rgb24 $FILE.tiff; done
这使得单个文件大小从 1.4mb 增加到 6mb,但使用 7z/LZMA2 压缩后文件大小极低,只有 19.175.127 字节,这意味着压缩后大小仅为原始大小的 4.4%。
可以使用以下命令将.tiff
文件重新转换为:.png
for FILE in screenshot-2024*.tiff; do ffmpeg -loglevel error -i $FILE $FILE.png; done
重复的文件结尾当然可以被纠正,但这样在测试时它就不会覆盖原始源。
我们用于压缩的设置如下;该Solid block size
设置似乎对输出大小具有最大的影响:
- 压缩级别:9/Ultra
- 压缩方法:LZMA2
- 词典大小:512 MB
- 字长:256
- 实体块大小:512 MB
- 压缩内存使用量:12 GB
由于我们的目标是长期存储,因此额外的箍和压缩时间并不是一个重要因素,当然,您的里程可能会有所不同。