以此GIF为例:
–
这是第一帧:
–
这是第28帧:
很明显,第28帧代表了整个GIF.
解决方法
在信息论中,熵可以被认为是图像的“随机性”.单色图像非常可预测,分布越平坦,越随机.这与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.
您的示例的熵与帧数的关系图.
@L_404_4@
具有最高熵的帧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字节.信息理论告诉我们,没有压缩方案可以平均无损地压缩这些图像.