人像保护广角畸变校正算法原理及实现
作者:互联网
0.背景
广角相机模组在手机中越发普及,一般出现在手机后摄模组中,甚至在部分手机的前摄中也有配备。其FOV一般不小于110°,相比于常规相机模组能够获取更宽广的视野,在拍摄景物与场景表现方面有其独特优势,下图是一张常见的广角镜头相比于普通镜头的拍摄效果对比图。
但另一方面,广角相机获取的输入图畸变较大,直观感受就是图像边缘处图像弯曲。针对该现象,可通过对相机做标定获取内参,再对输入图像做畸变校正获得校正后图像,可以消除畸变,具体如下图所示。
目前大部分手机中应用的都是该方法,拍摄风景时成像效果很不错。技术实现方面可将它转换为一个网格插值操作,通过SIMD、多线程等操作可在CPU上获取很高的运行帧率,或者使用GPU进行插值渲染;实时的预览、录像都不在话下。不过在拍摄有人的场景且人像位于图像边缘时,由于畸变校正的“拉伸”操作会使得结果图中人像区域变宽,比例失调,产生了不好的视觉效果,如下图所示。
由此引出今天讨论的主题,针对已有的畸变校正算法导致人像拉伸的问题,该如何改进,即如何实现具有人像保护效果的广角畸变校正算法。
1.技术方案
目前主流的技术方案大致有三种,现逐一道来。
1.1基于球面变换
该方法的核心在于球面变换,有关球面变换可参考链接。它的一个特性就是输出图相比于输入图,四周的图像呈非等比例收缩,中心区域图像会有一定的放大。将该操作作用于畸变校正后的图像,结果图中处于边缘的人像由于收缩操作其比例得以一定程度的恢复,如下图所示。
实际工程中,可结合人脸检测操作,在拍照时确定是否存在人像,并根据其距离图像中心的位置和人像大小判断是否需要进一步处理(距离图像中心越远,面积越大的人像变形越严重)。如果不需要,只对输入图做畸变校正;如果需要就在畸变校正后再做一次上述的球面变换。预览时处理流程相似,只不过需要在两种变形操作中可以增加一个过渡过程,避免突然切换导致的图像画面抖动。
该方法优点是计算量小,实现简单,技术实现上仍然是插值操作;缺点是全图无差别操作,背景也会受到影响导致再次弯曲。总的来说这是一种“二保一”的策略,鱼与熊掌不可兼得,不过确实在一些中低端手机上是如此实施。
1.2基于优化策略
该方法的代表性论文是《Distortion-Free Wide-Angle Portraits on Camera Phones》,是谷歌研究人员于2019年发表的一篇论文,具体效果见https://36kr.com/p/1723902918657。具体实施流程相对复杂,但效果相比于第一种方法的确有明显提升,这里简单介绍一下算法流程。
step1.使用深度学习做人脸检测与人像抠图,获取需要保护的前景区域,论文里主要是头部区域;其余区域被当做背景区域
step2.对输入图像根据畸变校正获取畸变校正结果图,作为上述背景区域的结果参考;对畸变校正结果图做球面变换获取球面变换结果图,作为上述前景区域的结果参考;
step3.前景和背景需要平滑过渡,避免结果图中边界处产生突兀的变换;再辅以其他的一些约束,将上述问题转换为一个变换网格的优化问题进行求解
step4.求解得到变换网格后做插值获取最终结果图
下图简明扼要地阐述了算法的核心思想(来自于论文作者提供的PPT)
算法的优点就是兼顾人像(主要是人脸)与背景的处理,提升效果显著;缺点主要是计算流程相对复杂,对平台算力有较高要求,无法在预览中应用。
1.3基于深度学习
查阅到一篇今年新发的论文,见https://arxiv.org/pdf/2104.12464.pdf。作者把上面基于优化的求解操作通过深度学习实现,据说可以改善1.2中方法的一些弊端,譬如人像区域周围对背景的轻微影响可以减小甚至消除。个人对这方面不够熟悉就不展开说了,感兴趣的同学可以自己研究下。
2.编程实现
目前基于1.2中的方法为基础做了算法的实现,基本复现了论文中的效果,且经过优化后能在中高端安卓手机中满足拍照时间要求,与主流手机中的效果相比并不逊色,下面放几张效果对比图。
标签:算法,校正,人像,变换,广角,畸变,图像 来源: https://blog.csdn.net/lwx309025167/article/details/120021775