2017-12-30-003-泊松融合及其优化算法

2017-12-30-003-泊松融合及其优化算法

图像融合,就是把不同的图像的不同部分放在一起,形成一张新的图像。融合得越自然,算法就越好。想到融合,最简单的算法就是在融合边界把两张图像的透明度线性相加(Alpha图像融合),形成一张新的图像,比如这幅著名的苹果橘子图:

图像的Alpha融合

泊松融合是图像处理领域非常著名的图像融合算法,自从2003年在论文 Poisson Image Editing 中提出以后,取得了极大的成功,并且在此基础上进行许多改进的研究。


关于泊松融合的相关知识网络上面有很多的资源可以参考,也可以查看 论文 或者书籍 Computer Version for Visual Effects(这本书非常棒,一生推,可以下载PDF并且YouTube有作者的相关课程视频,作者讲课也非常好)中的相关章节,本文主要介绍泊松融合算法的优化。


泊松融合的本质是求解线性方程组,其算法复杂度为O( N),其中:N为融合区域的像素点个数。虽然求解线性方程组的优化方法有很多(牛顿迭代法、高斯-赛德尔迭代法、雅克比迭代法,梯度下降法,共轭梯度法等)但是放在图像融合这个大背景之下,便需要具体问题具体分析。因此,许多图像处理领域的大牛学者又提出了许多泊松融合的加速算法,下面按照时间顺序为大家介绍。


一、基于四叉树的加速

算法示意图


该算法是Adobe公司的图像处理大牛 Aseem Agarwala 在2007年的SIGGRAPH上提出的泊松融合的加速算法,并运用到当时的 PhotoShop 软件之中,论文名称为:Efficient Gradient-Domain Compositing Using Quadtrees


算法的复杂度:O( \sqrt{n} ),其中n为融合区域的像素点的个数。


该方法的核心是通过减少最终线性方程组中未知数的个数提高泊松融合的效率。下面首先简介一下什么是四叉树分解:


1、四叉树分解示意图:

四叉树分解示意图


2、四叉树分解后,如何操作?

决定参与构成最终线性方程组的像素点。

四叉树分解结果示意图

①:只有为十字交叉处的点参与运算;

②:丁字路处的交点不参与运算;

③:其余线路上的点都不参与运算;


3、空白之处的像素点不参与运算,如何获得如何后的灰度值取值?

使用插值算法获得空白处的像素点的灰度值(插值算法比求解线性方程组来说效率要高很多)


上面只列出了论文的核心思想,细节问题可详细阅读论文。


论文主页:Efficient Gradient-Domain Compositing Using Quadtrees

论文开源实现(非作者):xin-xinhanggao/efficient_quadtree


二、基于MVC的泊松融合加速


算法示意图


该方法是 Zeev Farbman 在2009年的SIGGRAPH上面提出的基于Mean-Value Coordinates方法的泊松融合加速算法,论文名称:Coordinates for Instant Image Cloning


这个论文论点是:将泊松方程转换成拉普拉斯方程,然后再用Mean-Value Coordinates近似求解。整个问题就变成了插值问题,问题复杂度变成了O(m),其中,m是要粘贴图像外轮廓的像素数,并且一般情况下都有m << n(融合区域像素点个数)。算法极其简单,完全可以实时的交互运行。具体细节可以阅读原文查看。


论文主页:cs.huji.ac.il/~danix/mv

开源代码实现:github.com/jelinson/MVC

开源代码实现:github.com/pablospe/MVC



三、基于卷积金字塔的泊松融合加速

算法示意图


基于卷积金字塔的加速算法与基于MVC泊松融合加速算法的作者都是 Zeev Farbman(大牛佩服膜拜),该算法是其在SIGGRAPH Asia 2011上发表的论文 Convolution Pyramids 中提出的。并且基于卷积金字塔的算法除了应用于泊松图像融合加速之外,还可以用于梯度域集成、离散数据插值等方面。


论文的主页(包括官方代码):cs.huji.ac.il/labs/cgla


如果您有发现比以上几种算法更快的泊松融合加速算法,欢迎留言或者私信告诉我,感激不尽!

PS:如果您在阅读的过程中,发现了文章中的错误,欢迎留言或者私信指出。谢谢啦!

编辑于 2017-12-31

文章被以下专栏收录