Codierungstiefe und ‑zuverlässigkeit

Eine Tiefenkarte wird als Gruppe von XMP-Attributen serialisiert. Im Rahmen der Serialisierung wird die Tiefenkarte zuerst in ein herkömmliches Bildformat konvertiert. Die Codierungspipeline umfasst drei Schritte (siehe Abbildung 2):

  • Konvertieren Sie das Eingabeformat (z.B. float- oder int32-Werte) in ein Ganzzahl-Graustufenbildformat, z.B. Byte (8 Bit) oder Word (16 Bit).
  • Komprimieren Sie die Bilder mit einem Standard-Bildcodec wie JPEG oder PNG.
  • Als Base64-String serialisieren.
Abbildung 2: Beschreibung der Pipeline für die Codierung von Tiefenkarten.

Die Pipeline kann verlustfrei oder verlustbehaftet sein, je nach Anzahl der Bits der ursprünglichen Tiefenkarte und der Anzahl der Bits, die zum Speichern verwendet werden, z.B. 8 Bit für einen JPEG-Codec und 8 oder 16 Bit für einen PNG-Codec.

Derzeit werden zwei verschiedene Formate unterstützt: RangeLinear und RangeInverse. RangeInverse ist das empfohlene Format, wenn die Tiefenkarte beim Codieren an Genauigkeit verliert, z.B. bei der Konvertierung von Float in 8-Bit. Es werden mehr Bits für die nahen Tiefenwerte und weniger Bits für die fernen Werte zugewiesen, ähnlich wie der Z-Buffer auf Grafikkarten funktioniert.

Wenn der Tiefenkarte eine Vertrauenswürdigkeitskarte angehängt ist, wird auch die Vertrauenswürdigkeitskarte in ein herkömmliches Bildformat konvertiert. Dabei wird eine ähnliche Pipeline wie für die Tiefe verwendet. Die Konfidenzkarte wird immer im Format RangeLinear codiert, wobei der Konfidenzbereich als [0, 1] angenommen wird.

RangeLinear

Sei d die Tiefe eines Pixels und „near“ und „far“ die minimalen und maximalen Tiefenwerte, die berücksichtigt werden. Der Tiefenwert wird zuerst auf den Bereich [0, 1] normalisiert:

Quantisieren Sie dann auf 8 oder 16 Bit als

Umgekehrt kann die Tiefe d aus der quantisierten Tiefe d8bit berechnet werden:

RangeInverse

Sei d die Tiefe eines Pixels und „near“ und „far“ die minimalen und maximalen Tiefenwerte, die berücksichtigt werden. Der Tiefenwert wird zuerst auf den Bereich [0, 1] normalisiert:

Quantisieren Sie dann auf 8 oder 16 Bit als

Umgekehrt kann die Tiefe d aus der normalisierten Tiefe dn berechnet werden: