点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达推荐阅读
42个pycharm使用技巧,瞬间从黑铁变王者Google C++项目编程风格指南 (中文版) 分享

我在好几篇文章里面,提到了分离相机接收到的直接光与间接光后,可以有效的进行更高质量的三维重建,获得更精准的场景三维信息。这些文章包括44. Light Stage: 无限真实的人脸三维扫描——忘记幼稚的AI换脸吧、48. 高效分离直接光照明与非直接光照明、49. 利用极线探测技术分离直接光照与非直接光照等。这是典型的用更好更恰当的计算摄影成像结果辅助三维重建的思路。

那么,三维重建的场景信息是否又有利于更好更有趣的计算摄影应用呢?答案是肯定的!今天我就来介绍一个很有价值的例子。

一. Sea Thru:海底图像修复

我想很多朋友一定看过海底的各种视频、照片,甚至还有人真正去海里潜泳过。你看到的海底世界是什么样子的?

可能是这样的:

或这样的

你没有看过海底照片?那去游泳池游过泳吗?水池里面看到的是不是类似这样?

你一定注意到,这些图像的颜色失真,而且离镜头稍远一些就很快变得模糊不清了。而今天将要详解的这个技术,能够将这些颜色失真、画面模糊的水底照片变得就像水面上拍摄的正常照片一般,就像这样:

今天我介绍的这个技术,是由现在在港湾分院海洋研究所(佛罗里达大西洋大学)的Derya Akkaynak女士,以及Tali Treibitz共同作出的,他们称之为Sea Thru,这是一个让人印象深刻的名字。在进一步介绍之前,先要纠正一个观点。一些朋友在和我讨论这个技术时提到,这不就是PS吗?随便PS拉一拉曲线似乎也能搞出更清晰的图像啊?然而,作者在文章中也提及,仅仅做图像处理并不能恢复物理上真实的图像,而只是肉眼上的观感得到了改善。本文的关键出发点是用较小的代价获取到物理上真实的图像。

二. 基于暗通道先验的雾霾图像修复

一些对计算机视觉有了解的朋友,看到上面的图片示例后可能马上就会联想到另外一个经典的技术:

不错,这就是非常经典的何凯明在2009年在文章“Single Image Haze Removal Using Dark Channel Prior”中提出的“去雾”算法。这个算法不仅仅能够让雾霾中的图像变得更加清晰,符合物理规律,还能够同时估计场景的深度图

雾霾中的图像与海底的图像一样,都存在颜色失真、对比度低、稍远处就模糊不清等特点。在何凯明之前,也有很多人用各种方法尝试去做去雾,有的还取得了不错的效果。但这些方法要么不符合物理成像规律,所以效果会显得异常,例如

要么就是无法很好处理浓雾中的图像,或者要求更严格的假设,雾霾去不干净。

而何凯明在文章中首先引用了一个简洁的物理模型:

注意在这个模型里面,只有雾霾图像I是已知的,其他的J, t(包括组成部分d和  ), A都是未知量。很显然这就是一个所谓的“病态问题”

如同很多领域一样,解决病态问题通常的套路是通过引入先验信息来达成的。而何凯明引入的,则是一个叫做“暗通道先验(Dark Channel Prior"的先验信息。

首先来介绍一下所谓的暗通道操作,它由两个连续的操作构成,首先求一幅图像每个像素的r/g/b三个通道中的最小者,构成一幅灰度图像。然后将此图像的每个图像用一个局部窗口中的最小值替代,如下图所示

何凯明用天才的直觉发现了一个惊人的现象:正常图像的暗通道的像素值非常趋近于0!

暗通道趋于0的原因有很多,例如彩色图像因为像素值偏向某个通道,导致min(r,g,b)操作结果趋于0。或是阴影位置因为有部分像素亮度值趋于0,导致min(local patch)操作趋于0, 等等。

所以这些图像的暗通道图像通常都是黑黑的,比如:

然而雾霾时,因为空气中的水分、尘埃粒子的散射光,导致整个画面偏灰偏白,所以其暗通道不再是黑色的了。相反,越是远处浓雾的区域,暗通道的像素越接近空气散射导致的浓雾本身的样子,如下图所示

这就是所谓的暗通道先验,如果能够充分利用好这个先验信息,就能求得上述成像模型中本来的清晰图像J。作者做的第一个步骤是估计介质传输率t。首先在公式两边同时处以A,对图像做归一化。然后对归一化后的图像做暗通道操作。

如果我们认为空气散射光A在空间中是均匀恒定的,那么上面末行公式的右边第一项,恰好就是清晰图像J/A的暗通道,它应该非常接近于0。于是就可以估计出介质传输率仅仅与归一化的雾霾图像的暗通道值相关,也就是说已经求得了t。

求得了t,为了求得原始图像J,就需要知道 空气散射光A。很巧的是,根据暗通道先验,这部分恰好可以用雾霾图像的暗通道的最亮处的值(并非雾霾图像的最亮处,而是其暗通道的最亮处)来近似

再回头看看何凯明采用的成像模型,其中的I已知,A, t都已估计出来,自然就很容易求得清晰图像J了。

注意每个像素的介质透过率t实际上构成了一张尺寸和原图像一致的图像, 由于暗通道操作中的局部最小操作,这个估计出来的t图具有明显的方块效应

何凯明在论文中还花了较多笔墨,来讲解如何通过Matting的思想将这幅图处理得和雾霾图像非常贴合,从而能够更准确的恢复出清晰图像。这主要是由于此处的成像模型公式和Matting的模型公式结构上完全一致

优化后的t具有非常锐利的边缘,非常贴近原始图像结构

最终利用成像模型可以恢复出J

由于t和距离d的关系非常明确,因此场景的深度图也很容易恢复出来。下图是论文中的示例

我们现在可能用一两行python代码就可以仿真一个暗通道操作,但在何凯明之前,没有人真正观察到正常图像和雾霾图像在暗通道上的区别,更遑论用来进行雾霾图像的修复了。正是由于何凯明所用的理论的简洁、所展现的天才的直觉和敏锐的观察,因此基于暗通道先验的雾霾图像修复这篇文章才获得了当年CVPR的最佳论文奖。

三. 举一反三:从去雾到去海水

那么问题来了:我们已经看到水下的图像和雾霾图像具有很多相似之处(远处模糊,色彩饱和度低、色彩失真),那么何凯明所用的套路是否可以同样用于解决水下图像的修复呢?

确实,有很多学者就是从这个思路出发去做的。因为水下的成像模型与雾霾中的成像模型确实在结构上非常相似。仔细观察下图,你可以发现水下的成像由直接信号+背景散射信号两部分组成(正如我在别的文章中介绍的直接光和间接光成像一样)

事实上,何凯明所用的成像模型可以展开如下式所示,它最大的特点是参数简单,而且直接信号和间接信号中的参数t(介质传输率)都是一致的。并且,这个公式与光的波长无关,也没有引入更多物理特性。

然而,很多学者用这样的成像模型去处理水下图像修复问题时,都遇到了困难,结果都出现了不同程度的错误,比如色偏,或者色彩在不同距离上结果不一致等等。

而Derya Akkaynak以及Tali Treibitz的一个重要贡献就是大量实验、仿真,得出了更加复杂的水底成像模型。在这个模型中,引入了更多参数。

在论文中他们写道:

所以你会看到,这是一个非常复杂的成像模型。如果说何凯明要解决的是一个“病态问题”,那我们可以幽默的说一句, Derya和Tali要处理的就是一个“重病问题”了,但套路依旧是套路:

此处又有什么先验信息呢?由于在上述模型中直接信号D、背景散射信号B都与距离z相关,作者就提出可以直接利用常见的三维重建方法,直接先获取到场景的深度图z。比如作者所用的就是通过多张图像进行SFM,得到场景的深度图

另外作者参考何凯明所述的暗通道先验,观察到了水下图像的先验信息:

  • 由于水底的背景散射光的存在,所捕获的图像很少是纯黑的

  • 直接信号随着距离增加呈指数衰减。

  • 水底捕获的图像很暗的区域,由于对应的直接信号趋近于0,因此很接近背景散射信号,可以用于估计B

正如前面所讲,作者的成像模型中背景散射信号B也是由很多参数构成的。如果能够通过上面的先验信息获取足够多的像素样本,就能够估计出B中的各个参数,从而近似求得B。事实上作者就是这样做的,在下图中红色的点就是满足Ic --> Bc的像素,利用这些像素值即可建立起背景散射信号的确切的表达式,也就是说对于任何一个像素都可以通过该表达式直接求得其背景散射值。

一旦背景散射信号可以求得,那么就可以用已知图像I - B,求得直接信号图像D,接下来要做的就是通过已知的图像像素样本,求得构成D的各个变量,从而建立起完整的各参赛已知的成像模型。这里面,作者通过大量实验将D建模成了两个指数信号的和,共有四个未知数(a,b,c,d)。

求解这几个未知量的过程就变成了一个最小化的问题,其中关键约束条件是估计的距离和真实已知的距离(通过SFM得到)要非常一致,这再次说明了已知深度图的重要性

最终,当通过上述步骤估计了直接信号和背景散射信号中的各个参数后,整个成像公式中的每一个参数都成了已知量,自然就很容易求得未经衰减的清晰图像了,正如作者论文中的公式表示:

当然,水下的图像还需要经过一定的白平衡才能得到最终的图像:

四. 总结和思考

总结起来,Derya Akkaynak以及Tali Treibitz确实通过与何凯明所用套路一致的方法,解决了问题

不过,建立一个符合物理规律,且高度抽象的成像模型,同时敏锐的观察到一些先验信息并不是一件容易的事情。尤其是在成像方式变得非常复杂的时候。比如,现在越来越多的手机厂商尝试将摄像头直接按照在屏幕下方,避免在屏幕上开孔,露出一个难看的齐刘海,或者一个水滴。

此时如果已知隔着屏幕所成的图像,要想得到没有屏幕遮挡的清晰图像,又该如何做呢?。这里,由于屏幕实际上由很多小孔组成,成像模型中将不得不涉及光的干涉和衍射,引入了量子效应。这将大大增加整个模型的复杂度。

在很难建立前面所讲的人工建立参数式模型的情况下,深度学习时代,就是靠数据驱动学习出模型。学术界、企业界也已经用这类方法取得了一定的成绩。然而这样得到的图像通常只是在视觉上赏心悦目,但很多时候并不完全符合物理成像规律。

当然,两类方法各自都有各自的优缺点,我相信会越来越多的看到两类方法的融合。

五. 参考资料

今天的文章大量参考了如下文献:

  1. deryaakkaynak.com/sea-t: Sea Thru的官网上的图片

  2. D. Akkaynak and T. Treibitz. A revised underwater image formation model. In Proc. IEEE CVPR, 2018

  3. deryaakkaynak.com/resea: Derya的研究总结中 2018年论文的Post

  4. Kaiming He, Jian Sun, and Xiaoou Tang. Single Image Haze Removal using Dark Channel Prior CVPR 2009

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目31讲

在「小白学视觉」公众号后台回复:Python视觉实战项目31讲即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

下载4:leetcode算法开源书

在「小白学视觉」公众号后台回复:leetcode即可下载。每题都 runtime beats 100% 的开源好书,你值得拥有!


交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

50. 从暗通道先验去雾到海底图像修复-三维重建辅助计算摄影相关推荐

  1. 从暗通道先验去雾到海底图像修复-三维重建辅助计算摄影

    点击上方"小白学视觉",选择加"星标"或"置顶"重磅干货,第一时间送达 一. Sea Thru:海底图像修复 我想很多朋友一定看过海底的各种 ...

  2. [Python图像识别] 四十六.图像预处理之图像去雾详解(ACE算法和暗通道先验去雾算法)

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  3. 暗通道先验去雾实现过程分析

    经典去雾算法-何凯明09年提出暗通道先验去雾(Single Image Haze Removal Using Dark Channel Prior) 暗通道去雾公式:I(x) = f(x)*t(x) ...

  4. 基于导向滤波的暗通道先验去雾算法(Python,可直接运行)

    基于导向滤波的暗通道先验去雾算法(Python语言,可直接运行) 1 编译环境 2 原理介绍 2.1 暗通道先验 2.1.1 暗通道先验理论与去雾模型 2.1.2 处理步骤 2.2 导向滤波求t(x) ...

  5. 图像去雾算法--暗通道先验去雾算法

    图像去雾: 在雾天拍摄的图像容易受雾或霾的影响,导致图片细节模糊.对比度低以至于丢失图像重要信息,为解决此类问题图像去雾算法应运而生.图像去雾算法是以满足特定场景需求.突出图片细节并增强图片质量为目的 ...

  6. 暗通道先验去雾算法介绍及其几何意义的解释过程

    何恺明的暗通道先验(dark channel prior)去雾算法是CV界去雾领域很有名的算法,关于该算法的论文"Single Image Haze Removal Using Dark C ...

  7. 关于暗通道先验去雾问题的小结

    前段日子导师甩给我一篇何博士的论文,叫做<Single Image Haze Removal Using Dark Channel Prior>,利用统计得来的暗通道先验实现对有雾图像的去 ...

  8. 基于OpenCV实现暗通道先验去雾算法及改进,效果惊人

    ❤️欢迎订阅<从实战学python>专栏,用python实现爬虫.办公自动化.数据可视化.人工智能等各个方向的实战案例,有趣又有用!❤️ 更多精品专栏简介点这里 治愈生活的良方 就是保持对 ...

  9. MATLAB暗原色先验去雾算法的一些认识

    1.课题介绍 本文首先简单介绍基于暗原色先验去雾算法,然后总结出各变量的求解,最后利用已知程序检验算法的效果. 引言:在雾天时,由于空气中大量悬浮粒子的散射和吸收作用,使得光学成像对比度降低,颜色偏灰 ...

最新文章

  1. 量子计算机功率,美国物理学家证明光纤可提升超导量子计算机的功率
  2. VisualVM——JDK自带的性能分析工具
  3. 今日头条PC端的状态管理,使用的实现库是Redux
  4. 终极JPA查询和技巧列表–第3部分
  5. Windows7右键菜单栏添加打开cmd项
  6. 在leveldb中,为什么要有immutable memtable?
  7. 函数运行 形参实参变化 内存空间_可能python创始人都不知道的,python函数实参形参讲解...
  8. 【安全牛学习笔记】COCAT
  9. iOS学习笔记之正则表达式
  10. Google Earth Engine(GEE)——点、线、面和省级行政区的加载和展示,以及矢量的过滤筛选
  11. GIS技巧100例25-ArcGIS之shp文件修复
  12. 一转眼,波士顿动力 Atlas 机器人又会过独木桥了!
  13. 企业邮箱登录地址,邮箱登录入口,邮箱登录须知
  14. 《神经科学:探索脑》学习笔记(第5章 突触传递)
  15. Apache Storm 官方文档 —— Trident API 概述
  16. windows10安装配置vim
  17. 5-2 图书价格汇总
  18. D咚买菜抢购autojs核心代码分享
  19. python yolo 视频人头计数人流量监测景区教室人头检测
  20. matlab多径信道模型,多径时变信道模型的仿真与性能分析课程设计(样例3)

热门文章

  1. js版梅森旋转生成随机数
  2. SDUT-OJ偏序关系
  3. 公链分析报告(2)--EOS
  4. ios播放器相关(音乐列表获取)
  5. 【MacOS】java环境配置
  6. ttf-dejavu fontconfig字体
  7. 【程序设计】Java基本语法练习题
  8. html中怎么写虚线框的宽高,html如何设置虚线边框
  9. 《流浪地球》登顶IMAX国产片历史最高票房
  10. electron-vue更新依赖