如何消除图片中的运动模糊?

小白学视觉

共 5015字,需浏览 11分钟

 ·

2021-12-01 13:51

点击上方小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

本文转自:AI 算法与图像处理

如果你试过去拍摄一些运动场景,例如拍摄疾驰的汽车,或是田径场上的短跑运动员,你一定曾经遇到过“拍糊”的时候。这种现象就是我在本文中要讨论的由运动导致的图像模糊,这是一种与我之前介绍的几种导致图像模糊的方式完全不同的问题,所以今天让我们来看看有什么好办法来应对。


我今天要给你介绍的是两种消除运动模糊的技术,一个叫做Coded Exposure Photography(编码曝光),确切的说是一种利用了Flutter Shutter(震颤快门)的编码曝光技术。另外一种则是Motion Invariant Photography(运动不变摄影)。可能现在还听起来比较拗口,不过先让我们看看它们的效果:

下图是编码曝光拍摄的原始图像,以及经过处理后的清晰图像,你可以看到汽车变得非常清晰了,很神奇吧?(至于为何有原始图像,为何又要经过处理,我们待会再讲)

再来看看运动不变摄影,下面左图是一个固定相机拍摄的运动物体场景,场景中的物体有远处的固定背景屏风,也有近处摆在一个托盘上的水平运动的物体,由于物体有远近,所以其相对相机的运动也是不同的,所以普通相机拍出来就呈现出了不同的模糊程度。而右图则是所谓运动不变摄影的结果,你可以看到总体来说画面变清晰了。真的很惊人!

看到这里,我想你已经迫不及待想知道其中的技术细节了。那就让我们开始吧😃 我们先从运动模糊的基本模型和解决它的困难之处讲起。

一、运动模糊的基本模型


让我们看一个典型的场景,这里面背景和部分物体是固定的,但有一个装着啤酒罐的托盘快速的带动啤酒罐从左向右移动,使得拍摄的画面中啤酒罐出现了运动模糊。那么我们如何来建模这种模糊呢?

事实上,运动模糊和我们之前讲过的几种模糊都可以用卷积来描述。具体到上面这种均匀运动的模糊,可以如下表示:

所以,似乎像以前一样,我们只要知道了模糊核,就能够去卷积把模糊图像变清晰了,是吗?

然而,运动模糊的消除有几个难点:

  1. 很难获取到准确的卷积核,因为卷积核跟物体的远近、物体运动的速度方向都有关系。

  2. 场景中的各个物体有不同的运动方向和速度,还可能有固定的背景,所以需要把需要恢复的物体分割开来,而这本来就是一个困难的问题。

  3. 运动卷积核丢失了高频信息,去卷积技术就会面临严重的信噪比低的问题。

那么,如何解决上述问题呢?我们先从解决难点3讲起,这就是我们会介绍的Coded Exposure技术

二、Coded Exposure


我们先来看看传统相机在拍摄一个水平一维运动物体时的情况:

此时模糊相当于对图像做一个一维的Box Filter,而这个卷积核的傅里叶变换(即OTF)如下图所示,它实际上是一个Sinc函数,可以看到这里有一些值接近零的点。

卷积核不稳定且有大量过零点

于是当我们用去卷积技术去尝试恢复清晰图像时,会因为OTF的大量零点而出现大量的噪声,最终结果信噪比极低(如下图所示)。我们说这时的运动模糊使得很多频域信息损失掉了,所以无法准确的恢复出原始信号。


那么,有没有好办法来减少频域信息的损失呢?这就是这里提到的Coded Photography技术,对应的论文是:

Raskar et al., “Coded Exposure Photography: Motion Deblurring using Fluttered Shutter,” SIGGRAPH 2006.

我们来看看什么是Flutter Shutter,什么又是Coded Exposure

从上面的动图我们看到,Flutter Shutter是指快门交替开关的技术。用这种技术拍出来的图像依然是模糊的,但这种模糊里面却依然保留了尽可能多的频域信息:

OTF相对稳定保留了高频信息


所以这种情况下拍摄的图像的模糊形态和普通相机是不一样的:

普通摄影 vs  编码摄影


这样当我们用去卷积算法对其进行去模糊时,就可以得到比较清晰的信噪比较高的图像:

普通摄影 vs  编码摄影


相信你现在已经有了这样一种印象:在曝光时间内快门交替开关能比一直打开保持更多的频域信息,使得最终图像经过去卷积后得到更清晰的图像。那么,到底如何开闭快门能够收益最大呢?

在上述论文中,作者把快门的开关看做是一种二进制编码,开为1,关为0,这样快门的状态就形成了一个编码——这也是为什么称作Coded Exposure的原因。然后作者比较了几种不同的编码,最终认为一种有52比特的编码形态能够使得整个系统保留最宽广的频率响应,从而信噪比最高。你可以看到下图中,最后一种编码的频率响应最平坦、稳定,且没有过零点。

不同编码形式得到的OTF不同


作者利用单反相机和自制的控制电路制作了一个Flutter Shutter的原型:

再来看一些Flutter Shutter的效果:

看起来真是一个不错的技术啊——然而任何方法都不可能是完美的。我们来看看Coded Exposure by Flutter Shutter有哪些不够好的地方:

  1. 作者采用的这种52bit的编码中有26个1,26个0,这意味着相比传统相机这种方式损失了一半的光能。

  2. 正如一开始我所说,卷积核很难估计,这跟物体的运动速度、远近都有关系。

  3. 需要分割运动的物体和固定的背景,否则做全局的去卷积会使得背景被破坏。

那么,有没有更好的方法呢?那么接下来我们就看一种模糊程度与目标运动速度、远近等因素无关的摄影方式。

三、Motion Invariant Photograpny(运动不变摄影)


Motion Invariant Photograpny的思想来自于下面的论文

Levin et al., “Motion-Invariant Photography,” SIGGRAPH 2008

注意这里的作者又是Levin教授,我们之前已经多次学习到她的文献了。正如上面所说,Motion Invariant Photograpny的思路是通过将整个图像的模糊程度变均匀,使之与物体的远近、运动速度等都不相关,这样就可以用简单的单一去模糊算法来使得图像变清晰了。你有没有觉得这种想法有点眼熟?是的,这个思想就是来自于我们之前提到过的波前编码对焦扫描,不清楚的话可以参看我之前的文章:

38. 对焦扫描技术是如何实现EDOF(扩展景深)的?

39. 消除失焦模糊的其他几种方法

对焦扫描


Motion Invariant的基本假设是目标物体只做一维方向的运动,比如水平运动。虽然看起来比较严格,但是已经可以涵盖很多场景了。它的关键是要去控制相机的运动,从而控制模糊。

先来看看一个静态相机拍摄运动场景时的情况:

这样拍摄的照片显然是模糊的

但如果我们能够移动相机,使之跟踪上面红色的汽车,情况就不同了:

‍‍‍

可以看到这时候相机的位置和时间呈现出一种线性关系,而红色的汽车就拍摄清晰了。当然由于相机运动方向和蓝色汽车相反,所以蓝色汽车变得更加模糊了。

实际上,如果从sensor的视角来看的话,曝光时间内的画面是这样的:

当然,这并不是解决方案——因为它虽然把其中一个物体变清晰了,却让另外的物体变得更模糊了,包括背景也变模糊了。

而作者提出的解决方案还是我们之前提到的老一套:

步骤1:先把不受控的模糊变成均匀的受控模糊,见下图

步骤2:用去卷积技术处理模糊的中间图像,得到清晰的最终图像

这是怎么做到的呢?作者提出了一种抛物线扫描的方式来控制相机或传感器:

抛物线扫描移动相机


我们来看看动图:

从传感器的视角看到的是这样的画面:


这样最终拍摄出来的图像就呈现出一种特殊的模糊,可以用简单的单一去卷积得到最终的清晰图像

我们来看看用这种方式最终的效果吧:

甚至当运动不完全满足单一方向运动这个条件时,也能一定程度上恢复出清晰图像:

当然如果实际运动和之前的假设太不一样了,也会有明显的缺陷,比如下面我们传感器的抛物线运动是水平方向的,但这个人图像站立起来呈现出垂直方向的运动,最后脸部就出现了奇怪的缺陷——但总体来说由于经过了去模糊,还是比固定相机相机拍摄的结果清晰。

下面图中,测试者把纸板快速旋转,导致固定相机拍出了模糊的图像,而运动不变摄影则一定程度上使图像变清晰了。虽然由于纸板运动方向不是一维水平的,在边界处出现了明显的缺陷。

作者提到,传感器的运动完全可以通过控制现有的相机镜头马达的方式来完成。但是为了实现的便利性,作者实现的原型是通过外接机械装置来完成的,下图中你可以看到使用了变径齿轮加连杆使得相机在一个旋转平台上移动,从而模拟抛物线扫描。这里的相机就是个普通单反。

四、总结

4.1 两种方法的比较

今天我介绍了两种实现消除摄影中运动模糊的技术,一个是利用震颤快门的编码曝光,另外一个则是利用抛物线扫描实现的运动不变摄影。

编码曝光使得模糊的图像中保留了尽可能多的频域信息,所以去卷积能够得到信噪比较高的图像。但是由于画面中同时存在不同运动速度的物体,还有固定的背景,而震颤快门不能做到模糊程度与运动速度、方向无关,所以还需要手动介入来进行分割,把想要变清晰的物体分割出来处理。同时,由于我们很难去估计此时的有效卷积核,因此需要进行较多的试错。同时,编码曝光使得快门有一半的时间是关闭的,因此整体画面会偏暗。

而利用抛物线扫描实现的运动不变摄影则使得整个画面的模糊与物体的运动速度、方向都无关,同时作者还证明了此时的有效卷积核中保留了比编码曝光时更多的频域信息(参看作者论文[3]),因此其最终结果更好(见下图):

4.2 不同图像模糊的原因及解决方案

到目前为止,我已经在多篇文章中介绍了图像模糊产生的原因和一些经典的解决方案,在此做一点小小的汇总:

你可以看到这里面所有的方法都有一个基本的核心,就是成像公式:

因此很多文章都是在这个假设基础上寻找合适的卷积核c, 从而恢复出清晰图像x。

4.3 编码摄影

在这个过程中,我们还引入了编码摄影这个概念,我们来分别看看普通的摄影和编码摄影之间的区别和联系:

两种典型的编码摄影的例子如下:

而我在图像模糊与去模糊这一个板块里面,则介绍了编码光圈、震颤快门编码摄影等。事实上,在计算摄影这个领域有很多编码成像的技术,在Ramesh Raskar教授的主页上就列举了很多在不同的维度上进行编码的成像方式,感兴趣的话你可以进一步深入探索。


下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲
小白学视觉公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲
小白学视觉公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群


欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~


浏览 54
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报