本文同步发表在我的微信公众号“计算摄影学”,欢迎扫码关注

【转载请注明来源和作者】

我们终于进入了新的篇章。这一次我来给大家介绍一下图像合成与融合

我们经常看到一些很奇妙的PS技术,例如下面这张,它把1928年的一位叫做Frankie Yale的黑帮老大被杀时的照片,与现在这栋房子的照片无缝融合在一起:

还有这张,将1945年柏林街道的照片和2010年的照片无缝的融合到一起

给天空加上彩虹,这是咱们很多时候后期处理相片时常见的手段:

改变花朵的颜色

交换水果的纹理外观:

还有更妙的,在1994年上映的阿甘正传里面,汤姆汉克斯和肯尼迪总统同框出镜,即使是在大荧幕上也是毫无违和感。

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

不得不说,图像合成和融合真是一个很神奇的技术。因此我准备用好几篇文章对此做一些详细的介绍。下图是提纲,这一篇文章会介绍三个技术:cut-and-paste, alpha blending, multiand blending

一、直接剪切粘贴技术(cut-and-paste)

在所有相关技术中,最直观简单就是cut-and-paste了,经常在摄影师后期制作中所采用,如果使用得当,它也可以创作出令人满意的效果。

例如,下面照片如何制作出来?

其实它是由两张照片中不同的部分按一定顺序叠加而成的,大家可以看看下面的源图像:

只要我们先放上左图的背景,再叠加比尔盖茨的人像,最后再叠加左图的前景,就可以合成出最终的图像。

从图像中确定前景和背景的技术叫做抠图,英文对应:Image Matting,而将抠出的部分无缝的贴入目标图像的过程则称为图像合成,英文对应:Image Compositing. 为了技术术语的准确性,我这里引用《Computer Vision: Algorithms and Applications》的原文如下:

The process of extracting the object from the original image is often called matting (Smith and Blinn 1996), while the process of inserting it into another image (without visible artifacts) is called compositing (Porter and Duff 1984; Blinn 1994a).

Cut-and-paste技术如果应用得当,可以产生相当有艺术感的图像,如下图,这应该是在原始的人物和狗狗身上粘贴了很多纹理图像形成的。

但很多时候,这个简单的技术只会产生让人沮丧的结果,例如下面的图像中想要粘贴进去两只企鹅,就真的是5毛钱的特效了。

既然剪切粘贴过于粗暴,生成的照片不够自然,有没有更好的方法呢?接下来我们就谈谈一种更好的方法:Alpha Blending

二、Alpha融合

Alpha融合是一个升级版的cut-and-paste,如果表示为公式的话是这个样子:

output = foreground * mask + background * (1-mask)

由于上面使用的Mask是二值的,因此融合的图像很不自然,大家从融合生成的图像也可以看出

如果对Mask图做稍稍的羽化,效果就会好很多,见下图。对Mask图做羽化的方法有很多,最直接的方法就是对其做一定尺度的高斯滤波,我在基本图像滤波中已经讲过了。

因此Alpha融合的效果好坏取决我们如何正确的设置Alpha Mask,如果要把一张图中的一部分抠出,并融合到另外一张新的图片中,主要牵涉到两个步骤:

  1. 准确的抠图获取Alpha Mask
  2. 对Alpha Mask做合适的羽化,使得融合更自然

准确的计算Alpha Mask很多时候都是一件复杂的事情,我们下面看一个稍微复杂的例子。 有时候我们希望将两张照片重叠到一起生成一张照片,例如下面两张照片:

怎么融合它们呢?有很多人想出了一些聪明的方法。现在介绍一种:

第1步:生成两张图像的distance transform图

这个distance tranform图中的每个像素值都表示原图中对应的像素与其最近的黑色像素(zero pixels)的距离。如果你使用OpenCV的话,可以用distanceTransform函数来做到,如果是Matlab,则是bwdist函数。

第2步:计算Mask

接下来采用Alpha融合方式,可以得到最终的照片如下。你可以看到两张照片已经比较好的融合到了一起,当然还可以看出一些细微的不自然处。

三、多频段融合

要想让Alpha融合结果显得自然,很关键的一点是选择合适的融合窗口大小。我用下面的实例来说明这个问题。

让我们把以下两张照片融合到一起。

如果选择图像中中轴线作为融合后两个图像的分界线,那么融合过程可以表示为:

这其实也是一种Alpha融合,实际上上面的过程就是:

leftImageWeight * leftImage + rightImageWeight * rightImage = OutputImage

其中:

leftImageWeight + rightImageWeight = 1

因此最终图像的表现取决于两张图片的有效像素的重叠区域。 那么问题来了,这个重叠区域到底选择多大呢?我以下图来说明不同窗口大小的影响:

有一个经验判断准则是:

  • 融合窗口大小要相当于输出图像中最大的显著特征的大小,从频谱上看生成的图像所包含频率个数应该是2的幂
  • 融合窗口大小要小于2倍最小显著特征的大小,从输出图像的频谱上看最大频率<=2*最小频率

然而大家都知道,自然图像通常包含了很多不同的特征,频谱跨度也很大,此时选择融合窗口就会非常困难,有没有更好的方法呢? 这就引入了一种新的融合方法:多频段融合。下图说明了这个思想:

因此总结其流程就是:

  1. 对要融合的两张照片,构建拉普拉斯金字塔
  2. 对金字塔的每一层,应用以下公式进行融合

3. 利用融合后的金字塔重建出输出图像

我们来看一个著名的例子,一个苹果和一个橘子如何通过中线融合到一起

利用上面的流程,我们来看看金字塔各层融合的情况:

OK,因此如果重建出原始图像可以看到,我们这里讲的多频段融合,即拉普拉斯金字塔融合,实际上是在半自动的计算最佳的融合窗口和权重大小,其本质上还是一种线性融合:

在《Computer Vision: Algorithms and Applications》一书中还有很多有趣的例子,例如:

在实际实现过程中,为了节省计算量,可以考虑只用两层金字塔来融合:

这在需要融合多张图像时非常有用,例如下面我们需要将多张照片融合成一幅全景图像:

这里我只是简单的把多张经过裁剪的照片摆放在一起,还没有经过融合。

如果进行了两层金字塔融合,我们可以分别对低频信号和高频信号进行融合,所得到的图像如下:

从这两层图像我们可以重建出最终的图像:

由于两层金字塔融合,甚至多层金字塔融合同时考虑到了图像中的不同频率的信息,因此通常融合出来的效果相比单层的Alpha融合(线性融合)更好。 就以上面的融合图像来比较一下图像的局部,大家可以看到金字塔融合的内容更清晰:

四、总结

我们在一开篇看到了很多图像融合的实例,我希望它们已经成功的吸引了你的注意。而今天给大家介绍了图像合成和融合的几个基本的方法,包括cut-and-paste,alpha融合,以及多频段融合。它们基本上都可以归纳为图像之间的线性融合,其中多频段融合是一种多层的线性融合。 我下一讲将要讲到一种效果非常好的融合方式:泊松融合

我在如下的Jupyter Notebook中展示了本帖中的相关操作,你可以对着它获取更深入的理解,也能够进一步掌握用Python来进行图像处理的一些技巧。

https://nbviewer.jupyter.org/github/yourwanghao/CMUComputationalPhotography/blob/master/class11/Notebook11.ipynb

跟这一系列专题文章相关的Notebook可以从https://github.com/yourwanghao/CMUComputationalPhotography.git获取

参考资料:

这一篇文章的绝大部分素材来自于

[1] CMU 2017 Fall Computational Photography Course 15-463, Lecture 7

[2] Richard Szeliski, Computer Vision : Algorithms and Applications,

matlab两张图片合成一张_11. 图像合成与图像融合相关推荐

  1. matlab两张图片合成一张_两张图片合成一幅画意作品的简单方法

    在<教你制作一幅画意摄影作品>的文章中,介绍了Snapseed(指划修图)和ToolWiz Photos(理理相册)两个App中用手机或平板制作画意摄影作品的基本方法,现在再来进一步试试用 ...

  2. matlab两张图片合成一张_二次曝光合成手机照片剪影照并不难,这样用snapseed轻松实现...

    相信很多摄友一定在明信片或者是海报中看到过类似这种效果的照片: 剪影的轮廓配合着前景,让画面的意境美提升了一个层次.但如果想做出这种效果,往往需要使用专业的后期软件,比如Photoshop才可以实现. ...

  3. matlab两张图片合成一张_如何将多幅图合并在一起变成一张大图

    在一个文件夹中有上百张图片,每次一张一张的看比较累,在matlab中有没有代码可以一次看多张图的程序或者可以将图片合并成大图比如4*4张合并为一张.我用了 subplot但效果不很好.[code] c ...

  4. python将大量图片拼接千面图_11. 图像合成与图像融合

    本文同步发表在我的微信公众号"计算摄影学",欢迎扫码关注 [转载请注明来源和作者] 我们终于进入了新的篇章.这一次我来给大家介绍一下图像合成与融合. 我们经常看到一些很奇妙的PS技 ...

  5. 微信小程序之实现两张图片合成一张并保存到相册

    不喜欢看废话的小伙伴,可以直接看图片下面的文字和注意事项 实现是没问题的. 应用场景: 项目中,每个用户都会生成自己专属的小程序码,当用户扫描这个小程序码的时候,默认这个用户就会成为你的好友,,嗯,举 ...

  6. vue两张图片合成一张(海报二维码合成工具)

    公司要经常换海报,一个海报要不同的二维码,做一个工具解决一下. 效果图如下 二维码图片的位置和海报大小可以随意调整 直接放代码: <template><div class=" ...

  7. 两张图片合成一张_利用溶图技巧把多张图片合成一张奇幻风格图片教程

    感谢(P大点S / 墨鱼排骨汤)的分享! 效果图: 素材打包:http://www.16xx8.com/photoshop/sucai/2017/b208458.html 首先创建画布. 置入图片. ...

  8. PIL实现两张图片合成一张,和图片加文字

    PIL实现两张图片合成一张,和图片加文字 文章目录: 一.PIL实现两张图片合成一张 1.方法一: 2.方法二 二.图片添加文字 首先说明一下: (小姐姐是谁,是my sweetheart ,请勿使用 ...

  9. 什么相片可以两张弄成一张_怎么将两张图片合成一张?

    有时候我们需要将两张图片放在一起相比较,但是两张图片相互切换对比起来比较困难,有没有什么办法将两张图片合成一张?方法是肯定有的,而且还是多种多样的,本文就给大家介绍一种对普通用户来说最简单方便快捷的方 ...

最新文章

  1. 虚拟机下运行linux通过nat模式与主机通信、与外网连接
  2. 多进程与多线程的区别 - jihite
  3. Istio流量管理实践之(3): 基于Istio实现流量对比分析
  4. SQL语句增加字段、修改字段、修改类型、修改默认值
  5. eclipse中设置svn的commit快捷键
  6. 站长快讯 WordPress跨站攻击漏洞修补
  7. Linux select/poll机制原理分析
  8. 突发!ARM中国区执行董事长兼CEO被免职
  9. java中打开eclipse_关于Java:如何在Eclipse中打开jar文件
  10. 同路光芒 一亿光年同路光芒战略合作签约仪式圆满成功
  11. iphone查看python文件_通过python获取苹果手机备份文件中的照片,视频等信息采集...
  12. X(解释变量)增加一单位标准差,Y(被解释变量)增加多少标准差?
  13. 游戏出海欧洲有哪些可以接入的支付渠道
  14. 实时语音趣味变声,大叔变声“妙音娘子”Get一下
  15. opencv-图像处理1 图像基本操作
  16. 单细胞 CUTTag 分析复杂组织中的组蛋白修饰和转录因子
  17. 模拟角频率和数字角频率
  18. 二维数组(矩阵)顺时针旋转90°
  19. JS高程 Chp.20 JSON 思维导图
  20. flink-cdc 基础教程 附报错解决 2万字 (一)

热门文章

  1. iptables nat实验_【零基础学云计算】LVS负载均衡群集之NAT模式搭建 (实践篇)...
  2. Codeforces Round #734 (Div. 3) (A-D1)
  3. java netbeans 教程_NetBeans 教程
  4. 前端vue适配不同的分辨率_前端面试时,被问到项目中的难点有哪些?
  5. matlab程序聚类预测机器学习
  6. php鼠标悬停显示图片,鼠标滑过出现预览的大图提示效果
  7. python科学计算三剑客_1-python数据分析-数据分析介绍、数据分析三剑客之NumPy
  8. 【转】你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问
  9. 【转】如何将域中的AD数据导入SharePoint
  10. 一步步编写操作系统 65 标准调用约定stdcall 汇编实战