对深度图和置信图进行编码

深度图会被序列化为一组 XMP 属性。在序列化过程中,深度图首先会被转换为传统的图片格式。编码管道包含以下三个步骤(参见图 2):

  • 从输入格式(例如浮点值或 int32 值)转换为整数灰度图片格式,例如字节(8 位)或字(16 位)。
  • 使用标准图片编解码器(例如 JPEG 或 PNG)进行压缩。
  • 序列化为 base64 字符串 XMP 属性。
图 2. 深度图编码管道的说明。

此管道可能会使深度图损失精度,也可能不会,具体取决于原始深度图的位数和用于存储该深度图的位数(例如,对于 JPEG 编解码器,位数为 8 位;对于 PNG 编解码器,位数为 8 位或 16 位)。

系统目前支持两种不同的格式:RangeLinearRangeInverse。如果深度图在被编码的过程中(例如从浮点值转换为 8 位的数值时)会损失精度,则建议使用 RangeInverse 格式。使用这种格式时,系统会向近处的深度值分配较多的位数,而向远处的深度值分配较少的位数(这种方式类似于 GPU 卡中 z 缓冲区的工作方式)。

如果深度图附带置信图,系统还会采用与深度图转换相似的管道,来将该置信图转换为传统图片格式。系统只会使用 RangeLinear 格式对置信图进行编码,同时将置信区间假设为 [0, 1]。

RangeLinear

我们用 d 表示像素深度,用 near 和 far 来表示最小深度值和最大深度值。深度值首先会被归一化为 [0, 1] 区间内的值,如下所示

然后量化为 8 位或 16 位,如下所示

反过来,如果已知量化后的深度 d8bit,则可通过逆运算的方式求出深度 d,如下所示

RangeInverse

我们用 d 表示像素深度,用 near 和 far 来表示最小深度值和最大深度值。深度值首先会被归一化为 [0, 1] 区间内的值,如下所示

然后量化为 8 位或 16 位,如下所示

反过来,如果已知量化后的深度 dn,则可通过逆运算的方式求出深度 d,如下所示