【问题标题】:Lossless compression of a sequence of similar grayscale images一系列相似灰度图像的无损压缩
【发布时间】:2021-02-06 07:48:20
【问题描述】:

我希望获得一系列相似灰度图像的最佳压缩比。我注意到我需要一个绝对无损的解决方案(这意味着我应该能够使用哈希算法对其进行检查)。

我尝试了什么

我有将图像转换为视频的想法,因为图像之间存在年表。编码算法将使用并非所有场景在 2 张图片之间发生变化的事实进行压缩。所以我尝试使用 ffmpeg,但由于 sRGB -> YUV 颜色空间压缩,我遇到了几个问题。我不明白所有的事情,但这似乎是一场噩梦。

使用的代码示例:

ffmpeg -i %04d.png -c:v libx265 -crf 0 video.mp4 #To convert into video
ffmpeg -i video.mp4 %04d.png #To recover images

我的第二个想法是使用 imagemagik 手动完成。所以我以第一张图片为参考,并创建了一个新的图像,它是 image1 和 image2 之间的差异。然后我尝试使用图像 1 添加差异图像(尝试恢复图像 2)但它没有工作。注意到重新创建的图片的大小,很明显图像不一样。我认为在此过程中存在不必要的压缩。

使用的代码示例:

composite -compose difference 0001.png 0002.png diff.png #To create the diff image
composite -compose difference 0001.png diff.png recover.png #To recover image 2

你对我的问题有任何想法吗? 为什么我无法使用 iamgemagik 进行完美恢复?

谢谢 ;)

这里有 20 张样本图片:https://cloud.damien.gdn/d/f1a7954a557441989432/

【问题讨论】:

  • 将如何使用输出 - 编辑、播放(在哪里)?
  • 输出将被摄影测量算法使用。我们的想法是减少 1000 多张图像的大小以进行存储。
  • 也许您可以提供 3-4 张有代表性的图片进行实验。您确定要 100% 无损压缩,因为视频似乎不太可能吗?或许您可以澄清一下您想要实现的目标?
  • 例如你要输入3? 12? 7000?灰度PNG图像,所有相同的尺寸?并得到一个 64 位数字? 12张PNG图片? 12 个尽可能小的二进制文件,您仍然可以查看?最小的单个文件,可以让您完美地按位重新创建所有图像?
  • 您可以使用 RGB 视频吗?然后使用libx264rgb编码器。

标签: encoding ffmpeg compression imagemagick lossless-compression


【解决方案1】:

我对您的数据集尝试了一些想法,并总结了我在下面发现的内容。我的计算和百分比假设 578kB 是具有代表性的图像大小。


方法 1 - 粉碎 - 69%

我刚刚在您的一张图片上运行了pngcrush,如下所示:

pngcrush -bruteforce input.png crushed.png

输出大小为 400kB,因此您的图像现在只占用磁盘上原始空间的 69%。


方法 2 - 旋转粉碎 - 34%

我将您的图像旋转了 90 度并粉碎了结果:

magick input.png -rotate 90 result.png
pngcrush -bruteforce result.png crushed.png

旋转后的破碎图像占用磁盘上原始空间的 34%。


方法 3 - 旋转和差异 - 24%

我使用 ImageMagick 旋转了您的图像,然后区分了该系列中的两个相邻图像并保存了结果。然后我“png粉碎”了导致 142kB 或原始空间的 24% 的空间。


方法 4 - 结合到 RGB - 28%

我将您的三个单通道图像组合成一个 3 通道 RGB 图像并 pngcrushed 结果:

magick 000[123].png -combine result.png
pngcrush -bruteforce result.png crushed.png

这导致一个 490kB 的文件包含 3 张图片,即每张图片 163kB 或原始大小的 28%。


如果您能够无损地进行,我怀疑带有“运动”估计/检测的视频会产生最佳结果。

【讨论】:

    【解决方案2】:

    您可能会从用于无损动画压缩的MNG 中获得一些好处。您可以使用libmng 来试用。

    【讨论】:

    • Grayscale != YUV 的 Luma..U 和 V 的一些能量被计入最终的 luma 输出。
    • @Gyan 我能找到的所有 RGB 到 YUV 转换矩阵在乘以 [1 1 1] 时正好给出 [1 0 0]。所以不行。对于灰度图像,Y = 灰度,U = 0,V = 0。
    • 这不是关于 RGB YUV 转换的。给定一个具有 luma + 色度的栅格,通过 swscale 转换为 gray 像素格式将考虑输入的色度值。比较ffmpeg -i input -vf extractplanes=y,showinfo -vframes 1 -f null -ffmpeg -i input -vf format=gray,showinfo -vframes 1 -f null -的校验和结果
    • @Gyan 问题是关于压缩灰度数据。要使用 MPEG,您需要将灰度转换为 YUV。 OP 没有 具有亮度 + 色度的栅格。 OP 有灰度图像。
    • 我们不知道灰度是指 OP 是指编码为灰度的 PNG,还是编码为 R = G = B 的 RGB 的 PNG。
    猜你喜欢
    • 2019-03-08
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    • 2012-06-28
    • 2015-02-24
    相关资源
    最近更新 更多