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

相关背景知识

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,维纳滤波恢复运动模糊)