如何比较图像,并确定哪些内容更多?
目标:我想从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://azure.microsoft.com/en-us/services/cognitive-services/computer-vision/