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

点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达

推荐阅读
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“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以通过以下方法根据经纬度判断其所在的大洋: 1. 根据经度判断所在的半球,东经为正,西经为负。经度为正数时,位于东半球;经度为负数时,位于西半球。 2. 根据纬度判断所在的海洋区域。大洋分为南北两半球,赤道为分界线。在南北两半球中,纬度越小,距离赤道越近,纬度越大,距离极点越近。 3. 在南北两半球的基础上,根据经度和纬度的范围,判断其所在的海洋区域。太平洋、大西洋、印度洋、南极洲洲际地区、北极洲洲际地区是五个大洋,其中太平洋、大西洋、印度洋是最主要的三个洋。 以下是一个示例代码,可以根据经纬度判断其所在的大洋: ```python def get_ocean(lon, lat): if lon > 0: hemisphere = "东半球" else: hemisphere = "西半球" if lat < 0: latitude = "南半球" else: latitude = "北半球" if lat < -60: ocean = "南极洲洲际地区" elif lat >= -60 and lat < -10: ocean = "南大洋" elif lat >= -10 and lat < 0: ocean = "南极洋界" elif lat >= 0 and lat < 10: ocean = "赤道附近海域" elif lat >= 10 and lat < 20: ocean = "北赤道海域" elif lat >= 20 and lat < 30: ocean = "副赤道海域" elif lat >= 30 and lat < 60: ocean = "北大洋" elif lat >= 60: ocean = "北极洲洲际地区" if lon >= -180 and lon < -20: location = "太平洋" elif lon >= -20 and lon < 20: location = "印度洋" elif lon >= 20 and lon < 160: location = "太平洋" elif lon >= 160 and lon <= 180: location = "北大西洋" elif lon >= -180 and lon < -40: location = "南大西洋" elif lon >= -40 and lon < 20: location = "南美洲海岸" else: location = "未知" return hemisphere + " " + latitude + " " + location + " " + ocean ``` 该函数接受两个参数:经度 lon 和纬度 lat。根据经度和纬度的范围,判断其所在的海洋区域,最后返回一个字符串,该字符串包含了其所在的半球、海洋区域、大洋等信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值