目标:我想从动画GIF中抓取最佳帧并将其用作静态预览图像。我相信最好的框架是显示最多内容的框架 - 不一定是第一帧或最后一帧。
以此GIF为例:
-
这是第一帧:
-
这是第28帧:
很明显,第28帧代表了整个GIF。
我如何能够以编程方式确定一帧是否具有更多像素/内容?任何您可以指出我的想法,想法,包/模块或文章都将不胜感激。
答案 0 :(得分:6)
这可以实现的一种简单方法是估计每个图像的entropy并选择具有最大熵的帧。
在信息论中,熵可以被认为是图像的“随机性”。单色图像非常可预测,分布越平坦,越随机。这与Arthur-R描述的压缩方法高度相关,因为熵是无损压缩数据的下限。
估计熵的一种方法是使用直方图来近似像素强度的概率质量函数。为了生成下面的图,我首先将图像转换为灰度,然后使用bin间距1计算直方图(对于0到255之间的像素值)。然后,对直方图进行归一化,使得二进制数总和为1.该归一化直方图是像素概率质量函数的近似值。
使用这个概率质量函数,我们可以很容易地估计灰度图像的熵,由下面的等式描述
H = E[-log(p(x))]
H
是熵,E
是预期值,p(x)
是任何给定像素获取值x
的概率。
可以通过简单地为直方图中的每个值H
计算-p(x)*log(p(x))
,然后将它们加在一起来估算p(x)
。
您的示例的熵与帧数的关系图。
框架21(第22帧)具有最高熵。
<强>观察强>
此处计算的熵不等于ε的真熵 因为它假设每个像素是从同一分布中独立采样的。为了获得真正的熵,我们需要知道 我们将无法知道的图像的联合分布 理解生成图像的基础随机过程 (这将包括人类互动)。但是,我不认为真正的熵会非常有用,这个措施应该是 合理估计图像中的内容量。
如果某些不那么有趣的帧,此方法将失败 包含比最多噪声(随机彩色像素)更多的噪声 有趣的帧,因为噪声导致高熵。例如, 下面的图像是纯粹的均匀噪声,因此具有最大熵(H = 8位),即不可能压缩。
我不知道ruby,但看起来像this question的答案之一是指用于计算图像熵的包。
从m。西蒙博格的评论
FWIW,使用Ruby的
File.size()
为第28帧返回1904个字节 图像和第一帧图像的946字节 - m。西蒙博格
File.size()
应与熵大致成比例。
另外,如果检查磁盘上200x200噪声图像的大小,即使压缩后文件仍然是40,345字节,但未压缩数据只有40,000字节。信息理论告诉我们,压缩方案无法平均无损地压缩这些图像。
答案 1 :(得分:1)
我可以通过几种方式解决这个问题。我的第一个想法(这可能不是最实用的解决方案,但似乎理论上有趣!)将尝试无损压缩每个帧,理论上,具有最少可重复内容的帧(因此最独特的内容)将具有最大的大小,因此您可以比较每个压缩帧的大小(以字节/位为单位)。此解决方案的准确性可能高度依赖于传入的照片。
更现实/实用的解决方案可能是抓住GIF中的主要颜色(例如,在示例中,背景颜色),然后迭代每个像素并在每次当前像素的颜色没有时递增计数器&# 39; t匹配背景的颜色。
我正在考虑一些更优化/基于样本的解决方案,如果性能问题,我会稍后编辑我的回复以包含它们。
答案 2 :(得分:0)
我认为你可以选择一个像Restful Web Service这样的API来做到这一点,因为没有它这么难。 例如,这些是一些着名的API:
https://cloud.google.com/vision/
https://azure.microsoft.com/en-us/services/cognitive-services/computer-vision/