基于伽马变换自适应修正的全景首尾融合算法

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

前言

       360度全景摄像机可无盲点监测覆盖所处场景 ,通过一个鱼眼镜头或者一个反射镜面(如抛物线,双曲线镜面等),或者多个朝向不同方向的普通镜头拼接而成,拥有360度全景视场(Field of View, FOV)。一台全景摄像机可以取代多台普通的监控摄像机监控摄像机,做到了无缝监控,实现了监控新应用,应用于各个领域,其中包括监狱、政府机关、银行、社会安全、公共场所、文化场所等。

基于伽马变换自适应修正的全景首尾融合算法_第1张图片

一、场景痛点

       对全景相机而言,通过镜头的旋转可获取多张不同方向的图像,对其进行多图像拼接,最终可形成完整的全景图像。

基于伽马变换自适应修正的全景首尾融合算法_第2张图片 图1 全景子图拼接

       但是在拼接过程中,很容易受到背景光不一致等外在因素的干扰,而使得拼接的图像中光场分布不均匀,这很容易导致图像之间出现间隙或双亮接缝,两者都非常令人反感,尤其是对于相机正在平移或物体在接缝上移动的内容。

       解决方案是将两个图像大量重叠并修改重叠区域中的像素,以使重叠尽可能不可见。这样做的原因是,现在任何轻微的投影仪未对准或镜头像差都只会显示为图像的轻微模糊,而不是尖锐的接缝或间隙。融合结果如图2所示。

基于伽马变换自适应修正的全景首尾融合算法_第3张图片 图2 全景平铺拼接图

       虽然上述解决方案可以将平铺全景图像尽可能地融合,但无法保证图像两侧也能有效融合。要知道平铺全景图像最终是要呈现为360度立体环视效果的,左右两侧不融合将使得全景场景出现亮度突变缝,这会让观看者感到极度不适。如图3所示。

图3 亮度突变缝

        综上所述,在此类图像拼接场景下,亮度突变缝的消除是一大难题。难点主要有三:

  1. 全景图像往往是高分辨率的,即图像尺寸很大,这对算法复杂度的要求极高,过于繁琐的处理过程不利于工程开发和应用。
  2. 全景图像中物体特征是随机且差异极大的,这很考验算法对各类场景的普适度。
  3. 全景图像中,上中下三部分的亮度对比往往差很多,这与相机获取图像时的外在光源影响有关,也与相机本身的硬件和参数有关。

        如何将全景平铺图像的左右两侧也进行有效的融合,进而使360度全景环视效果更佳,是一个非常有挑战的课题。

二、需求说明

       第一部分讲解了全景图像拼接过程中存在的一大难点,即平铺图像左右侧的有效融合问题。针对该问题,提出需求:全景图像左右侧进行有效融合,使得左侧连接右侧后,不存在肉眼可见的明显亮缝。图4处理至图5状态。

基于伽马变换自适应修正的全景首尾融合算法_第4张图片 图4 拼接亮缝示意图
基于伽马变换自适应修正的全景首尾融合算法_第5张图片 图5 拼接融合

       为了满足该需求,本文提出了一种基于伽马变换自适应修正的全景首尾融合算法。

三、算法原理和流程

       之所以存在亮缝,归根结底是两部分的图像背景光不一致,我们可以将左侧和右侧分别进行一个伽马变化,伽马变化的终点修正为一致,再反变化回去,就可以使得中心部分较好融合,且图像像素渐变。

基于伽马变换自适应修正的全景首尾融合算法_第6张图片 图6 伽马掩膜

        左右两侧是从1到k,k是中心接壤的比例因子,因此有公式如下,其中G是伽马变化的因子,G为1时,是线性变化,改变G,曲线变化示意图如图6所示。x是归一化的值,中心为0,边缘为1。

f(x)=k+(1-k)x^{G}

       不难发现,边缘处即x为1时,f(x)也为1,这样的目的是使得这部分图像拼接完成后,在回归到原图后,依然是融合态;只让其拼接部分是渐变融合的。

基于伽马变换自适应修正的全景首尾融合算法_第7张图片 图7 伽马变换

       伽马自适应校准就是k值的校准,校准完成后进行反伽马变换,即可实现图像的恢复和融合。

       综上,该算法的流程图可简化为:

基于伽马变换自适应修正的全景首尾融合算法_第8张图片 图8 流程图

四、拼接效果图

基于伽马变换自适应修正的全景首尾融合算法_第9张图片 图9 拼接效果图1
基于伽马变换自适应修正的全景首尾融合算法_第10张图片 图10 拼接效果图2
基于伽马变换自适应修正的全景首尾融合算法_第11张图片 图11 拼接效果图3

五、代码分享

       C++代码不免费分享,有意获取者可以私我。算法不是魔法,不能解决一切问题。该算法的核心逻辑可用于工程开发,但仍有许多需要结合实际完善的地方,不建议直接拷贝使用。

PS:感谢陈先生提供的全景图像。

你可能感兴趣的:(项目算法,算法,全景融合,伽马变换,C++)