现在的位置: 首页 > 综合 > 正文

用简单算法去除图像抖动

2018年02月20日 ⁄ 综合 ⁄ 共 805字 ⁄ 字号 评论关闭

    有时人们需要去除视频中的抖动。

    本人用一种简单算法实现了该功能,实际效果还不错。
    主要思想是这样的:在第一帧图像中选择一块特征明显的纹理Patch,然后在随后的每一帧图像中找到与该纹理Patch最相似的Patch,然后将找到的Patch“钉”到第一帧Patch的所在位置上。
    两块Patch的相似度用灰度互相关值来表示,公式如下:
                 
    其中:pi表示纹理A的每一个像素点的灰度值;qi表示表示纹理B的每一个像素点的灰度值;pi(没有上划线,用下划线代替,后同)表示“纹理A所有像素点灰度值之和/像素个数”;qi含义与pi相似,代表纹理B的平均值;分母用来做归一化。这样,两块Patch越相似,NGC值越大,越接近于1,因此我们可以选择NGC值最大的Patch作为下一帧图像中找到的Patch。
    考虑到连续两帧之间的抖动应该不会太大,因此在搜索最相似Patch时,没有必要在整张图片上寻找,只需要在上帧Patch位置一定邻域内搜索即可,在这里我使用了50*50的邻域,也就是说将计算2500个候选Patch与第一帧初始Patch的相似性,并将NGC值最高的Patch作为参考点,将整幅图移动对应距离,使得NGC值最高的Patch位置与初始Patch位置重合。
    由于计算Patch相似性的过程互不相关,因此可以利用并行技术实现加速,这里我使用了Nvidia显卡提供的OpenCL开发环境实现加速,效果比较明显。
    本程序还存在的不足:
    1.只能处理背景相对固定的视频抖动,也就是说,第一帧选的参考Patch必须在每帧中都出现,否则程序无法工作。
    2.本质上只解决画面的平移性抖动,对旋转、放射、拉伸等抖动没有办法处理。
    3.没有处理视频边框,可能使人看起来不舒服。
    附件:
    程序及源码下载:click here

抱歉!评论已关闭.