エンコードの深さと信頼度

デプスマップは、一連の XMP プロパティとしてシリアル化されます。シリアル化プロセスの一環として、デプスマップはまず従来の画像形式に変換されます。エンコード パイプラインには 3 つの手順があります(図 2 を参照)。

  • 入力形式(浮動小数点値や int32 値など)から整数グレースケール画像形式(バイト(8 ビット)やワード(16 ビット)など)に変換します。
  • 標準の画像コーデック(JPEG や PNG など)を使用して圧縮します。
  • base64 文字列 XMP プロパティとしてシリアル化します。
図 2. デプスマップ エンコード パイプラインの説明。

パイプラインは、元のデプスマップのビット数と、その保存に使用されるビット数(JPEG コーデックの場合は 8 ビット、PNG コーデックの場合は 8 ビットまたは 16 ビットなど)に応じて、ロスレスまたはロッシーになります。

現在、RangeLinearRangeInverse の 2 つの形式がサポートされています。深度マップがエンコード時に精度を失う場合(浮動小数点数から 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 は次のように復元できます。