目标:我想从动画GIF中抓取最佳帧并将其用作静态预览图像.我相信最好的框架是显示最多内容的框架 – 不一定是第一帧或最后一帧.
@H_502_2@以此GIF为例:
@H_502_2@
@H_502_2@ –
@H_502_2@这是第一帧:
@H_502_2@
@H_502_2@ –
@H_502_2@这是第28帧:
@H_502_2@
@H_502_2@很明显,第28帧代表了整个GIF.
@H_502_2@我怎么能以编程方式确定一帧是否有更多像素/内容?您可以指出我的任何想法,想法,包/模块或文章将不胜感激.
解决方法
可以实现的一种直接方式是估计每个图像的
entropy并选择具有最大熵的帧.
@H_502_2@在信息论中,熵可以被认为是图像的“随机性”.单色图像非常可预测,分布越平坦,越随机.这与Arthur-R描述的压缩方法高度相关,因为熵是可以无损压缩多少数据的下限.
@H_502_2@估计熵
@H_502_2@估计熵的一种方法是使用直方图来近似像素强度的概率质量函数.为了生成下面的图,我首先将图像转换为灰度,然后使用bin间距1计算直方图(对于0到255之间的像素值).然后,对直方图进行归一化,使得区间总和为1.该归一化直方图是像素概率质量函数的近似值.
@H_502_2@使用该概率质量函数,我们可以容易地估计灰度图像的熵,其由以下等式描述
因为它假设每个像素是从同一分布中独立采样的.为了获得真正的熵,我们需要知道
我们将无法知道的图像的联合分布
理解生成图像的基础随机过程
(这将包括人类互动).但是,我不认为真正的熵会非常有用,这个措施应该是
合理估计图像中的内容.
>如果有一些不那么有趣的框架,这种方法将失败
包含比最多噪声(随机彩色像素)更多的噪声
有趣的帧,因为噪声导致高熵.例如,
跟随图像是纯粹的均匀噪声,因此具有最大熵(H = 8比特),即不可能进行压缩. @H_502_2@ @H_502_2@Ruby实现 @H_502_2@我不知道ruby,但它看起来像this question的答案之一是指用于计算图像熵的包. @H_502_2@从m.西蒙博格的评论
H = E[-log(p(x))]@H_502_2@其中H是熵,E是期望值,p(x)是任何给定像素取值x的概率. @H_502_2@可以通过简单地计算直方图中的每个值p(x)的-p(x)* log(p(x))然后将它们加在一起来估计编程H. @H_502_2@您的示例的熵与帧数的关系图. @H_502_2@ @H_502_2@具有最高熵的帧21(第22帧). @H_502_2@ @H_502_2@意见 @H_502_2@>此处计算的熵不等于熵的真熵
因为它假设每个像素是从同一分布中独立采样的.为了获得真正的熵,我们需要知道
我们将无法知道的图像的联合分布
理解生成图像的基础随机过程
(这将包括人类互动).但是,我不认为真正的熵会非常有用,这个措施应该是
合理估计图像中的内容.
>如果有一些不那么有趣的框架,这种方法将失败
包含比最多噪声(随机彩色像素)更多的噪声
有趣的帧,因为噪声导致高熵.例如,
跟随图像是纯粹的均匀噪声,因此具有最大熵(H = 8比特),即不可能进行压缩. @H_502_2@ @H_502_2@Ruby实现 @H_502_2@我不知道ruby,但它看起来像this question的答案之一是指用于计算图像熵的包. @H_502_2@从m.西蒙博格的评论
@H_502_2@FWIW,using Ruby’s@H_502_2@File.size()应该与熵大致成比例. @H_502_2@另外,如果检查磁盘上200×200噪声图像的大小,即使压缩后文件仍然是40,345字节,但未压缩数据只有40,000字节.信息理论告诉我们,没有压缩方案可以平均无损地压缩这些图像.File.size()
returns 1904 bytes for the 28th frame
image and 946 bytes for the first frame image – m. simon borg