Deblur:运动模糊图像复原(二)

运动模糊图像复原(二)

Reference

Deblurring Text Images via L0 -Regularized Intensity and Gradient Prior

 

上面一文中有涉及到模糊模型的估计,这是一个难点,但是没有细说。这篇文章主要记录一下第三点内容:根据对应层级模糊图像的L0亮度和梯度 + 对应层级的模糊模型 = 预估当前层级的latent image。可设置多次迭代,更新预估结果。

 

对于金字塔顶层对应的图像,设置相应的模糊核大小,并设置初始核。这里假设最底层金字塔对应的核大小为55*55,即kernel size=55。金字塔层数和最大迭代次数遵循以下公式:

Deblur:运动模糊图像复原(二)_第1张图片

Pyramid layers: max_iter+1

对于每层金字塔对应的模糊核大小可以利用如下公式计算:

, 注意这里需要将计算得到的核大小转换为奇数。

那么,金字塔层数有7层,初始核为7*7大小,初始核内容设置如下:

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0.5

0.5

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

 

对于latent image,论文中按照如下公式计算,x即latent image:

Deblur:运动模糊图像复原(二)_第2张图片 

说明一下,表示L0 prior的权重值,实现的时候我设置为0.02。由于上述公式仍有表示不是很清楚的地方,我用代码中用到的公式表示一下。

 

beta初始值设为2*。后续迭代时需要不断更新beta值,beta=2*beta,当beta≥1e5时,终止迭代,可以输出最终计算出的latant image。

 

x求解中,傅里叶逆变换之前的分母可以表示为:

h和v分别表示水平方向和垂直方向的差分。

 

为什么这个公式成立?

对于这个问题,之前类似的保留图像边界并平滑图像内部细节的课题,也有遇到过,目前记得不是很清楚,好像是因为输入的k是实对称的原因,所以等式成立。

 

x求解中,傅里叶逆变换之前的分子可以表示为:

 

这里值得注意的有两点:

  1. 在求模糊图像二阶差分前,对于一阶差分需要排除一些干扰点。可采用下面公式排除:

,保留一阶差分结果, 其他设为0.

    2. 在初次迭代前,对于模糊图像的水平差分和垂直差分,设置初始梯度如下,分别表示水平方向和垂直方向的梯度fx,fy。再对其求fft,变为Fx,Fy。

那么,

1

-1

1

-1

 

我在实际应用中,首次迭代时,设置分母中的梯度使用上述方法计算初始差分,在分子的梯度上使用模糊图像计算差分值。

你可能感兴趣的:(c++实现deblur代码原理,Deblur,c)