盲区卷积python 盲去卷积复原_后验概率


上一篇文章35. 去卷积:怎么把模糊的图像变清晰?吸引了很多朋友的关注。在这篇文章里面,我给大家讲了一种叫做“非盲去卷积”的方法,当指定了PSF(下图中的c),和观测到的模糊图像(下图中的b),我们可以恢复出清晰的图像(下图中的x)。


盲区卷积python 盲去卷积复原_后验概率_02


很多人都觉得去卷积大法好啊,真的可以把渣画质变清晰。可就是需要提前知道PSF,这可就难了。确实,很多情况下提前测定PSF是根本不可能的,有可能你手上只拿到了一张很模糊的照片b,不知道c,想要恢复出x,这时候应该怎么办呢?


盲区卷积python 盲去卷积复原_盲区卷积python_03


事实上,这也是可以办到的,这就是所谓的“盲去卷积”(Blind Deconvolution),今天我就给大家介绍这种技术。

我们先来看两组盲去卷积的结果,给大家一些直观的感受:


盲区卷积python 盲去卷积复原_卷积核_04


盲区卷积python 盲去卷积复原_卷积核_05


上面的结果来自于盲去卷积领域非常经典而基础的文章:

Fergus et al., “Removing camera shake from a single image,” SIGGRAPH 2006.

今天我主要就为你介绍这篇文章的思想

一、盲去卷积的基本思想

1.1 利用先验信息

小明是第一次用单反的摄影小白,他刚刚很兴奋的端起相机拍了一张照片:


盲区卷积python 盲去卷积复原_blur失焦方法会触发两次_06

https://www.zhihu.com/video/1208905929737273344


Oops!手没拿稳,拍出了一张超模糊的照片:


盲区卷积python 盲去卷积复原_卷积核_07


我们看看小明的相机在拍照瞬间的运动轨迹


盲区卷积python 盲去卷积复原_盲区卷积python_08


很显然,他这样是拍不出来好片子的,我们来简化一下他这张照片的生成过程:


盲区卷积python 盲去卷积复原_盲区卷积python_09


上图中的模糊核(PSF)是由于小明端起相机时的随机抖动导致的,我们无法提前测定,那么怎么样才能把清晰图像恢复出来呢? 这真是一个超难的问题。

这就像你知道了11这个数是由2个数的乘积构成的,要让你猜出是哪两个数一样困难:


盲区卷积python 盲去卷积复原_blur失焦方法会触发两次_10


一张模糊的图像,也有可能有多种生成模式,只有最下面这种才是我们需要的,怎么才能得到它呢?


盲区卷积python 盲去卷积复原_blur失焦方法会触发两次_11


很显然,我们需要利用一些先验信息。有两个关键的先验信息可以帮助我们

1 - 图像的梯度分布

清晰的自然图像的梯度符合一种叫做"Heavy-Tail"的分布形态。直观上讲,一张清晰图像里面有很多平滑的区域且噪声较低,所以梯度接近0的像素还是占大多数。但是由于图像清晰,所以物体的边界比较明显,所以还是有很多像素的梯度较大。因此这种梯度的分布大概长这个样子(梯度直方图的纵坐标是Log化的密度):


盲区卷积python 盲去卷积复原_blur失焦方法会触发两次_12


但是模糊的图像的边缘被糊掉了,所以更多的像素的梯度趋于0,因此其梯度直方图就会变化:


盲区卷积python 盲去卷积复原_盲区卷积python_13


所以我们想要寻找的是符合上面重尾分布的图像,而不是其他随随便便的图像

2 - 模糊核的形态

我们这里展示的是相机的运动导致的模糊,那么可以认为模糊核是稀疏的,有连续的轨迹,并且模糊核值都是非负数。所以我们重建出来的模糊核也不是随随便便的,它必须符合上述这些特点才是一个合格的运动模糊核。

3 - 噪声

相机总是有噪声的,为了简化问题,我们可以假设噪声是均值为0的高斯噪声

于是,我们就有了几种信息用于重建清晰的图像


盲区卷积python 盲去卷积复原_卷积_14


1.2 问题的数学建模

已知模糊图像P,未知图像为L,未知的卷积核为K。一个基本的想法是把问题看做是求最大后验概率的问题:


盲区卷积python 盲去卷积复原_blur失焦方法会触发两次_15


其中K和L满足一定的先验条件的约束。我们所需的就是把后验概率公式表达出来。为了让这篇文章能够比较容易看懂,我把相关的细节列到文章的后面,这样你可以更连贯的阅读这篇文章。

1.3 问题的求解

作者尝试了用标准的MAP求解方法来求解出K和L,但最终效果却很差


盲区卷积python 盲去卷积复原_盲区卷积python_16


作者对此的解释是MAP目标函数会尝试让所有像素的梯度都最小化,而实际的自然图像中包含有大量高梯度的区域。

而在2009年的下面这篇著名论文中,作者Levin教授则提出了更深入的见解。

Levin et al., “Understanding and evaluating blind deconvolution algorithms,” CVPR 2009 and PAMI 2011

Levin教授认为用MAP目标函数同时求解K和L肯定不好,有如下的原因:

  1. 错误的单位卷积核比起正确的稀疏卷积核的可能性更高(Levin的论文中有证明)


盲区卷积python 盲去卷积复原_卷积_17


2. 上述MAP目标函数的变量个数具有高度的非对称性,比如对于这幅毕加索照片:


盲区卷积python 盲去卷积复原_后验概率_18


可见已知量的个数总是小于未知量的个数 #P < #L + #K

以上两个原因就会导致用这种同时估计K和L的目标函数来做MAP总是无法得到好的结果。那有没有更好的方法呢?

Levin认为,更好的办法是只单独估计K,即把下面左边的问题转换为右边的问题


盲区卷积python 盲去卷积复原_盲区卷积python_19


这样,已知量的个数就远远大于未知量的个数 #P >> #K

这里的p(K|P)是相对于L的边际概率,即:


盲区卷积python 盲去卷积复原_后验概率_20


简单来说,就是对每一个可能的K,我们都要在所有可能的L上求取其后验概率,并把这些后验概率值加起来,得到p(K|P)。你应该可以感觉到求这样的边际概率也是很不容易的事情,计算量非常复杂。于是很多学者采用了近似的方式来进行求解。回到我们开头介绍的Fergus的论文,作者是采用了“变分贝叶斯(variational Bayesian)”方法来近似后验概率的表示和求取

Fergus证明了这种方法能得到远比原始的同时求取K和L的MAP算法好。


盲区卷积python 盲去卷积复原_blur失焦方法会触发两次_21


二、完整的流程

在论文中, Fergus展示了其完整的盲去卷积的流程:

第一步:预处理图像,为了降低计算量,并得到良好的结果,需要用户来选择一个图像块。

第二步:利用变分贝叶斯,估计卷积核K。为了避免陷入局部最优,作者采用了coarse-to-fine的策略

第三步:利用标准的非盲去卷积方法,重建清晰图像L。作者采用了我在上一篇文章里面提到的Richardson-Lucy算法进行。


盲区卷积python 盲去卷积复原_后验概率_22


盲区卷积python 盲去卷积复原_blur失焦方法会触发两次_23


盲区卷积python 盲去卷积复原_后验概率_24


盲区卷积python 盲去卷积复原_卷积_25


盲区卷积python 盲去卷积复原_盲区卷积python_26


三、效果展示


盲区卷积python 盲去卷积复原_后验概率_27


盲区卷积python 盲去卷积复原_卷积_28


盲区卷积python 盲去卷积复原_后验概率_29


四、后验概率的细节

正如前面所讲,为了求解问题,需要把后验概率用公式表达出来。先引入一些符号来说明问题:

  • 模糊图像块
  • :可能的模糊核
  • :可能的清晰图像块
  • : P的梯度
  • : Lp的梯度
  • :噪声

首先,我们前面讲过



由于卷积运算是线性运算,因此可以有:



这样我们可以把后验概率改写为



用MAP的思想来说,问题就转换为求使得上述概率最大的K和



我们可以用贝叶斯公式将这个后验概率展开:


盲区卷积python 盲去卷积复原_后验概率_30


我们分别来看后面三项:


盲区卷积python 盲去卷积复原_blur失焦方法会触发两次_31


于是上面的后验概率就可表示为:


盲区卷积python 盲去卷积复原_盲区卷积python_32


五、算法值得改进的地方

在文章中Fergus提到的几个点都是值得改进的:

  1. 假设噪声满足高斯分布
  2. 用混合高斯模型来拟合重尾模型
  3. 用混合指数分布来描述模糊核的形态
  4. 多尺度的变分贝叶斯算法复杂度较高,需要用户的手动引导选择小的图像块
  5. 采用的非盲去卷积是RL算法,相信会有更好的方法来改善图像质量
  6. 等等

作者本身也在其文章中提到了一些值得改进的地方,能让后人在此基础上对 这项工作有所完。 果不其然,在随后几年的CVPR, SIGGRAPH, ICCV, ECCV上, 几乎每届都有更好的结果涌现。

比如下面这篇2008年Jiaya Jia团队的文章就作出了非常好的效果:

Shan et al., “High-quality Motion Deblurring from a Single Image,” SIGGRAPH 2008

文章的改善点包括了:

  1. 更复杂的噪声模型,噪声的概率分布由其0阶、1阶、2阶梯度的分布来描述
  2. 更简单的拟合重尾分布的函数
  3. 加入了局部平滑区域的约束,避免出现振铃效应
  4. 复杂的优化方法,交替式的优化估计清晰图像L和模糊核K

下面是算法的效果,还是非常不错的:


盲区卷积python 盲去卷积复原_卷积_33


这个领域后面出了非常多效果更好的文章,在github上有一个专门的项目整理记录:

https://github.com/subeeshvasu/Awesome-Deblurringgithub.com


六、总结

去卷积分为非盲去卷积和盲去卷积,我介绍的用途主要是图像的去模糊。今天介绍的Fergus的文章利用了变分贝叶斯算法来求解模糊核K,然后利用经典的非盲去卷积算法Richardson-Lucy算法来进行清晰图像的恢复。从今天介绍的文章你可以看到,理解盲去卷积的算法对图像的统计信息、概率知识、最优化求解方法的要求要比非盲去卷积高很多。坦率说,我自己在看这些文章时也感觉很吃力。

但我希望这篇文章能给你打开一扇大门,让你可以透过它看到一片新的研究天地。如果你喜欢这篇文章,请给我点赞,谢谢!

七、参考资料

  1. CMU 2017 Fall Computational Photography Course 15-463, Lecture 17
  2. Fergus et al., “Removing camera shake from a single image,” SIGGRAPH 2006.
  3. Levin et al., “Understanding and evaluating blind deconvolution algorithms,” CVPR 2009 and PAMI 2011.
  4. Shah et al., “High-quality Motion Deblurring from a Single Image,” SIGGRAPH 2008
  5. https://github.com/subeeshvasu/Awesome-Deblurring
  6. 图像去模糊之初探–Single Image Motion Deblurring