更新日期:2021/6/26
在《计算机视觉》前两次的理论课上,老师带我们了解了本课程,并讲授了一些基本的数字图像处理技术,包括灰度变换、直方图处理、图像滤波等。
本次实验给出两段视频,要求检测视频的镜头,即找到视频中发生镜头切换的地方(详细实验内容及要求请见下文)。
老师推荐的方法是使用直方图来做(如果没有什么思路的话),但是经实验并未达到满意的效果。经过思考,实验中采用了取随机样本的方法来实现镜头检测,并进行了多项改进,最终的算法识别性能有较大提升。
提示:博主正在学习《计算机视觉》(本科)课程,此博文原为本人实验课程技术报告,经整理后发布,欢迎大家相互交流学习。本人才疏学浅,如果有不到位的地方,欢迎大家提出意见和建议。
文章为博主原创,转载请附原文出处。以下是本文正文内容。
利用颜色直方图检测电影片段007.mp4
, Godfather.mp4
的镜头。
输入为视频文件名;输出为不同镜头的首尾帧;镜头按序号命名:001-1.jpg
,001-2.jpg
,002-1.jpg
,002-2.jpg
,…
,每一个镜头输出两个图像,对应与该镜头的首帧和尾帧(分别用-1,-2后缀表示)。
视频文件:
链接:https://pan.baidu.com/s/1yS97AtPji3j9vJ8lKfm9Wg
提取码:j1k0
实验中,老师推荐使用直方图来做(如果没有什么思路的话),同一镜头两幅图像的直方图相似度应该较高,比较相邻两幅图像的直方图,如果差异较小则很可能是同一镜头,反之则很可能发生了切镜。但通过实验表明,基于直方图的镜头检测极易受爆炸、火花、物体的快速运动等因素的干扰,导致较高的错检率。同一镜头下的爆炸、火花、物体的快速运动等因素会使直方图的整体形状产生巨大变化。
如图1所示的扫车片段,两个帧图像属于同一镜头,但是直方图整体发生较大变化。
综上所述,使用直方图进行镜头检测效果并不好。因此,实验中设计了另一种方法——“随机样本法”来进行镜头检测。
大致做法为:随机在两帧图像中取足够数量个样本点进行灰度值比较,判断是否为同一镜头。
在该思路的基础上,又进行了多项改进创新。最终算法的检测效果有较大提升:在"Godfather.mp4"
视频上,算法的正确识别率达到100%,无一漏检和错检;在"007.mp4"
视频上,算法在保证低漏检率的基础上,有效地降低了在爆炸、火花、物体的快速运动等因素影响下的错检率。
相比基于直方图的检测算法,该算法有更快的速度和更优的检测效果。
该文章先介绍算法的大致思路,再介绍实验中在该思路的基础上所作的改进和创新,然后给出算法的完整流程,接着对实验结果进行分析,最后展示检测出的一部分分镜头。
镜头的切换会导致帧图像整体的变化;而同一镜头下的两帧图像仅有部分区域会发生改变,而大部分区域变化不大。基于此思路,实验中设计了“随机样本法”来进行镜头检测。
大致思路如下:① 取随机样本。在当前帧图像中随机取 n n n个样本点,在与之比较的帧图像中也取对应的 n n n个样本点(实验中 n n n = 2000);② 计算相似度。对两帧图像中取到的样本点一一对应进行灰度值比较,计算相似度指标;③ 阈值判断是否为镜头切换。设一阈值,如果第②步计算出的相似度较低,则判定为镜头切换;否则认为是同一镜头。
基于以上思路初步实现的算法有一定的效果,但还具有较高漏检率和错检率,对视频中爆炸、火花、物体的快速运动等片段的检测效果仍然很差。实验中对初步算法进行了多项改进,取得了良好的效果。
以下列出主要的改进和创新,然后分别对每项进行详细介绍。
① 高斯模糊预处理(3.1)
② 删去变化最大的一部分样本(3.2)
③ 与前面多帧进行比较(3.3)
④ “向后看”去除抖动(3.4)
通过高斯模糊去除帧图像的噪声和细节,使样本点对应进行比较时有更好的稳定性。实验中使用7×7的滤波核对帧图像进行高斯模糊处理。
同一镜头下的两幅帧图像会由于物体运动、火花等因素,导致部分区域的灰度值变化较大,而大部分区域保持不变或变化微小,灰度值变化较小。
如图2所示,在汽车冲出墙壁的片段中,汽车的出现、墙壁的破碎会使该区域像素值的变化较大,但其它区域基本保持不变。
在计算同一镜头两幅帧图像的相似度时,灰度值变化较大的部分区域会导致最终计算得到的相似度较低。因此,在计算样本相似度前,去除变化最大的一部分样本,仅对剩余的样本点进行比较并计算相似度。
此做法能使同一镜头两幅图像计算得出的相似度更高,而对于不同镜头下的两幅帧图像,由于其整体画面都有所改变的特点,对于大部分样本点,灰度值变化都较为明显,因此,即使去除了变化最大的一部分样本点,仍然能较好地保持其低相似度。
综上所述,该做法能拉大同一镜头下两幅帧图像和不同镜头下两幅帧图像计算得出的相似度差距,提高检测准确率。实验中,先对两幅帧图像中取到的两个样本值向量进行相减取绝对值,得到样本值变化向量,然后对样本值变化向量从小到大排序,最后对排序后的样本值变化向量取前1/2进行相似度计算。
同一镜头相邻帧两幅图像可能会由于闪光、火花、物体遮挡等因素,导致两个图像计算得到的相似度较低。这些情况可能在极短的时间(一帧或两帧内)出现,而又很快就消失。如图3所示的机关枪片段,火光出现的时间只有1-2帧,但使整体画面抖动较大,而火光出现前后的两帧图像仍然较为相似。因此,同一镜头下一副帧图像可能与前面相邻图像的相似度不高,而却与更前面的帧图像相似度较高。基于此思路,通过将当前帧图像与过去的多个帧图像进行比较、计算相似度,如果与任一比较的过去图像的相似度较高,则判定为非镜头切换。实验中,将当前帧图像与过去最近的4个图像进行比较并计算相似度,如果任一比较结果相似度较高,则直接判定为非镜头切换。
通过与过去的帧图像进行比较(3.3),可以初步判定当前帧图像是否发生了镜头切换。而同样由于爆炸、火光、物体快速运动等因素的影响,使当前帧可能未发生镜头切换,却有较大的变化,导致“发生了镜头切换”的判定是错误的。
如图4所示的汽车飞驰片段,整体环境的快速运动和柱子、汽车等物体的遮挡使画面波动较大,相似度较低。
而“向后看”指的是与未来的帧图像进行比较,对“发生了镜头切换”的判定结果进行“怀疑”,如果与未来的帧图像相似度较低,则可能当前片段抖动较大,实际并没有发生镜头切换。此步骤也可看作是对3.3与过去多帧进行比较去除抖动的一个补充。
“向后看”去除抖动的原理如下:规定相邻镜头切换之间最少间隔的帧数量为 m m m,现假设当前帧确实为镜头切换,则可以推断,当前帧之后的 m m m个帧一定不会发生镜头切换,所以当前帧与之后的 m m m个帧应该有较高的相似度。如果之后 m m m个帧中的某个帧与当前帧相似度较低,则说明当前片段抖动较大,“发生镜头切换”的判断可能有误。
基于此原理,如果通过3.3初步判定了当前帧发生了镜头切换,则通过将当前帧与后面多个帧进行比较,再次进行判断。如果与后面某一帧的相似度较低,则说明此“发生了镜头切换”的判定结果可能是由于抖动造成的,将判定结果重新改为“未发生镜头切换”。实验中,如果通过与前面多帧进行比较的方法判定为发生了镜头切换,则通过此方法再次进行判定,将当前帧与其之后的3个帧分别进行比较,除此之外,还将之后的3个帧与其各自相邻的前一帧进行比较,这是考虑到之后的某个帧可能与其相邻的前一帧相似度更高,而与当前帧相似度不高。如果以上任一比较结果得到的相似度较低,则将判定结果重新改为未发生镜头切换。
先给出两帧图像比较算法的流程,再给出镜头检测算法的完整流程。
基本步骤为:首先,在当前帧图像中随机取足够数量个样本点,在与之比较的帧图像中也取对应位置的样本点;再将两个帧图像中取到的样本点一一对应作差、取绝对值,得到每个样本点的灰度变化;然后,去掉灰度值变化最大的一部分数据(原因见3.2);最后,将剩余的灰度值变化数据求和、再除以数据个数,得到平均每个样本点的灰度值变化量,作为相似度指标。该指标越大,两图像相似度越低;该指标越小,两图像相似度越高。
详细流程如下:
输入:图像 I a I_a Ia、 I b I_b Ib,随机样本数 n n n(实验中 n n n = 2000)
步骤1:随机生成 n n n个样本点坐标
步骤2:从图像 I a I_a Ia、 I b I_b Ib中分别取出 n n n个样本点坐标处的像素值,组成向量 V a V_a Va、 V b V_b Vb
步骤3:计算样本点像素值变化向量 V d i f f e r e n c e V_{difference} Vdifference
V d i f f e r e n c e = ∣ V a − V b ∣ V_{difference} = |V_a - V_b| Vdifference=∣Va−Vb∣, ∣ V ∣ |V| ∣V∣表示对向量 V V V中每个元素分别取绝对值
步骤4:对 V d i f f e r e n c e V_{difference} Vdifference中元素从小到大重新排序
步骤5:对排序后的 V d i f f e r e n c e V_{difference} Vdifference去掉后面(即最大的) d d d个元素
注:实验中,去掉 V d i f f e r e n c e V_{difference} Vdifference后面1/2的元素,即保留前一半的元素。
步骤6:对保留的元素进行相似度计算
公式为: r = s u m ( V d i f f e r e n c e ) / c o u n t ( V d i f f e r e n c e ) r = sum(V_{difference}) / count(V_{difference}) r=sum(Vdifference)/count(Vdifference)
其中 s u m ( V ) sum(V) sum(V)表示对向量 V V V全部元素求和, c o u n t ( V ) count(V) count(V)表示向量 V V V中元素个数。
注:计算出的相似度指标 r r r 为一标量,意义为:平均每个样本点的灰度值变化量。 r r r 越大,两图像相似度越低; r r r 越小,两图像相似度越高。实验中,判断发生切镜的阈值为 r > 2 r > 2 r>2。
输出:相似度指标 r r r
基本步骤为:首先,从视频中取出一帧,转换为灰度图像,并进行高斯滤波预处理,去除图像噪声和细节(3.1);然后,将当前帧与过去最近的多个帧进行比较(原因见3.3)、求相似度,判断是否发生镜头切换;如果上一步判定结果为发生镜头切换,则通过将当前帧与未来最近的多个帧进行比较、求相似度,再次进行判断(原因见3.4);最后,如果判定结果为发生镜头切换,则保存当前帧和上一镜头的最后一帧。
详细流程如下:
输入:视频文件
当没有到达视频文件结尾时,反复进行以下操作:
步骤1:从视频中取出一帧,并转换为灰度图像
步骤2:高斯模糊预处理当前帧
注:实验中采用7×7的高斯滤波核进行预处理。
步骤3:将当前帧与过去的 n n n个帧分别进行比较
情况①:如果与任一过去帧相似度都较低,则当前帧发生了镜头切换;
情况②:如果与某一过去帧相似度较高,则当前帧未发生镜头切换。
注①:过去某个帧同样需要高斯模糊预处理。
注②:在实验中, n n n设置为4
步骤4:如果[步骤3]判定为发生镜头切换,则将当前帧与未来 m m m个帧分别进行比较(“向后看”)
情况①:如果与某一未来帧相似度较低,则当前帧未发生镜头切换;
情况②:如果与任一未来帧相似度均较高,则当前帧确实发生了镜头切换。
注①:未来某个帧在比较前同样需要高斯模糊预处理;
注②:在实验中,此步骤中“相似度较低”的阈值设置比步骤3稍低(更难达到)。
注③:在实验中, m m m设置为3
步骤5:如果判定当前帧发生了镜头切换,则保存当前帧和上一镜头的最后一帧(即当前帧的上一帧)
输出:每个镜头的第一帧和最后一帧
实验中设计了另一种思路——“随机样本法”来进行镜头检测,在该思路的基础上,又进行了多项改进创新。
最终算法的检测效果有较大提升:在"Godfather.mp4"
视频上,算法的正确识别率达到100%,漏检率和错检率均为0;在"007.mp4"
视频上,算法在保证低漏检率的基础上,有效地降低了在爆炸、火花、物体的快速运动等因素影响下的错检率。
相比基于直方图的检测算法,该算法有更快的速度和更优的检测效果。更快的速度,是因为该算法只取帧图像中少量个样本进行比较,且计算方法简单;更优的检测效果,是因为该算法经过了模糊预处理、缩减样本、前后比较多帧等多项改进,能有效地适应爆炸、闪光、火花、物体快速运动等因素造成的同一帧画面波动,同时保持对切镜帧的高检测率。
对于一些存在剧烈的爆炸、火花、物体的快速运动等因素的镜头,整个帧画面会瞬间发生巨大的变化,实验中实现的该算法仍然可能会将其错检为镜头切换。个人认为,基于局部特征进行镜头检测是另外一种好的方法。原因是同一镜头的帧虽然会存在爆炸、火花、物体的快速运动等情况,但局部的特征不会发生大的改变;如果发生镜头切换,则两帧中的局部特征会发生巨大的变化。因此,可以通过计算两帧中局部特征的匹配程度来判断是否发生镜头切换。
以下展示部分检测结果:
完整检测输出结果:
链接:https://pan.baidu.com/s/1b7jnUe_72IZXeANvzFElOQ
提取码:ne5t