深度图会序列化为一组 XMP 属性。在序列化过程中,深度图首先会转换为传统图片格式。编码流水线包含三个步骤(见图 2):
- 从输入格式(例如浮点值或 int32 值)转换为整数灰度图片格式,例如字节(8 位)或字(16 位)。
- 使用标准图片编解码器(例如 JPEG 或 PNG)进行压缩。
- 序列化为 base64 字符串 XMP 属性。
流水线可以是无损的,也可以是有损的,具体取决于原始深度图的位数和用于存储它的位数,例如 JPEG 编解码器为 8 位,PNG 编解码器为 8 位或 16 位。
目前支持两种不同的格式:RangeLinear 和 RangeInverse。如果深度图在编码时会损失精度(例如从浮点数转换为 8 位),建议使用 RangeInverse 格式。它会为近深度值分配更多位,为远深度值分配更少位,这与 GPU 卡中 z-buffer 的工作方式类似。
如果深度图附有置信度图,则置信度图也会使用与深度图类似的流水线转换为传统图片格式。置信度地图始终使用 RangeLinear 格式进行编码,置信度范围假定为 [0, 1]。
RangeLinear
假设 d 是像素的深度,near 和 far 是考虑的最小和最大深度值。深度值首先会归一化到 [0, 1] 范围,如下所示:
RangeInverse
假设 d 是像素的深度,near 和 far 是考虑的最小和最大深度值。深度值首先会归一化到 [0, 1] 范围,如下所示: