利用开源软件 Hugin 实现照片的景深合成

本文主要参考了下面的文章:http://macrocam.blogspot.jp/2013/09/using-hugin-for-focus-stacking.html

根据我自己的理解做了少量的增删。首先感谢原作者。

Hugin 是一个很出名的全景照片拼接软件。但其实除了全景拼接功能外, hugin 还提供了一系列的命令行工具,可以用来操纵和融合多张图像,实现高动态图像(HDR)、景深合成(Focus Stacking)等各种高级功能。本文就来介绍一下如何用 hugin 做景深合成。

下面先来介绍一下什么是景深合成。我们知道拍照时视场中的景物只有在一定的远近范围内才是清楚的,这个清楚的范围的大小用景深来描述,景深越大就能使更多的不同远近的景物同时清晰。景深这个参数是镜头本身的特性,并且与镜头的光圈值是有直接关系的。简单的说就是光圈越大,景深越浅。虽然我们可以通过减小光圈来增大景深,但光圈太小进入镜头的光线就会很少,曝光时间就要增加,并且光圈不能无限的减小下去。

为了获得大景深的图像,就产生了景深合成这个技术。简单地说就是拍摄对焦在不同距离的一系列图片,然后将这些图片合成为一张远近都清楚的图片。这种景深合成技术在显微图像应用领域非常的有用,因为随着显微镜的放大倍数的提高,景深会变得非常的浅。对于常用的 50x 物镜拍出的照片,景深只有 1—2 um。这时只要样本有一点高度的起伏就没法全都拍摄清楚。

景深合成英文是 Focus stacking,也有人称之为 macro stacking、focal plane merging、 z-stacking 和 focus blending 。

景深合成主要用到如下两个命令行工具:

  • align_image_stack.exe

    这个工具用来将多幅图像对准。如果我们的图像已经是对准了的,这步也可以省略。比如我们拍照时用了三脚架,或者拍摄显微图像时图像没有左右移动。
  • enfuse.exe

    用来将多张图像融合在一起。这个工具具有非常多的命令行选项,可以实现相当多的图像融合方法,自然也包括景深合成所需的图像融合方法。enfuse 其实是一个单独的开源软件,被 hugin 包含进来了。
"align_image_stack.exe" -a "align_" -m -v t1.jpg t2.jpg
  • “-a” 参数告诉 align_image_stack 我们要为输出的图像指定一个前缀。不指定的话生成的图片会覆盖原始图片。
  • “-v” 是输出更多信息,这对于我们理解 align 过程发生了什么事情有些用,当然如果并不关心这些,可以不加这个选项。
  • “-m” 对除第一幅图像以外的其他图像进行适当的缩放,如果不加这个选项就只考虑平移和旋转。

除此之外,还有些选项也很有用。

* “-x” 对齐时考虑这些图像间 x 方向的平移,如果我们已知图像间只有这种平移,那么加这个选项会极大的提高处理速度。

* “-y” 对齐时考虑这些图像间 y 方向的平移。

* “-i” 对齐时考虑这些图像间 x、y 方向的平移。

* “-d” 对齐时考虑图像的径向畸变,径向畸变最常见的类型是桶形畸变 (Barrel distortion)和枕形畸变(Pincushion distortion)。

* “-e” 图片是鱼眼镜头拍摄的时用这个选项。

下面我们来看看 t1.jpg 和 t2.jpg。



t1.jpg 是对焦对在了后面的音箱上。前面两个药瓶都是模糊的。



t2.jpg 是对焦对在了最前面的药瓶上。这两幅图之间没有缩放或平移。所以输出的结果与原始图片没什么区别。

图像对其之后就是对这些图像进行融合了。

"enfuse.exe" -o "result.jpeg" --compression=100 --contrast-weight=1.00 --exposure-weight=0.00 --saturation-weight=0.00 --contrast-window-size=5 --hard-mask --gray-projector=luminance align_0000.tif align_0001.tif

这里面大多数的命令行参数都在我的上篇博客里有介绍,这里值介绍那些没介绍过的。

  • “–contrast-window-size=5” 用来设置窗口大小,只能是奇数值,通常取为 5 或 7 。
  • “–hard-mask” 这个选项通常只用于景深合成上,表明合成时不做平均处理,与之相对的是 “–soft-mask”。
  • “–gray-projector” 如何计算图片各个像素的亮度信息,默认情况是去 RGB 三个值的平均值。”luminance” 表示用 CIE 转换公式: Y = 0.3R + 0.59G + 0.11B

下面来看看融合之后的结果。



可以看出融合之后的图片中后面的音箱和前面的药瓶都是清晰的。中间那个药瓶还是模糊的,这说明我们原始的图片太少了,如果多一张中间清楚的图片合成的效果会更好。

至此,景深合成的基本方法就介绍完了,enfuse 软件功能很强大,还有许多其他的选项,这里没法一一介绍,感兴趣的同学可以读 enfuse 的帮助文档。

景深合成的一些小技巧:

  • 光照,减小一点曝光量,让照片暗一点更容易获得满意的合成图片。
  • 光源,尽量用漫反射光源照明。
  • 镜头,尽量选用畸变小的镜头,这样软件更容易对其图片。
  • 要有耐心,我们例子中只用了两张照片合成,但这只是个例子,真实情况下需要的图片笔者多的多。通常,我们需要几十张图片才能合成一幅满意的景深合成照片。

利用开源软件 Hugin 实现照片的景深合成的更多相关文章

  1. 利用开源软件 Hugin 实现照片的景深合成,使用开源软件 enfuse 做照片的曝光合成

    http://blog.csdn.net/liyuanbhu/article/details/53573847 http://blog.csdn.net/liyuanbhu/article/detai ...

  2. 使用开源软件 enfuse 做照片的曝光合成

    使用开源软件 enfuse 做照片的曝光合成 所谓曝光合成就是对同一场景用不同的曝光量拍摄多张照片,然后将这些照片再合成为一张照片.之所以我们要这么做是因为现在的相机感光的动态范围相比人眼实在是太小了 ...

  3. 利用开源软件strongSwan实现支持IKEv2的企业级IPsec VPN,并结合FreeRadius实现AAA协议(下篇)

    续篇—— 利用开源软件strongSwan实现支持IKEv2的企业级IPsec VPN,并结合FreeRadius实现AAA协议(上篇) 上篇文章写了如何构建一个支持IKEv2的VPN,本篇记录的是如 ...

  4. 利用开源软件自建WAF系统--OpenResty+unixhot

    目录 介绍 安装Openresty 修改nginx.conf 部署WAF 测试WAF 简介:利用OpenResty+unixhot自建WAF系统 介绍   OpenResty是一个基于 Nginx 与 ...

  5. C#利用开源软件ffMpeg截取视频图片

    #region 从视频画面中截取一帧画面为图片 /// <summary> /// 从视频画面中截取一帧画面为图片 /// </summary> /// <param n ...

  6. 痞子衡嵌入式:开源软件协议(MIT/BSD/Apache/LGPL/MPL/GPL)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是关于开源软件协议基本知识. 牛顿曾说过:"如果我比别人看得更远,那是因为我站在巨人的肩上".在软件开发中如果说也存在巨 ...

  7. 2014 年最热门的国人开发开源软件 TOP 100 - 开源中国社区

    不知道从什么时候开始,很多一说起国产好像就非常愤慨,其实大可不必.做开源中国六年有余,这六年时间国内的开源蓬勃发展,从一开始的使用到贡献,到推出自己很多的开源软件,而且还有很多软件被国外的认可.中国是 ...

  8. 2014 年最热门的国人开发开源软件TOP 100

    不知道从什么时候开始,很多一说起国产好像就非常愤慨,其实大可不必.做开源中国六年有余,这六年时间国内的开源蓬勃发展,从一开始的使用到贡献,到推出自己很多的开源软件,而且还有很多软件被国外认可.中国是开 ...

  9. 2014年国人开发的最热门的开源软件TOP 100

    不知道从什么时候开始,很多一说起国产好像就非常愤慨,其实大可不必.做开源中国六年有余,这六年时间国内的开源蓬勃发展,从一开始的使用到贡献,到推出自己很多的开源软件,而且还有很多软件被国外的认可.中国是 ...

随机推荐

  1. [IIS] IIS网站对文件读写无权限的解决方案(Access等)

    Access数据库无写权限:在NTFS文件安全属性中加入对IIS_IUSRS用户的修改权限即可.

  2. SQL server数据库压缩空间

    SQL server数据库,在手动删除或者自动删除数据后,查看数据库物理文件发现占用空间并没有释放,果断采用万能的重启.(反正是自己用的一个服务器,随便玩.如果不是只有自己用的服务器,还是建议让运维或 ...

  3. Lambda表达式学习记录

    Lambda表达式可以简化C#编程的某些方面,用法非常灵活.因此也不容易掌握. 下边是我学Lambda表达式的一点记录. 1.Lambda表达式是与委托紧密联系的.只要有委托参数类型的地方,就可以使用 ...

  4. linux在当前目录下根据文件名查找文件

    grep -rl "python" ./ 查找./目录下文件名中包含python的文件 find | grep luoluo将当前目录下(包括子目录)的文件名中含有luoluo的文 ...

  5. Hadoop HBase概念学习系列之优秀行键设计(十六)

    我们通过行键访问HBase.尽管使用扫描过滤器可以一次性指明大量的键,但是HBase仅仅能够根据行键识别出一行. 优秀的行键设计可以保证良好的HBase性能. 1.行键存在于HBase中的每一个单元格 ...

  6. 处理过期的archivelog和rman备份

    当手工删除了归档日志以后,Rman备份会检测到日志缺失,从而无法进一步继续执行.所以此时需要手工执行crosscheck过程,之后Rman备份可以恢复正常.[执行顺序如下:手工删除archivelog ...

  7. 实践和感悟 - scala向下转型和减少穷举

    工作中的问题总结: 问题一:scala 之向下转型 引言:假如在复杂的业务逻辑中,变量的类型不能确认,只能给个接口类型,这样数据类型推导不会错误,但是后面要使用实现类的类型时,你却发现转不过来了? 对 ...

  8. RAID廉价磁盘冗余阵列介绍

    RAID(廉价磁盘冗余阵列)技术主要是为了改善磁盘的访问延迟,增强磁盘的可用性和容错能力.目前服务器级别的计算机都支持插入多块磁盘(8块或者更多),通过使用RAID技术,实现数据在多块磁盘上的并发读写 ...

  9. DA-GAN技术【简介】【机器通过文字描述创造图像】

    [题外话:今天上课我做了一个关于DA-GAN技术的ppt演讲,写一点东西留念一下...] 转载请注明出处:https://www.cnblogs.com/GraceSkyer/p/9107471.ht ...

  10. python-一个小爬虫,爬取图片

    import re import urllib.request # 爬取网页 def getHtml(url): page=urllib.request.urlopen(url) html=page. ...