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

前端之家收集整理的这篇文章主要介绍了node.js – 如何比较图像并确定哪些内容更多?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
目标:我想从动画GIF中抓取最佳帧并将其用作静态预览图像.我相信最好的框架是显示最多内容的框架 – 不一定是第一帧或最后一帧.

以此GIF为例:

这是第一帧:

这是第28帧:

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

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

解决方法

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

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

估计熵

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

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

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

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

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

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

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

意见

>此处计算的熵不等于熵的真熵
因为它假设每个像素是从同一分布中独立采样的.为了获得真正的熵,我们需要知道
我们将无法知道的图像的联合分布
理解生成图像的基础随机过程
(这将包括人类互动).但是,我不认为真正的熵会非常有用,这个措施应该是
合理估计图像中的内容.
>如果有一些不那么有趣的框架,这种方法将失败
包含比最多噪声(随机彩色像素)更多的噪声
有趣的帧,因为噪声导致高熵.例如,
跟随图像是纯粹的均匀噪声,因此具有最大熵(H = 8比特),即不可能进行压缩.

Ruby实现

我不知道ruby,但它看起来像this question的答案之一是指用于计算图像熵的包.

从m.西蒙博格的评论

FWIW,using Ruby’s File.size() returns 1904 bytes for the 28th frame
image and 946 bytes for the first frame image – m. simon borg

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

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

猜你在找的Node.js相关文章