光流是人类为了建模像素运动而定义的。光流是描述运动的一种载体或者说表现方式。
使用光流可以应用在很多任务上,比如跟踪等很多视觉任务,但本文的重点是光流应用在两帧(或多帧)图像上并如何通过已知光流去还原图像(或者说重构)。
首先先看一下光流的可视化形式。
上两张图为ref参考图和alt当前帧,重点观察人物的腿部运动。
上图为flowmap也就是光流图,这种用不同颜色来表示的光流图需要结合下面的色盘去观察,不同的颜色代表不同的运动方向,颜色的深浅代表运动的方向上的运动大小。
下图为光流和alt图remap后(也就是warp后)的结果,可以看出明显的残影。
![使用光流法做多帧对齐,并还原(重构)图像(HDR任务)心得](https://img-blog.csdnimg.cn/66ff352f1f1b41c9b5affd5d62a95015.png)
该图展示了使用光流去做对齐的一种效果。如果只使用光流去做图像对齐,是否可以生成无残影无残缺的高质量还原图呢?(欢迎交流)
随着深度学习的发展,现在的光流任务也可以被深度学习去代替了,比如FlowNet,以及目的的TOP级别的ECCV 2020 Best Paper: RAFT 。
这里就不具体介绍深度学习的方式了。
主要说一下传统的光流方式。
简单来说光流主要分为两种,一种是稀疏光流,一种是稠密光流。
稠密光流就是最上面图片所示的针对每一个像素都求光流的并生成色盘形式的可视化方式。
稀疏光流则是先确定图像中的角点—–使用cv2.goodFeatureToTrack()
稀疏光流则使用——cv2.calcOpticalFlowPyrLK()
稀疏光流的可视化如图:
由于是针对角点的光流操作,所以稀疏光流使用箭头向量的形式去表示,而且更多用于跟踪上,谷歌的hdr+论文也是使用类似稀疏光流的金字塔结构去做的对齐,这篇文章后续会再讲。
对于多帧图像对齐,主要的方式还是使用稠密光流。
通过阅读多篇关于对齐问题的文章发现,似乎光流对齐并不能做到完美的对齐,原因是在于在使用remap等其他方式去重构图像的时候,发生运动的部分区域在一张图像上是不可能做到1:1的移动还原的,因为一定存在一些像素是当前这张图像上肯定就不存在的,所以要么像最上面例子那样出现残影,要么会出现缺失等问题(个人理解,欢迎交流!)。
下图可以看出即便用了他所谓更精细的方式(
光流等),但由于估计误差,它们仍然存在伪影的影响。下图来自paper:AHDR
下图同样也说明了光流对齐在一些没有对应关系的区域,这里的没有对应关系的区域应该就是上面所提到的”不存在的区域“,这样的区域难免会产生鬼影等问题,具体效果如下图所示(红色箭头)。
那么光流对齐到底能不能完美的还原或者重构图片(在我看来并不能),在很多hdr方向的工作,大部分方式都是先使用光流做对齐,然后在融合的阶段去解决光流对齐所产生的(鬼影等)问题,举个例子:
paper :Deep High Dynamic Range Imaging of Dynamic Scenes
这篇论文是17年来自UCSD关于HDR生成的paper
论文提供了一种基于深度学习的方式去生成HDR image,其中在图像对齐部分使用了Liu[2009]这篇文章所提出的光流对齐法,在融合阶段使用深度学习的方式去merge,这样的好处是大大减少了对齐所带来的鬼影等问题。
反复读过这篇文章后发现,融合阶段的输入是这样的:
![使用光流法做多帧对齐,并还原(重构)图像(HDR任务)心得](https://img-blog.csdnimg.cn/4eaaded3ac4044db8e25f270865f1cda.png)
原文是这样说的:
![使用光流法做多帧对齐,并还原(重构)图像(HDR任务)心得](https://img-blog.csdnimg.cn/1816f24796374d70b839cf60534f0bc2.png)
结合原文开源的代码可知,原文在求出光流之后,使用alt加光流向量做了remap操作,之后做了crop之后就放入了网络中,使用原文的开源代码和默认参数配合一样的数据集并没有生成如上图所示的效果,自己测试的效果大致如图:
![使用光流法做多帧对齐,并还原(重构)图像(HDR任务)心得](https://img-blog.csdnimg.cn/8a6bec26528a4a428548068794d6c131.png)
没有和原文的效果一模一样,而生成这样的效果,已经是不断调参之后的结果了,这样的结果作为网络的输入,通过深度学习去代替传统融合理论上确实可以解决鬼影的问题,但是我的关注点一直是在如何使用传统方式去生成hdr图像,生成如上图所示的图像之后,如何用传统的融合方式去merge呢?
上文提到了一篇文章:Liu[2009],这篇文章便是使用传统算法去做的对齐和融合。可惜这篇文章并没有开源,目前也没有找到相关代码。
这篇文章:High Dynamic Range Video
![使用光流法做多帧对齐,并还原(重构)图像(HDR任务)心得](https://img-blog.csdnimg.cn/cb866a65483f480aa5af1e6578a35efa.png)
主要介绍了如何使用传统算法去解决对齐所出现的鬼影问题。具体内容不在这里说了,是通过warp四个短曝光的图像去和L做融合。
根据上述工作,光流算法应用在HDR成像的对齐工作中,
在我看来流程为:调节曝光比之后,求出两帧图像(ref和alt)的光流向量,找到向量之后通过remap函数去映射出alt的复原图,使用alt复原图去和ref做merge操作从而生成hdr图像。
上述流程有两个问题:1.光流向量和alt做remap操作得到的结果,总会出现一些残缺等问题,这是不可避免的。2.这样的带有残缺的图像如何去和ref融合?根据Liu[2009]中提到的,会对这样带有残缺的图像和ref先做一些操作去弥补残缺位置,或者在融合时使用一种策略去忽略掉残缺的位置。但是这两种具体的方法并没有找到具体的开源代码或者详细的论文说明。
以上便是光流在hdr方向工作的心得,欢迎交流!