matlab两张图片合成一张_11. 图像合成与图像融合

8376c46196cafa37e777e3fce6df8ede.png

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

962e1e4c19987fb84dfbea0c06617769.png

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

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

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

63ff5b1760b124500bd0bf0c1a665a79.png

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

c08b3f4a418c2fa0055bd6288089ffa0.png

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

b00ae43e3d878bda9a75368e27bc1a79.png

改变花朵的颜色

27e14af9ede8853bb9f7ac9bb34e5055.png

交换水果的纹理外观:

46aac89fa98c7c526723a33f94f62292.png

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

93ffb36be0d01939b6207c79b3b74148.png
https://www.zhihu.com/video/1087501356620656640

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

10920ffaa318616458869073fd2394f4.png

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

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

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

32daf605234f6e10993386bf7dbdc938.png

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

7d07ef69c2b917c99a964c1204531ca6.png

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

从图像中确定前景和背景的技术叫做抠图,英文对应: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技术如果应用得当,可以产生相当有艺术感的图像,如下图,这应该是在原始的人物和狗狗身上粘贴了很多纹理图像形成的。

9a4d4fd3d1e565a17886e411232eebe4.png

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

fee7d0bff8d0ebe0a4298008bd3474bb.png

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

二、Alpha融合

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

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

ebed83765de9f89a1f6b13f1984798d4.png

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

a6c5ce24d28be9f58289f426358b62e9.png

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

f15628f94867b807cc2a1861871b03e3.png

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

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

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

64120dcd95a69046205d3339cdca51a9.png

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

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

1ee759aa778ee5fa09e0210d5fd49b56.png

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

第2步:计算Mask

19e0058fd6c62c60f51f85c023a9a8b3.png

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

758670543cf1dc457db81af603ad41a2.png

三、多频段融合

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

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

a481c8442ca73debdc3861364431e7a3.png

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

c24109508c28e03aeded461d89609f33.png

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

leftImageWeight * leftImage + rightImageWeight * rightImage = OutputImage

其中:

leftImageWeight + rightImageWeight = 1

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

f4aa07c4ddc2de2da3eb2fbf716bcf31.png

有一个经验判断准则是:

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

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

1663540f11f84d32c202ba128bea2f35.png

因此总结其流程就是:

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

90cd6d6a6e646c8d61ec0c171fbb645a.png

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

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

8394342bbdee24b288a46dae7d19c151.png

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

4df8e45d8bfe8799fee2517469b3bfd2.png

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

e0605cdb66e7a08c40c4d9183fa2907f.png

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

15d4752b43a9700b1abb92de1d0de0f7.png

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

d61feded367a93929af6262cc2d2bf4c.png

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

ad98d0412ab8ba9b1843e503f318d31e.png

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

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

c40f70777e750341d5046254b144f4f9.png

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

2456efe8f268cd0fea769c4898ebde4c.png

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

b384bf19694aed62a607e60ddd22a899.png

四、总结

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

c862f6a615231207bdd95938a78a807a.png

我在如下的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,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/442060.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

于小c三国语言_云顶之弈:三国成最强打工羁绊 校长教学顺滑转九五

虎牙校长是九五阵容的专业户&#xff0c;虽然版本在不断地更新&#xff0c;云顶的整体走向也在不断地发生变化&#xff0c;但九五至尊的强度一直都是TOP0级别&#xff0c;一旦成型第四保底&#xff0c;吃鸡都变得轻而易举。而整套九五的运营关键在于如何连胜、保证自身血量健康…

java null转换jason_常见java问题及解决办法汇总(干货可收藏)

Java Exception&#xff1a;1、Error2、Runtime Exception 运行时异常3、Exception4、throw 用户自定义异常异常类分两大类型&#xff1a;Error类代表了编译和系统的错误&#xff0c;不允许捕获&#xff1b;Exception类代表了标准Java库方法所激发的异常。Exception类还包含运行…

【HDU - 3038】How Many Answers Are Wrong (带权并查集--权为区间和)

题干&#xff1a;&#xff08;&#xff09; TT and FF are ... friends. Uh... very very good friends -________-b FF is a bad boy, he is always wooing TT to play the following game with him. This is a very humdrum game. To begin with, TT should write down a s…

drop sqlite 多个表_SQLite简介与安装

SQLite简介&#xff1a;SQLite是一款轻型的数据库&#xff0c;是遵守ACID的关系型数据库管理系统&#xff0c;它包含在一个相对小的C库中&#xff0c;实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。就像其他数据库&#xff0c;SQLite 引擎不是一个独立的进…

【CF566#D】 Restructuring Company (并查集---合并区间操作)

题干&#xff1a; Even the most successful company can go through a crisis period when you have to make a hard decision — to restructure, discard and merge departments, fire employees and do other unpleasant stuff. Lets consider the following model of a c…

dg oracle 切换模式_谈谈dg切换涉及的概念:switchover和failover区别

概述今天有朋友问了一个问题&#xff1a;switchover和failover之间的区别&#xff0c;有点懵逼&#xff0c;居然把这忘记了&#xff0c;这里总结下两者之间的一些区别。DG架构DG切换时注意点&#xff1a;1、确认主库和从库间网络连接通畅&#xff1b;2、确认没有活动的会话连接…

gis影像格式img转为ecw_医学影像图片格式

&#xff08;1&#xff09;Analyze格式&#xff1a;Analyze格式储存的每组数据组包含2个文件&#xff0c;一个为数据文件&#xff0c;其扩展名为.img&#xff0c;包含二进制的图像资料&#xff1b;另外一个为头文件&#xff0c;扩展名为.hdr&#xff0c;包含图像的元数据。&…

case when then else多个条件_sqlserver条件分支case when使用教程

在sqlserver的条件分支case when有两种写法&#xff1a;1)case 字段 when 值 then 返回值 when 值2 then 返回值2 end2)case when 条件1 then 返回值1 when 条件2 then 返回值2 end方法步骤&#xff1a;1.打开“SQL Server Management Studio”管理工具&#xff0c;创建一张测试…

hashmap value占用空间大小_【Java集合框架002】原理层面:HashMap全解析

一、前言二、HashMap2.1 HashMap数据结构 HashMap线程不安全 哈希冲突2.1.1 HashMap数据结构学习的时候&#xff0c;先整体后细节&#xff0c;HashMap整体结构是 底层数组链表 &#xff0c;先记住&#xff0c;再开始看下面的HashMap相关知识点&#xff1a;底层数据结构&#…

升级bios_华硕B350PLUS升级BIOS更换AMD 3900X步骤

首先CPU更换看下面这张图&#xff0c;注意CPU上的小三角的位置。这块主板如果BIOS没有升级直接更换AMD 3900X的CPU会有点不亮显示器的问题&#xff0c;所以下面讲下华硕B350PLUS这块主板是如何更新到最新的BIOS驱动的(需要在原来老的CPU基础上先升级&#xff0c;升级完再更换39…

实体类 接口_spring-boot-route(五)整合Swagger生成接口文档

目前&#xff0c;大多数公司都采用了前后端分离的开发模式&#xff0c;为了解决前后端人员的沟通问题&#xff0c;后端人员在开发接口的时候会选择使用swagger2来生成对应的接口文档&#xff0c;swagger2提供了强大的页面调试功能&#xff0c;这样可以有效解决前后端人员沟通难…

bootstrap-table 新增可编辑行_现代Web开发堆栈工具DevExtreme 新增Gantt组件,助力项目管理...

点击“了解更多”获取DevExpress DevExtreme v19.2正式版下载DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈(包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等)构建交互式的Web应…

关抢占 自旋锁_互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景

前言生活中用到的锁&#xff0c;用途都比较简单粗暴&#xff0c;上锁基本是为了防止外人进来、电动车被偷等等。但生活中也不是没有 BUG 的&#xff0c;比如加锁的电动车在「广西 - 窃格瓦拉」面前&#xff0c;锁就是形同虚设&#xff0c;只要他愿意&#xff0c;他就可以轻轻松…

dvwa详解_DVWA(六):XSSReflected 反射型XSS全等级详解

XSS 概念&#xff1a;由于web应用程序对用户的输入过滤不严&#xff0c;通过html注入篡改网页&#xff0c;插入恶意脚本&#xff0c;从而在用户浏览网页时&#xff0c;控制用户浏览器的一种攻击。XSS类型&#xff1a;Reflected(反射型)&#xff1a;只是简单的把用户输入的数据反…

直线的端点画垂线的lisp_【以课说法】线段、射线、直线

课例概况课例点晴你的课堂是碎片化的知识教学&#xff0c;还是结构化的问题探究&#xff1f;如何把碎片化的知识教学变成结构化的问题探究&#xff1f;实施路径就是问题串&#xff0c;用问题串统整知识点&#xff1b;围绕问题串&#xff0c;从问题引发、问题探究&#xff0c;直…

ehchache验证缓存过期的api_Ehcache缓存配置

Cache的配置很灵活&#xff0c;官方提供的Cache配置方式有好几种。你可以通过声明配置、在xml中配置、在程序里配置或者调用构造方法时传入不同的参数。你可以将Cache的配置从代码中剥离出来&#xff0c;也可以在使用运行时配置&#xff0c;所谓的运行时配置无非也就是在代码中…

alert 回调_JavaScript中到底什么时候回调函数Callback

什么是回调函数Callback简单的理解&#xff1a;回调函数是在另一个函数执行完毕后执行的函数 - 因此名称为call back。复杂的理解&#xff1a;在JavaScript中&#xff0c;函数是对象。因此&#xff0c;函数可以将函数作为参数&#xff0c;并且可以由其他函数返回。执行此操作的…

finereport文本框如何实现多值查询_如何实现参数级联查询

参数级联查询是查询控件之间的一种互动方式&#xff0c;比如在某个下拉框选定选项后&#xff0c;另一个下拉框里的选项范围会随之变化。润乾报表提供了多种编辑风格&#xff0c;每种编辑风格都有丰富的属性&#xff0c;以此为基础实现参数级联查询也很简单。下面就通过一个例子…

【HDU - 5015 】233 Matrix (矩阵快速幂)

题干&#xff1a; In our daily life we often use 233 to express our feelings. Actually, we may say 2333, 23333, or 233333 ... in the same meaning. And here is the question: Suppose we have a matrix called 233 matrix. In the first line, it would be 233, 233…

mysql datetime month不走索引_like百分号加前面一定不走索引吗?一不小心就翻车,关于mysql索引那些容易错的点...

like百分号加前面一定不走索引吗&#xff1f;正常来讲&#xff0c;我们都知道在mysql的like查询中&#xff0c;百分号加在关键词后面是走索引的&#xff0c;比如 select * like "张三%"&#xff0c;而百分号在前面是不走索引的&#xff0c;比如 select * like "…