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

flo*_*eft 6 ruby image image-processing node.js

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

以此GIF为例:

在此输入图像描述

-

这是第一帧:

在此输入图像描述

-

这是第28帧:

在此输入图像描述

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

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

jod*_*dag 6

可以实现的一种直接方式是估计每个图像的并选择具有最大熵的帧.

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

估计熵

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

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

H = E[-log(p(x))]
Run Code Online (Sandbox Code Playgroud)

H熵在哪里,E是预期值,p(x)是任何给定像素取值的概率x.

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

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

在此输入图像描述

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

在此输入图像描述

意见

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

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

在此输入图像描述

Ruby实现

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

从m.西蒙博格的评论

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

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


另外,如果检查磁盘上200x200噪声图像的大小,即使压缩后文件仍然是40,345字节,但未压缩数据只有40,000字节.信息理论告诉我们,没有压缩方案可以平均无损地压缩这些图像.


Art*_*r-1 2

我可以采取几种方法来解决这个问题。我的第一个想法(这可能不是最实用的解决方案,但理论上似乎很有趣!)是尝试无损压缩每个帧,理论上,具有最少可重复内容(因此也是最独特的内容)的帧将具有最大大小,这样您就可以比较每个压缩帧的大小(以字节/位为单位)。该解决方案的准确性可能很大程度上取决于传入的照片。

更现实/实用的解决方案可能是获取 GIF 中的主要颜色(在示例中为背景颜色),然后迭代每个像素并在每次当前像素的颜色与当前像素的颜色不匹配时增加一个计数器。背景的颜色。

我正在考虑一些更优化/基于示例的解决方案,如果您关心性能,我会稍后编辑我的回复以包含它们。