[OpenCV] 基于聚类的视频关键帧提取

1.《用非监督式聚类进行视频镜头分割》

2.《一种基于视频聚类的关键帧提取方法》

右边为提取出来的关键帧

聚类的基本思想是,先把视频聚成n个类,这n个类内的视频帧是相似的,而类与类之间的视频帧是不相似的。第二步是从每个类内提取一个代表作为关键帧,另外,如果一个类的帧数太少,那么这个类不具有代表性,可以直接与相邻帧合并。

因为HSV空间相比起RGB空间对颜色特性有着更好的支持,所以第一步我们先把颜色映射到HSV空间上。

首先,把分布在0~255的RGB颜色直接映射到0~255的HSV颜色。接下来,我们对HSV颜色再进行一次分割,即把H分量等分为12块,S,V分量各等分为5块,再把原来范围在0 ~255的颜色映射到12X5X5的范围上。

完成映射后,接下来需要构建HSV的颜色空间。我们设图像的大小为为MXN。然后分别统计H,S,V分量中,值为i的占的百分比为多少。

计算两张图像的相似度,需要我们先分别计算三个颜色直方图的相似性,具体的计算方法是累加两张图像直方图相同索引处对应的最小值。

又因为人眼对H分量的敏感程度大于对S分量,而对S分量的敏感程度又大于对V分量,所以最终我们设H的权重为0.5,S为0.3,V为0.2。

接下来,开始具体的计算。

1.对于每个类,维护一个质心:

2.对于每一帧,计算它聚类质心的相似度(根据前面提到的相似度公式)

如果相似度小于某一阈值,那么把它归到一个新建的类中,否则加入之前的类中。

3.合并一部分过小的聚类。

4.计算每个聚类中熵最大的图像,将其作为关键帧,计算方法:

经验分享 程序员 微信小程序 职场和发展