编码深度和置信度

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

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

流水线可以是无损的,也可以是有损的,具体取决于原始深度图的位数和用于存储它的位数,例如 JPEG 编解码器为 8 位,PNG 编解码器为 8 位或 16 位。

目前支持两种不同的格式:RangeLinearRangeInverse。如果深度图在编码时会损失精度(例如从浮点数转换为 8 位),建议使用 RangeInverse 格式。它会为近深度值分配更多位,为远深度值分配更少位,这与 GPU 卡中 z-buffer 的工作方式类似。

如果深度图附有置信度图,则置信度图也会使用与深度图类似的流水线转换为传统图片格式。置信度地图始终使用 RangeLinear 格式进行编码,置信度范围假定为 [0, 1]。

RangeLinear

假设 d 是像素的深度,near 和 far 是考虑的最小和最大深度值。深度值首先会归一化到 [0, 1] 范围,如下所示:

然后量化为 8 位或 16 位,如

反之,给定量化后的深度 d8bit,可以恢复深度 d,如下所示:

RangeInverse

假设 d 是像素的深度,near 和 far 是考虑的最小和最大深度值。深度值首先会归一化到 [0, 1] 范围,如下所示:

然后量化为 8 位或 16 位,如

反之,给定归一化深度 dn,可以恢复深度 d,如下所示: