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

目标:我想从animationGIF抓取最好的框架,并将其用作静态预览图像。 我相信最好的框架是展示最多内容的框架 – 不一定是第一个或最后一个框架。

以这个GIF为例:

在这里输入图像描述

这是第一帧:

在这里输入图像描述

这是第28帧:

在这里输入图像描述

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

我怎样才能以编程方式确定一个帧是否有更多的像素/内容比另一个? 任何想法,想法,包/模块或文章,你可以指向我将不胜感激。

一种简单的方法是完成每幅图像的熵估计,并select最大熵的帧。

在信息论中,熵可以被认为是图像的“随机性”。 单色的图像是非常可预测的,分布越平坦,越随机。 这与Arthur-R描述的压缩方法高度相关,因为熵是可以无损压缩多less数据的下限

估计熵

估计熵的一种方法是使用直方图来逼近像素强度的概率质量函数。 要生成下面的图,我首先将图像转换为灰度,然后使用1的间距计算直方图(对于0到255的像素值)。 然后,对直方图进行归一化,使得二进制数之和为1.该归一化的直方图是像素概率质量函数的近似值。

使用这个概率质量函数,我们可以很容易地估计灰度图像的熵,由下面的等式描述

 H = E[-log(p(x))] 

其中H是熵, E是期望值,并且p(x)是任何给定像素取x的概率。

以编程方式H可以通过简单地计算直方图中每个值p(x) -p(x)*log(p(x)) ,然后将它们加在一起。

你的例子的熵与帧数的图。

在这里输入图像描述

与第21帧(第22帧)具有最高的熵。

在这里输入图像描述

意见

  • 这里计算的熵不等于图像的真实熵,因为它假设每个像素是从同一分布独立采样的。 为了得到真正的熵,我们需要知道图像的联合分布,如果不理解产生图像的潜在随机过程(其将包括人类交互),那么我们将无法知道图像的联合分布。 但是,我并不认为真正的熵值是非常有用的,这个度量值应该能够合理地估计图像中的内容。

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

在这里输入图像描述

Ruby实现

我不知道ruby,但它看起来像这个问题的答案之一是指一个计算图像熵的包。

从m。 西蒙·博格的评论

FWIW,使用Ruby的File.size()为第28帧图像返回1904字节,为第一帧图像返回946字节。 西蒙·博格

File.size()应该大致与熵成比例。


顺便说一句,如果你检查磁盘上的200×200噪声图像的大小,即使在压缩之后,你也会看到文件是40,345字节,而未压缩的数据只有40,000字节。 信息理论告诉我们,没有任何压缩scheme能平均无损地压缩这些图像。

有几种方法可以解决这个问题。 我的第一个想法(这可能不是最实际的解决scheme,但理论上似乎有趣!)将尝试无损地压缩每一帧,理论上,具有最less可重复内容(因此是最独特的内容)的框架将有最大的尺寸,所以你可以比较每个压缩帧的大小(字节/位)。 此解决scheme的准确性可能高度依赖于传入的照片。

一个更现实/实用的解决scheme可能是抓住GIF中的主色(例如,背景色),然后遍历每个像素,每当当前像素的颜色不匹配时就增加一个计数器背景的颜色。

我正在考虑一些更优化的/基于示例的解决scheme,如果性能是您关心的问题,我会编辑我的回复,以便稍后再添加。

我认为你可以select一个像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