相关背景知识

1.运动模糊的定义

wiki百科上的定义是:运动模糊或运动模糊(motion blur)是静态场景或一系列的图片像电影或是动画中一样快速移动,使物体产生明显运动痕迹。

[图片上传失败...(image-9eedb7-1574308075917)]

从狭义上来说,我们仅仅关注造成人眼和相机运动模糊的原因。

对于人眼来说,由于视觉暂留原理,当前景象与视网膜残留的景象重合产生运动模糊。

对于相机,由于在曝光时间内,被摄物体与镜头产生相对位移,使得底片上同一个像素点被来自不同位置的光照射,导致运动模糊。

从以上描述,我们可以看到,对于相机和人眼,运动模糊的产生主要的条件就是感光设备与被观测物体的相对运动。

运动模糊的分类

根据模糊核的性质可以分为:

a. 线性模糊

b. 旋转模糊

c. 缩放模糊

根据模糊的范围,可以分为:

a. 局部模糊

b. 全局模糊

2.如何去除图像模糊

图像的运动模糊本质上也是一种图像退化过程,因此我们可以将其归于图像退化恢复任务。

图像退化模型

频域(以下涉及的所有公式中,大写大写代表在频域中计算,小写代表在时域中计算):

在这里,F(x,y)是我们原本的清晰图像,H(x,y)为我们的模糊核,G(x,y)指我们观测到的模糊图像,而N(x,y)是指噪声。

PSF(点扩散函数)

当上式中H具备空间不变性时,我们可以将其称之为点扩散函数,其定义如下:

PSF

参考运动模糊算法推论, 引用其图片如下:

PSF示意图其中

表示模糊方向,L表示模糊尺度,我们可以理解为在一个滤波器卷积核,以中心为原点,L/2为半径的圆中,与水平方向的家夹角为

的直径上的像素值为1/L,其余像素值为0。(注意:这只是理想上的psf,实际拍摄中,psf值不一定是均匀的。)

3.相关去模糊算法

当前比较传统的去模糊算法都是基于其退化函数来去模糊。根据点扩散函数是否已知,可以将相关去模糊算法分为盲图复原算法和非盲图复原算法。如下图所示。

相关去模糊算法

传统去模糊算法

1.非盲图去模糊算法

逆滤波算法

该算法直接根据公式(1)得出

,并且不考虑噪声

,因此该算法对噪声十分敏感。

从公式(2)中,我们很容易发现,当无噪声时,该方法能很好的恢复原图,但当噪声存在,且H比较小的时候,等式右边第二项将会给图像恢复造成极大的麻烦。

python 代码实现如下:

#inverse filter

def inverse(input, PSF): # 逆滤波

input_fft = np.fft.fft2(input)

PSF_fft = np.fft.fft2(PSF)

result = np.fft.ifft2(input_fft / PSF_fft) #计算F(u,v)的傅里叶反变换

result = np.real(fft.fftshift(result))

result[np.isinf(result)] = 0

result[result > 255.0] = 255

result[result < 0] = 0

return result

维纳滤波算法

考虑到逆滤波算法的缺陷,人们又提出一种维纳滤波算法,该算法从的主要思想是想找到一个滤波器

使得其可以直接将模糊图像

转为清晰图像

为了求出这样一个滤波器

,需要最小化公式(4)。

解该方程可以得到:

其中:

T(x,y)和H(x,y)是所求滤波器t(x,y)和psf h(x,y)在频率域的傅里叶变换。

S(x,y)是原清晰图f(x,y)的功率谱。

N(f)是噪声的n(x,y)的功率谱。

上标∗代表复数共轭

python代码实现如下:

def wiener(input,PSF,K=0.01): #维纳滤波,K=0.01

input_fft=np.fft.fft2(input)

PSF_fft=np.fft.fft2(PSF)

PSF_fft_1=np.conj(PSF_fft) /(np.abs(PSF_fft)**2 + K)

result=np.fft.ifft2(input_fft * PSF_fft_1)

result=np.real(fft.fftshift(result))

result[result > 255.0] = 255

result[result < 0] = 0

return result

约束最小二乘方算法

从维纳滤波的公式推导中我们可以看到,要很好的恢复原图,必须求出噪信比(噪声与原图功率谱的比值),然而这是很难获得的,并且当噪声为0时,维纳滤波就退化为逆滤波。为此,研究人员提出了约束最小二乘方算法,该算法只需要噪声的方差和均值,并能有效抑制恢复后图像的噪声。为了抑制恢复后图像噪声,需要最小化以下公式:

其约束为:

利用拉格朗日数乘法解得:

这里P为lapula斯算子:

python代码实现

#约束最小二乘方滤波器

def Least_square_filter(input, psf, r = 0.001):

lp = np.array([[0,-1,0],

[-1,4,-1],

[0,-1,0]])

result = np.real(fft.ifft2(numerator * F_input / (F_psf**2 + r * F_lp**2)))

result[np.isinf(result)] = 0

result[result > 255.0] = 255

result[result < 0] = 0

return result

Richardson–Lucy_deconvolution算法

该算法基于贝叶斯估计,泊松分布以及极大似然估计对图像进行修复。此处直接给出其迭代式:

python代码实现

#Richardson–Lucy_deconvolution算法(露西-理查德森)

def RL_deconv_f(input, psf, iteration, eps):

ut = input

otf = psf2otf(psf) #该函数为matlab中psf2otf函数的python实现

for i in range(iteration):

ut_f = np.fft.fft2(ut)

temp1 = ut_f * otf

itemp1 = np.real(np.fft.ifft2(temp1))

ratio = input / itemp1

ratio[np.isinf(ratio)] = 255

ratio = np.nan_to_num(ratio)

iratio = np.fft.fft2(ratio)

res = iratio * np.conj(otf)

ires = np.real(np.fft.ifft2(res))

ut = ut * ires

ut[np.isinf(ut)] = 0

ut[ut > 255.0] = 255

ut[ut < 0] = 0

return ut

迭代次数实验对比

模糊图

迭代60次

迭代5次

迭代30次

传统算法实验结果对比(无噪声)

清晰图

模糊图

逆滤波

维纳滤波

约束最小二乘方法

RL跌代30次

传统算法实验结果对比(添加均值为0,方差为0.01的高斯噪声)

清晰图

模糊图

逆滤波

维纳滤波

约束最小二乘方法

RL跌代30次

2. 盲图去模糊算法

一般来说,盲图去模糊算法首先是估计点扩散函数,当点扩散函数已知时,便可以将问题转化到非盲图去模糊问题。但也有另外迭代的方法,即利用各种先验知识,迭代估计psf和原图以达到最佳效果。本节提到的是一种估计psf的经典算法。

倒频谱法

本文主要参考博文, 以及论文0181208.htm,论文201811/20/20181120154225821.pdf

说到估计psf,主要就是估计psf的两个重要参数,即模糊尺度

和模糊角度

。这里我们先预设一个模糊核:

,并用该模糊核模糊原图。

PSF

估计模糊方向

a. 将模糊图像转化到频域,并用对数进行动态压缩。

原图

模糊图

频域图

b. 将压缩后的矩阵先平方,再逆傅里叶变换回时域,然后移位到中心。

移位到中心

c . 截取取图像中间部分,先进行闭运算,得到这条斜线。

截取图像中间

d. 然后对闭运算结果二值化,并提取其骨架。最后一步就是估计骨架的角度,即我们要求的模糊尺度θ, 我们可以使用Radon、霍夫直线检测、最小二乘法等方法,我这里用的是最小二乘法。

估计角度$\theta$

2.估计模糊尺度

像素

a. 将模糊图像转化到频域后,移位到中心(经过对数动态压缩) 。

b. 将步骤a中的结果反色,取得我们需要的暗通道图。

c. 剩下的步骤和方向估计一样,最终取得暗通道的骨架图,估计中心两骨架之间的距离

,则所求

频域图

移位图

反色提取图

最后在我实现的方法中,估计出来的

, 我们可以看到虽然有一些误差,但是已经很接近我们的真实值了。

3.为了验证算法的有效性,我取

共构建36种psf模糊核,分别模糊同一张图像,然后用到频谱法估计其参数,结构如下:

模糊核尺度

估计结果

尺度估计结果

模糊角度

估计结果

角度估计结果

从图中我们可以看到,模糊尺度估计的偏差比较大,而且在

时,估计结果偏差很大,初步估计是前面提取暗通道过程中,提取结果不够精确。而模糊方向

的估计就比较精确了,基本上都在准确值

的范围内。但是在测试的时候叶发现当角度

时, 预测的模糊角度就会有较大的偏差。

4.利用到频谱法,结合之前提到的非盲图去模糊算法,我们做一个盲图去模糊实验,这里我们取

,利用到频谱法估计出来的模糊核参数(

), 实验结果如下。

清晰图

模糊图

逆滤波

维纳滤波

约束最小二乘方法

RL跌代30次

我们可以看到实验结果基本上和我们之前分析的相同,其中RL算法继续迭代的话,效果还能有一定的提升。

总结

本文只简要提及了一些传统的去模糊算法,近些年还有许多表现优秀的去模糊算法被提出,例如,迭代优化求解类,超分辨类,神经网络类等等。大家如果想进一步了解运动去模糊相关算法,强烈推荐这个github链接收录了近十几年的去模糊论文,包括各种应用场景,只能说真香!

matlab 维纳滤波恢复运动模糊,运动模糊恢复专题相关推荐

  1. 求解模糊运动角度matlab,动态模糊图像复原MATLAB程序

    <动态模糊图像复原MATLAB程序>由会员分享,可在线阅读,更多相关<动态模糊图像复原MATLAB程序(7页珍藏版)>请在人人文库网上搜索. 1.1. 退化程序clc;clea ...

  2. Matlab学习——曲柄滑块的运动仿真

    1.图解法 ①机构位置分析的图解法 选取适当的长度比例尺 μl=0.6:1{\mu _l} = 0.6:1 μl​=0.6:1 选取曲柄l1的铰链中心A 点的位置, 按主动杆 r=60mm{\rm{r ...

  3. matlab 地形模拟程序,MATLAB模拟小球自由落体运动

    大部分朋友学习MATLAB,需要一个学习示例用来参考,有一个比较经典的题目就是如何利用Matlab模拟小球自由落体运动,这可能会是你的某次课后作业,这个程序的编写过程可以分为三个步骤: 第一部分,设置 ...

  4. 深入理解采样定理 + Matlab 仿真 Sa 函数的采样与恢复

    建议配合国宝老师的视频食用. 信号与线性系统分析 吴大正 郭宝龙 文章目录 (1) 采样的说明 1. 为什么要取样 2. 什么是取样 (2) 采样定理 1. 为什么要有奈奎斯特频率 2. 什么是采样定 ...

  5. matlab 平抛运动,MATLAB计算平抛阻尼运动

    MATLAB计算平抛阻尼运动 小球在空气中平抛运动的轨迹 [问题]一小球在空气中作平抛运动,初速度为v0,所受的阻力与速率成正比:f = -kv,k称为阻力系数.画出小球运动的轨迹. [数学模型] 如 ...

  6. matlab怎么恢复默认字体,windows10下恢复系统默认字体的三种方法

    一些朋友在更改win10系统界面默认字体后,会遇到设置界面显示不全的情况,此时我们只能将字体恢复成原来的样子.不过,由于大多用户不知道系统界面的默认字体是什么,导致无法恢复成正常状态.下面,系统城小编 ...

  7. 单目slam基础 特点匹配 光流匹配 单应变换恢复变换矩阵 本质矩阵恢复变换矩阵 深度滤波

    非滤波单目slam基础 非滤波方法的单目视觉SLAM系统综述 论文 直接法 特征点法 混合法区别与联系 按照 2D−2D 数据关联方式的不同 ,视觉定位方法可以分为直接法.非直接法和混合法1. 直接法 ...

  8. iphone彻底删除照片如何恢复_手机删除的照片如何恢复?OPPO最新照片恢复

    手机删除的照片如何恢复?小编给大家带来了OPPO最新照片恢复方法,可谓是专属福利啊!手机照片误删,焕发出来的照片很模糊?这有何难!手机照片管家APP竟然可以恢复高清图片, 不过现在安卓机只有OPPO才 ...

  9. 两个苹果手机怎么传通讯录_苹果手机通讯录丢失怎么恢复?货真价实的通讯录恢复技巧...

    苹果手机如果只是误删了某个好友的联系方式,完全可以通过其他共同好友要到联系方式,重新添加回手机.如果没有共同好友,或者将手机通讯录所有联系人丢失或误删,该怎么办呢?今天小编就教大家几种找回误删通讯录联 ...

最新文章

  1. CentOS7搭建LNMP--编译安装
  2. 为什么我恨Scrum?
  3. 环形链表II—leetcode142
  4. Hyper-V数据文件丢失解决方案(有图有真相)
  5. Intel 64/x86_64/IA-32/x86处理器 - 通用指令(3) - 逻辑指令/移位指令
  6. sqlserver递归
  7. addroutes没添加进去_CAD中如何绘制函数曲线及添加数学公式
  8. springboot 启动加载数据库数据到redis缓存
  9. soapui 使用 java_SoapUI的进阶使用
  10. XMind8update6 补丁
  11. 基于区块链技术的展望:搭建商业银行供应链管理和供应链金融服务平台
  12. kube-scheduler源码分析(三)之 scheduleOne
  13. 图形化开发(五)011-Three.js之Geometry几何体——立方体、圆形、圆锥
  14. 逻辑回归实战(动手实践)
  15. 数据质量管理—3、数据修正(Data Correcting)
  16. 使用粒子效果动画组成模型[自定义shader实现]
  17. Web网页设计-盒子模型
  18. 网页中标签对搜索引擎的影响
  19. python语言的实验心得体会范文_实验心得体会-精选范文
  20. python web server 知乎_“知乎网”技术方案初探

热门文章

  1. android自定义水波纹,android 自定义view-水波纹进度球
  2. 卧槽,柠檬也能做汽车???
  3. 开源项目|从0到1教你搭建一个适配于智能车的目标检测系统
  4. 面试官:“你大学做过真实项目吗?”
  5. 【荐读】一名95后的嵌入式软件工程师,成长之路!
  6. Verilog hdl与VHDL混用详解
  7. bzoj 1221: [HNOI2001] 软件开发
  8. NOIP2018提高组模拟题(六)
  9. STM32 解析futaba S-bus协议
  10. Java 和 Python 解析动态 key 的 JSON 数据