0%

Poisson Image Editing 图像融合经典文献阅读

Poisson Image Editing 图像融合/图像无缝编辑经典文献阅读

想不想把自己的头P到别人的图片中?

想不想把别人图片里的彩虹放进自己拍的风景照中?

想不想自己修掉脸上的皱纹?

掌握图像融合技术,以上的一切图像编辑任务都可以轻松完成。

fig1

(图片来自论文)

如图所示,利用图像融合技术,可以把一幅图片的部分区域复制到一幅图片(可以是同一幅图片)上,并且让复制过去的图片块保持之前的色彩风格。因此,这种技术有时可以叫做图像无缝复制(image seamless cloning)

论文整体结构

该论文介绍了一种图像编辑的方法,其主要作用是图像边缘的无缝拼合。该方法可以应用到图像融合和图像风格变换等任务中。论文的结构如下:

fig2

从结构图可以看出,这种方法的输入是待修改图像、待修改区域及待修改区域的目标梯度,输出是编辑后的图像。基于该图像编辑方法,能产生各式各样的图像融合结果,产生不同结果的方法是修改输入中目标梯度的获取方法。

具体介绍一下这种图像融合方法。这种方法的思想是让图像编辑后的梯度域尽可能和源图像(图像编辑是从源图像复制一块到目标图像)一样,并且编辑区域边缘的梯度值和目标图像一样。图像的梯度可以理解为图像相邻像素的变化量。有研究指出,比起绝对的像素值,人眼对梯度值更敏感,因此维持编辑区域内部梯度不变,边界和目标图像“接轨”能让图像融合的质量更高。梯度值尽可能不变,就是让图像编辑前后梯度域的差值尽可能小,问题就变成了一个纯数学问题。通过相关的数学工具,可以求解出编辑后的图像来。

论文细节

优化目标的建模与求解

该论文方法的核心是建立了梯度域的优化目标后,如何用数学方法对这个问题求解。

首先,稍微介绍一下这个优化问题是如何建模的。输入图像、输出图像都可以看成一个定义域在平面上的一个函数。对输出图像的求解即对一个未知函数的求解。求解未知函数,涉及泛函的知识,需要用到欧拉-拉格朗日方程,有一篇非常好的博客[2]介绍了有关的数学知识。

有了对问题的建模后,论文直接给出化简后的待求解方程。该方程是一个泊松方程,即与函数二阶导数相关的偏微分方程。对该方程求解,即可得到最终的图像。

图像的数值都是离散的,对一个图像的求解,最终可以转化成对该图像每个像素值的求解,即求解一个多元方程。此问题中,该方程是一个线性方程。利用求解多元线性方程的方法即可解出此问题。

事实上,该问题的建模和求解中涉及了很多数学定义,这些数学的细节是否理解对整篇文章的理解、方法的创新不是十分重要。对于一个研究计算机技术的人来说,优化目标的设定才是最重要的。

利用方法产生不同的编辑效果

论文的所有图像效果都是基于同一种方法。也就是说,只要理解了最基本的把一幅图片无缝融合进另一幅图片的原理,其他图像编辑效果都可以通过同样的原理推导而来。

如果把源图像的待修改区域的梯度做为目标梯度直接输入进方法,由于图像边缘梯度和目标图像一样,内部和源图像一样,复制过去的图像可以无缝地对接到目标图像上。利用该图像融合方法,可以实现“图像隐藏”:比如把脸上没有皱纹的地方复制到有皱纹的地方,达到去皱纹效果。

只用源图像的梯度,而忽视目标图像待修改区域的梯度,则会完全抛弃待修改区域原来的信息。在复制一些半透明的图像(如彩虹)时,如果抛弃掉目标图像待修改区域本身的性质,就会产生很差的效果。论文中提出,可以把源图像梯度和目标梯度的较大值做为方法的目标梯度,这样经过图像编辑后图像的待修改区域能融合两幅图像的性质。

通过上述例子,可以得知目标区域的梯度是如何决定图像编辑效果的。对目标区域的梯度进行一些“魔改”,就能得到不同的结果,比如结构图中提到的扁平化、光照修改和地砖无缝拼接等。

论文实现

理论上,我会对论文进行实现。以后我会更新此文,加入实现的代码仓库链接。

其实随便一搜就能找到很多该论文的实现,毕竟这篇论文是图像融合的一个非常经典的方法。很多matlab代码技术性较弱,很多东西都写好了,因此我附上了一个该论文的C++实现[3]。当然,用C++的话也要调用不少库函数,最烦人的线性方程组求解是必须得调一下库的。

总结

本文对论文“Poisson Image Editing”进行了一个简要介绍,其本意是通过总结论文大意来加深我自己对论文的认识,并且方便之后对其他图像融合领域的对比阅读。

当然,这篇文章对读者来说也有一定可读性。本文并没有对原文进行死板的翻译,而是从整体到局部,大致介绍了论文中的主要内容。对于只是想浏览该文章的读者,可以学到一种新的P图方法,图一乐;对于在精读论文之前看到这篇文章的读者,可以大致知晓文章是在讲什么,解决什么问题,用了什么方法,产生什么结果;对于读完论文之后的读者,可以把这篇文章和自己的收获进行对比,看看哪些内容是读到了的,哪些内容文章没有提到,甚至哪些地方写错了,写得不够好,以加深自己对论文的理解。当然了,如果你觉得我讲的你都读到了,你也可以写出一样的东西,那说明你是个高手,学得很不错,毕竟想要掌握我这种概述能力是十分困难的。

参考资料

[1] Pérez P, Gangnet M, Blake A. Poisson image editing[M]//ACM SIGGRAPH 2003 Papers. 2003: 313-318.

[2] https://www.cnblogs.com/bigmonkey/p/9519387.html

[3] https://github.com/cheind/poisson-image-editing


2023.4 更新:
最近在重新温习Poison Image Editing,看了看自己以前写的文章,发现这篇文章写得一塌糊涂。写得这么简单,谁看得懂啊?或许我当时为了便于理解,没有在文章里用数学符号。但这文章也写得太不清楚了吧。我现在来稍微重新总结一下这个方法。

泊松图像编辑要解决的基本问题是图像融合:输入源图像、源图像上的编辑区域、目标图像、目标图像上的编辑区域,我们想把源图像的编辑区域「贴」到目标图像的编辑区域上。相比于最朴素的复制粘贴,我们希望图像贴过去后看起来没有那么突兀,就像文章展示出来的一些融合结果一样。

作者把这种图像融合看成了一个优化问题:在编辑区域边界处的像素值应该保持不变(保持原来目标图像在此处的像素值)的前提下,令编辑区域内部的梯度值与源图像该处的梯度值尽可能相似。求解这个优化问题,就能得到编辑区域内的像素值。

归根结底,泊松图像编辑的输入是一幅目标图像、一个梯度值、一个编辑区域。图像融合只是应用之一。通过修改输入的来源,可以完成多种任务。

泊松图像编辑的原理就是这么简单。更详细的介绍在那篇代码实现的博文里有介绍。

这篇文章确实是一篇实实在在的「博文」:只有我自己能看懂,别人都看不太懂。可见,我当时的描述能力比现在差远了。反过来说,没过几年,我的描述水平就大有提升。这真是太可怕了。