相关背景知识
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链接收录了近十几年的去模糊论文,包括各种应用场景,只能说真香!