如何比较图像并确定哪些内容更多?

时间:2017-08-08 23:42:19

标签: node.js ruby image image-processing

目标:我想从动画GIF中抓取最佳帧并将其用作静态预览图像。我相信最好的框架是显示最多内容的框架 - 不一定是第一帧或最后一帧。

以此GIF为例:

enter image description here

-

这是第一帧:

enter image description here

-

这是第28帧:

enter image description here

很明显,第28帧代表了整个GIF。

我如何能够以编程方式确定一帧是否具有更多像素/内容?任何您可以指出我的想法,想法,包/模块或文章都将不胜感激。

3 个答案:

答案 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)

您的示例的熵与帧数的关系图。

enter image description here

框架21(第22帧)具有最高熵。

enter image description here

<强>观察

  • 此处计算的熵不等于ε的真熵 因为它假设每个像素是从同一分布中独立采样的。为了获得真正的熵,我们需要知道 我们将无法知道的图像的联合分布 理解生成图像的基础随机过程 (这将包括人类互动)。但是,我不认为真正的熵会非常有用,这个措施应该是 合理估计图像中的内容量。

  • 如果某些不那么有趣的帧,此方法将失败 包含比最多噪声(随机彩色像素)更多的噪声 有趣的帧,因为噪声导致高熵。例如, 下面的图像是纯粹的均匀噪声,因此具有最大熵(H = 8位),即不可能压缩。

enter image description here

Ruby实施

我不知道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://www.clarifai.com/

https://vize.ai

https://azure.microsoft.com/en-us/services/cognitive-services/computer-vision/

https://imagga.com