Introduction

图像去模糊是一个经典的图像复原任务。造成图像模糊的原因有很多,可以主要分为三大类

  • 离焦模糊:场景中的物体处于成像景深范围之外而变得模糊。离焦模糊的去除一般对应着景深的扩展技术
  • 像差模糊:镜头加工和制造的缺陷造成了物方的一个点在成像平面形成了一个弥散斑
  • 运动模糊:成像过程中相机运动或者场景变化所造成的不同空间位置信息的混叠

而最常见的图像去模糊技术一般都是针对运动模糊的去除,因为运动模糊往往是拍摄者不想引入拍摄图像的。我们本次就简单介绍一下图像运动模糊的形成和去除。

The formation of motion blur

正如前面所提到的,图像运动模糊是由于成像过程中相机运动或者场景变化所造成的不同空间位置信息的混叠。拍摄图像时往往需要一定的曝光时间,如果在这一段曝光时间内投射到传感器上的画面运动超过单个像素尺寸,那么模糊就会出现。曝光时间越长,图像中的模糊往往就剧烈。场景点的运动轨迹累计形成的图像即为模糊核,其记录着在曝光时间内,当前场景点在图像上的能量分布和影响范围。

在考虑去除图像模糊之前,我们首先需要考虑如何描述运动模糊,以及如何对运动模糊进行建模。场景变化如场景中车的行驶或者行人的走动往往是复杂多变的,许多并不是刚体运动可以描述的。而实际上,许多物体运动造成的模糊有可能是摄影者故意为之的,如延时摄影。而对于相机运动造成的图像全局模糊却往往是不想要的。对于这种运动模糊,我们可以通过刚体运动和针孔成像模型来进行建模,得到每个时刻的像素运动状态,从而获知曝光时间内每个像素的模糊核。这里默认大家对相机运动和针孔成像模型有了基本的了解,因而直接给出模型的结论。

相机经过平移和旋转后,图像上的像素点变化前后的位置Q0(u0.v0)Q_0(u_0.v_0)Q0​(u0​.v0​)以及Q1(u1,v1)Q_1(u_1,v_1)Q1​(u1​,v1​)存在如下关系:
[u1v11]=Z0Z1KR(θ)K−1[u0v01]+KT⃗Z1\left[ \begin{array}{c} u_1 \\ v_1 \\ 1\\ \end{array} \right] = \frac{Z_0}{Z_1}KR(\theta)K^{-1}\left[ \begin{array}{c} u_0 \\ v_0 \\ 1\\ \end{array} \right] + \frac{K\vec{T}}{Z_1} ⎣⎡​u1​v1​1​⎦⎤​=Z1​Z0​​KR(θ)K−1⎣⎡​u0​v0​1​⎦⎤​+Z1​KT​

其中,Z0Z_0Z0​和Z1Z_1Z1​分别表示相机在运动前后的物方成像距离。KKK表示相机内参矩阵,其代表着相机内部的参数,如焦距,主点等;R(θ)R(\theta)R(θ)表示旋转矩阵,其代表着相机绕各个轴转过的角度;T⃗\vec{T}T表示平移向量,其代表着相机平移的距离。可以看出,造成场景点在成像平面上像素位置移动的因素包括了相机的运动状态,相机参数以及场景与相机的距离。如果能够精确的记录这几组参数,就可以准确地描述图像中每个像素点的运动状态,从而获知图像的模糊形态。

在日常的拍摄场景中,成像距离一般比较远(如大于2m),此时相机的移动远远小于场景与相机的距离,即T⃗≪Z0\vec{T} \ll Z_0T≪Z0​。而且Z0≈Z1Z_0\approx Z_1Z0​≈Z1​与物距(场景深度)无关,场景可以近似看做在同一个成像平面上。那么上式可以简化为:
[u1v11]≈KR(θ)K−1[u0v01]\left[ \begin{array}{c} u_1 \\ v_1 \\ 1\\ \end{array} \right] \approx KR(\theta)K^{-1}\left[ \begin{array}{c} u_0 \\ v_0 \\ 1\\ \end{array} \right] ⎣⎡​u1​v1​1​⎦⎤​≈KR(θ)K−1⎣⎡​u0​v0​1​⎦⎤​

即可以认为物体的模糊主要来源与相机的旋转运动,且成像过程没有明显的缩放。如果我们对这个模型做进一步简化,认为相机绕Z轴旋转近似为0,那么此时图像模糊可以简化为全局均匀模糊,即模糊形式退化为单一模糊核对图像做全局卷积,也就是传统去模糊中的经典形式:
y=k∗xy=k*xy=k∗x

其中,kkk表示模糊核,yyy表示拍摄到的模糊图像,xxx表理想的清晰图像,∗*∗表示卷积操作。

Deblurring Method

曝光时间越长,图像就越有可能出现模糊。因而减小模糊的最直接方式就是缩短曝光时间,比如相机拍照时都有一个安全快门,使用小于安全快门的曝光时间拍摄,可以尽量减少相机抖动造成的模糊。然而,在许多场景下减小曝光时间往往会带来其他问题,如高噪声,偏色等。因而有许多图像复原方法被提出用于解决不同场景下的图像模糊问题。图像去模糊方法有多种分类,比如根据模糊状态是否已知可以分为图像盲去模糊和图像非盲去模糊。根据复原方法的不同,可以分为基于模型的方法(model-based method)和基于学习的方法(learning-based method)。下面将按照这种分类来做依次介绍。

Model-based Methods

基于模型的方法就是先对模糊过程进行建模,然后借助于优化方法等数学工具来求解逆过程。正如前面介绍到的,传统去模糊中的经典形式为:
y=k∗x+ny=k*x+ny=k∗x+n

其中,nnn表示噪声。我们已知模糊图像yyy,然后估计原始图像xxx和模糊核kkk(盲去模糊),或者已知yyy和kkk从而估计xxx(非盲去模糊)。逆过程的求解往往是一个病态问题,该问题的解往往不是唯一的。为了缩小问题的解空间,更好的逼近真实解,我们需要添加先验条件。不同的先验条件会引导我们进入不同的解空间,从而得到不同的复原图像。

在基于模型的方法中,图像去模糊的目标函数是在贝叶斯框架下面使用最大后验概率的方法建立的。
x,k=arg⁡min⁡x,kf(x,y)+prior(x)+prior(k)x,k=\arg\min_{x,k} f(x,y)+prior(x)+prior(k)x,k=argx,kmin​f(x,y)+prior(x)+prior(k)

其中,f(x,y)f(x,y)f(x,y)表示数据保真项,其通过对图像噪声建模,使得估计出的原始图像与退化图像在内容上保持一致。prior(x)prior(x)prior(x)和prior(k)prior(k)prior(k)则分别表示图像内容的先验项和模糊核的先验项(如果模糊核未知)。去模糊的效果这就主要受这三个方面的影响。许多基于模型的方法都是在这三个方面进行改进。

然而,基于模型的去模糊方法也有其局限性。首先就是大多数方法都是基于经典的卷积模型,针对的是全局均匀的模糊。对于非全局均匀模糊,如相机绕Z轴旋转造成的图像旋转模糊就很难使用单一模糊核描述。而对于场景中物体运动造成的局部运动模糊更是无能为力。另外,基于模型的方法一般都是采用迭代的方式,利用图像金字塔从小到大地估计模糊核和去除模糊,因而往往需要大量的时间开销。

Learning-based Methods

随着深度学习的普及,许多基于学习的图像复原的方法也开始兴起。与图像降噪和超分辨等图像复原任务相比,基于学习方法的图像去模糊兴起得更晚一点,研究也相对较少。对于基于监督学习的图像复原任务,最重要的因素之一就是数据集的构建。图像去模糊的数据集构建方式大体可以分为以下几类:

  • 先获取或生成模糊核,然后使用模糊核卷积图像得到模糊-清晰数据对。这种方式正是使用了前面提到的经典卷积模型来构建全局均匀的模糊,也是最通用的方法之一。而对于基于CNN的去模糊方法,由于其感受野有限,局部图像区域的模糊可以近似看做是均匀模糊,因而尽管在合成数据对时使用单一模糊核卷积图像块,训练得到的模型对于非均匀模糊也有一定的自适应效果。Lai和Kohler等公开的评价测试集中都采用了这种方式。
  • 使用相机运动模型和成像模型仿真运动过程,然后合成全局非均匀模糊。这种方法就是利用了前面提到的相机抖动造成模糊的原理。通过模拟或者获取相机运动状态(如记录相机陀螺仪数据),然后借助于相机参数和成像参数,获取曝光时间内的每个时刻的运动状态进行叠加。利用该方法生成的模糊数据更加接近相机抖动造成的模糊形态。
  • 使用高帧率相机拍摄高帧率图像序列,然后多帧叠加合成。上面两种合成方式只能模拟相机运动造成的模糊,而对于场景中物体运动造成的局部模糊无法模拟。而使用高帧率相机拍摄则可以既引入相机运动模糊,也可以引入物体运动的局部模糊。Nah等人率先使用GoPro运动相机构建了这种数据集,现在这种构建方式也成为去模糊数据集的主流形式之一。
  • 使用分光装置将同一场景分光给两个相机,使得这两个相机同时接受同一个场景画面。其中一个相机采用长曝光拍摄模糊图像,另一个采用短曝光方式采集清晰图像,从而得到模糊-清晰图像对。采用这种方式可以获取更加真实的模糊数据,避免了高帧率相机在合成快速运动物体和高曝光区域的不足。ECCV2020有两篇文章(Rim等人和Zhong等人)都采用了这种方式建立模糊数据集。

在网络模型方面,许多其他图像复原任务如降噪、超分辨等以及高层视觉任务中的网络结构都被借鉴过来。许多传统去模糊的方法也被借鉴到去模糊网络中,比如传统去模糊中使用金字塔结构从小尺度到大尺度地迭代去模糊,而多尺度递归的网络结构(如SRN)也被应用到去模糊任务中并取得了不错的效果。借助于网络模型,去模糊方法可以打破传统卷积模型的限制,使得去模糊算法可以同时应对相机运动造成的全局非均匀模糊和场景中物体运动造成的局部模糊。同时基于学习的方法缩短了运行时间,随着终端算力的提升,使得去模糊方法的落地变成了可能。

Conclusion

图像去噪和超分辨等图像复原算法已经在智能终端得到普及并大大提升了拍照质量,而图像去模糊也逐渐成为下一个落地的目标。像如NITRE2020的图像比赛,就将图像去模糊在智能手机中的应用作为一个赛道,并有许多成果呈现出来。由于图像模糊的复杂性,能够在大多数场景中兼顾效果和性能的去模糊算法还有待发掘和改进。如何减小模型的时间和内存开销,如何增强模型的鲁棒性和实用性,如何保留下摄影师想刻意为之的模糊而去掉不想要的模糊,如何在去掉模糊后不引入振铃等伪纹理。图像去模糊的实用化还任重而道远。

参考文献

图像去模糊论文集合:[github]

图像运动模糊及其去除相关推荐

  1. Win8 Metro(C#)数字图像处理--2.50图像运动模糊

    原文:Win8 Metro(C#)数字图像处理--2.50图像运动模糊  [函数名称] 图像运动模糊算法    MotionblurProcess(WriteableBitmap src,int  ...

  2. python实现运动模糊图像_OpenCV+Python实现图像运动模糊和高斯模糊

    原标题:OpenCV+Python实现图像运动模糊和高斯模糊 运动模糊:由于相机和物体之间的相对运动造成的模糊,又称为动态模糊 OpenCV+Python实现运动模糊,主要用到的函数是cv2.filt ...

  3. 两个一样的图像相除会怎么样_【壮凌自动化分析】一种动力电池生产中基于图像运动模糊的速度检测方法...

    一种动力电池生产中基于图像运动模糊的速度检测方法 1.西南大学 电子信息工程学院,重庆 400715) 2.非线性电路与智能信息处理重庆市重点实验室,重庆 400715) 1.当前背景与成熟方法介绍 ...

  4. 图像运动模糊原理及python实现

    一. motion blur 运动模糊是我们在日常生活中很常见的一种模糊.当我们按下快门拍照时,如果照片里的事物(或者我们的相机)正在运动的话,我们拍出的照片就会产生运动模糊. 二. motion f ...

  5. python实现运动模糊图像_OpenCV+Python实现图像运动模糊和高斯模糊!它是编程界的PS!...

    运动模糊: 由于相机和物体之间的相对运动造成的模糊,又称为动态模糊 OpenCV+Python实现运动模糊,主要用到的函数是cv2.filter2D(): # coding: utf-8 import ...

  6. OpenCV图像运动模糊

    def motion_blur(img, degree=10, angle=20):image = img.copy()# 这里生成任意角度的运动模糊kernel的矩阵, degree越大,模糊程度越 ...

  7. matlab starcat_维纳滤波和编码曝光PSF去除运动模糊【matlab】

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%% 作者:WWC %%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%% ...

  8. 图像处理之仿真运动模糊复原【使用逆滤波、维纳滤波】

    目录 一.基础知识 二.问题分析 三.效果图 四.代码 一.基础知识 图像去模糊是一个经典的图像复原任务.造成图像模糊的原因有很多,可以主要分为三大类 离焦模糊:场景中的物体处于成像景深范围之外而变得 ...

  9. 运动模糊的图像修复调研

    前言 1.什么是运动模糊 在用摄像机获取景物图像时,如果在相机曝光期间景物和摄像机之间存在相对运动,例如用照相机拍摄快速运动的物体,或者从行驶中的汽车上拍摄外面静止不动的景物时,拍得的照片都可能存在模 ...

最新文章

  1. Kotlin 中 switch 写法
  2. python和idl_有前辈对比过IDL和Python的速度吗,哪个会快点?
  3. Leader晋升失败,CTO说,没有商业敏感度,迟早被淘汰
  4. EJB3.0定时发送jms(发布/定阅)方式
  5. kaggle和colab入门
  6. android如何设置软件的版本,假的设置软件-假的设置(型号模拟)下载v2.5 安卓版-西西软件下载...
  7. Android---Activity 生命周期(三)Stopping Activity Restarting Activity
  8. Windows server 2003域控直接迁移到2012[史上最详细]
  9. linux spf13 vim安装,Linux 下安装 spf13-VIM
  10. php嗅探视频地址,用PHP嗅探youku视频的真实地址!
  11. Android调用高德地图服务
  12. JAVA设计模式 — 生成器模式(Builder)
  13. 星环大数据incepter简易指南
  14. 【Altium Designer10详细安装】
  15. Gif动图如何裁剪?收下这个图片在线裁剪工具
  16. unity Animator 同时播放两个动画,并动态更换Animator中的AnimationClip
  17. Mina中的zkApp交易snark
  18. vsc 代码另起一行_VSCode 快捷键大全
  19. 华为发布:30岁以下员工仅占28% 你信吗?
  20. 祖源分析相关链接推荐

热门文章

  1. Eigen aligned_allocator
  2. 通信技术计算机技术合称为,通信技术、计算机技术和控制 技术合称为3C
  3. SAP 标准成本、目标成本与实际成本
  4. 三种交换技术及其比较
  5. 史上最经典的10大反间计
  6. 如果一个人没有明确的目标,他的人生就像是一艘没有罗盘的船
  7. Tc27x的MTCR与MFCR指令
  8. ElasticSearch--Field的使用
  9. java.lang.ClassNotFoundException(通俗易懂)
  10. cisco wlc 5520 替换 5508