matlab 维纳滤波恢复运动模糊,运动模糊恢复专题

相关背景知识

1.运动模糊的定义

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

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

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

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

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

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

运动模糊的分类

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

a. 线性模糊

b. 旋转模糊

c. 缩放模糊

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

a. 局部模糊

b. 全局模糊

2.如何去除图像模糊

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

图像退化模型

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

math?formula=G(x%2Cy)%20%3D%20H(x%2Cy)F(x%2Cy)%20%2B%20N(x%2Cy)%20%5Ctag%7B1%7D

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

PSF(点扩散函数)

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

9a5fdc42f66f?utm_campaign=haruki

PSF

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

9a5fdc42f66f?utm_campaign=haruki

PSF示意图其中

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

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

3.相关去模糊算法

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

9a5fdc42f66f?utm_campaign=haruki

相关去模糊算法

传统去模糊算法

1.非盲图去模糊算法

逆滤波算法

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

math?formula=f(x%2Cy),并且不考虑噪声

math?formula=n(x%2Cy),因此该算法对噪声十分敏感。

math?formula=%5Chat%7BF%7D(x%2Cy)%20%3D%5Cfrac%7B%20G(x%2Cy)%7D%7BH(x%2Cy)%7D%20%3D%20F(x%2Cy)%20%2B%20%5Cfrac%7BN(x%2Cy)%7D%7BH(x%2Cy)%7D%20%5Ctag%7B2%7D 从公式(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

维纳滤波算法

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

math?formula=t(x%2Cy)使得其可以直接将模糊图像

math?formula=g(x%2Cy)转为清晰图像

math?formula=f(x%2Cy)

math?formula=%5Chat%7Bf%7D(x%2Cy)%20%3D%20t(x%2Cy)%20*%20g(x%2Cy)%20%5Ctag%7B3%7D 为了求出这样一个滤波器

math?formula=t(x%2Cy),需要最小化公式(4)。

math?formula=arg%5C%2C%5Cmin_%7Bt(x%2Cy)%7D%20%3D%20E%7C%5Chat%7Bf%7D(x%2Cy)%20-%20f(x%2Cy)%7C%5E%7B2%7D%20%5Ctag%7B4%7D 解该方程可以得到:

math?formula=T(x%2Cy)%20%3D%20%5Cfrac%7BH%5E%7B*%7D(x%2Cy)%7D%7B%7CH(x%2Cy)%7C%5E%7B2%7D%20%2B%20%5Cfrac%7BN(x%2Cy)%7D%7BS(x%2Cy)%7D%7D%20%5Ctag%7B5%7D 其中:

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时,维纳滤波就退化为逆滤波。为此,研究人员提出了约束最小二乘方算法,该算法只需要噪声的方差和均值,并能有效抑制恢复后图像的噪声。为了抑制恢复后图像噪声,需要最小化以下公式:

math?formula=arg%5C%2C%5Cmin_%7B%5Chat%7Bf%7D(x%2Cy)%7D%20C%20%3D%20%5Csum_%7Bx%3D1%7D%5E%7BM-1%7D%5Csum_%7By%3D1%7D%5E%7BN-1%7D%5B%5Cnabla%5E%7B2%7D%5Chat%7Bf%7D(x%2Cy)%5D%5E%7B2%7D%20%5Ctag%7B6%7D

其约束为:

math?formula=%7Cg(x%2Cy)%20-%20h(x%2Cy)*%5Chat%7Bf%7D(x%2Cy)%7C%5E%7B2%7D%20%3D%20%7Cn(x%2Cy)%7C%5E2%20%5Ctag%7B7%7D 利用拉格朗日数乘法解得:

math?formula=%5Chat%7Bf%7D(x%2Cy)%20%3D%20%5Cfrac%7B%5Clambda%20h(x%2Cy)%20*%20g(x%2Cy)%7D%7B%5Clambda%20h(x%2Cy)*h(x%2Cy)%2Bp*p%7D%20%3D%20%5Cfrac%7BHG%7D%7B%7CH%7C%5E2%20%2B%20%5Cgamma%20P%5E2%7D%20%5Ctag%7B8%7D 这里P为lapula斯算子:

math?formula=p%20%3D%20%5Cbegin%7Bbmatrix%7D%200%20%26%20-1%20%26%200%20%5C%5C%20-1%20%26%204%20%26%20-1%20%5C%5C%200%20%26%20-1%20%26%200%20%5C%5C%20%5Cend%7Bbmatrix%7D%20%5Ctag%7B9%7D

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算法

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

math?formula=f%5E%7Bn%2B1%7D(x%2Cy)%20%3D%20%5B%5Cfrac%7Bg(x%2Cy)%7D%7Bh(x%2Cy)*f%5En(x%2Cy)%7D*h(x%2Cy)%5Df%5En(x%2Cy)%20%5Ctag%7B10%7D

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

迭代次数实验对比

9a5fdc42f66f?utm_campaign=haruki

模糊图

9a5fdc42f66f?utm_campaign=haruki

迭代60次

9a5fdc42f66f?utm_campaign=haruki

迭代5次

9a5fdc42f66f?utm_campaign=haruki

迭代30次

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

9a5fdc42f66f?utm_campaign=haruki

清晰图

9a5fdc42f66f?utm_campaign=haruki

模糊图

9a5fdc42f66f?utm_campaign=haruki

逆滤波

9a5fdc42f66f?utm_campaign=haruki

维纳滤波

9a5fdc42f66f?utm_campaign=haruki

约束最小二乘方法

9a5fdc42f66f?utm_campaign=haruki

RL跌代30次

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

9a5fdc42f66f?utm_campaign=haruki

清晰图

9a5fdc42f66f?utm_campaign=haruki

模糊图

9a5fdc42f66f?utm_campaign=haruki

逆滤波

9a5fdc42f66f?utm_campaign=haruki

维纳滤波

9a5fdc42f66f?utm_campaign=haruki

约束最小二乘方法

9a5fdc42f66f?utm_campaign=haruki

RL跌代30次

2. 盲图去模糊算法

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

倒频谱法

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

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

math?formula=L和模糊角度

math?formula=%5Ctheta。这里我们先预设一个模糊核:

math?formula=L%3D23%2C%20%5Ctheta%20%3D%2078%5E%7B%5Ccirc%7D,并用该模糊核模糊原图。

9a5fdc42f66f?utm_campaign=haruki

PSF

估计模糊方向

math?formula=(0%5E%5Ccirc-179%5E%5Ccirc)

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

9a5fdc42f66f?utm_campaign=haruki

原图

9a5fdc42f66f?utm_campaign=haruki

模糊图

9a5fdc42f66f?utm_campaign=haruki

频域图

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

9a5fdc42f66f?utm_campaign=haruki

移位到中心

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

9a5fdc42f66f?utm_campaign=haruki

截取图像中间

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

9a5fdc42f66f?utm_campaign=haruki

估计角度$\theta$

2.估计模糊尺度

math?formula=L(6-35)像素

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

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

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

math?formula=dis%20%3D%202d,则所求

math?formula=L%20%3D%20N%2Fd

9a5fdc42f66f?utm_campaign=haruki

频域图

9a5fdc42f66f?utm_campaign=haruki

移位图

9a5fdc42f66f?utm_campaign=haruki

反色提取图

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

math?formula=%5Ctheta%20%3D%2080.18%5E%5Ccirc%2C%20L%20%3D%2025.00, 我们可以看到虽然有一些误差,但是已经很接近我们的真实值了。

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

math?formula=L%20%3D%20%5B8%2C%2016%2C%2024%2C%2032%5D%2C%20%5Ctheta%20%3D%20%5B10%5E%5Ccirc%2C%2030%5E%5Ccirc%2C%2050%5E%5Ccirc%2C%2070%5E%5Ccirc%2C%2090%5E%5Ccirc%2C%20110%5E%5Ccirc%2C%20130%5E%5Ccirc%2C%20150%5E%5Ccirc%2C%20170%5E%5Ccirc%20%5D 共构建36种psf模糊核,分别模糊同一张图像,然后用到频谱法估计其参数,结构如下:

模糊核尺度

math?formula=L估计结果

9a5fdc42f66f?utm_campaign=haruki

尺度估计结果

模糊角度

math?formula=%5Ctheta估计结果

9a5fdc42f66f?utm_campaign=haruki

角度估计结果

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

math?formula=%5Ctheta%3D130%5E%5Ccirc%2C%20L%20%3D%208时,估计结果偏差很大,初步估计是前面提取暗通道过程中,提取结果不够精确。而模糊方向

math?formula=%5Ctheta的估计就比较精确了,基本上都在准确值

math?formula=%5B-1%2C%2B1%5D的范围内。但是在测试的时候叶发现当角度

math?formula=%5Ctheta%20%3C%205%5E%5Ccirc%20or%5C%20%5Ctheta%20%3E%20175%5E%5Ccirc时, 预测的模糊角度就会有较大的偏差。

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

math?formula=L%20%3D%2019%2C%20%5Ctheta%20%3D%20110%5E%5Ccirc%2C%20%E6%97%A0%E5%99%AA%E5%A3%B0,利用到频谱法估计出来的模糊核参数(

math?formula=L%3D20.03%2C%20%5Ctheta%20%3D%20109.6), 实验结果如下。

9a5fdc42f66f?utm_campaign=haruki

清晰图

9a5fdc42f66f?utm_campaign=haruki

模糊图

9a5fdc42f66f?utm_campaign=haruki

逆滤波

9a5fdc42f66f?utm_campaign=haruki

维纳滤波

9a5fdc42f66f?utm_campaign=haruki

约束最小二乘方法

9a5fdc42f66f?utm_campaign=haruki

RL跌代30次

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

总结

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值