深度图是一种由灰度值介于0到255的像素所构成的影像。 灰度值为0的像素代表这个3D像素是位于最远的地方;而灰阶值为255的像素代表这个3D像素是位于最近的地方。在深度图里,每一个像素将定义其所对应的2D像素在Z-轴的位置。因为深度图可以一个像素对应一个像素(Pixel-by-Pixel)方式被它的原始2D影像参考来制作栩栩如生的3D立体影像,所以目前它已非常普遍地被使用在制作裸眼3D显示器(或裸眼3D广告机)所需要的多视角3D内容;也是制作多视角3D内容的主流技术。
有了深度图,就相当于2D图像有了第三维的信息描述(深度信息),我们便可以利用算法来对2D图像虚拟出多个不同视角来。简单理解,一张平面图我们远看会变小,走近了看又会变大。人向左边移动,图像在我们视野中的位置又会相对右移。因此,对于不同的视角来说,目标图像只是相当于进行了平移及一系列简单的变换。然而,目标场景并不仅仅处在同一深度,反应在深度图中就是深度图中各个像素对应的值并不完全不同,因此,在视角前后左右变换时,不同深度的图像平移变换的量是不同的,离视角越近的场景变换越小。这样一来,当我们视角变化时,远处的物体难免会被较近处的物体所遮挡。虚拟视角的时候,这些像素点的信息就丢失了(从2D图上我们并不知道被遮挡的后边到底是什么),因此,需要我们对这些被遮挡的空洞进行填充。这里,使用了两种填充算法作为比较:镜面反射与梯度方向填充:
使用算法通过一个视角产生的另一个虚拟视角后存在空洞:
一、镜面反射
对每行像素进行单独处理,如果存在需要填补遮挡像素,则以连续空洞的最右侧 x 值为对称轴,将右侧信息镜像填充空洞。OpenCV代码如下:</