Profondeur et niveau de confiance de l'encodage

Une carte de profondeur est sérialisée sous forme d'ensemble de propriétés XMP. Dans le cadre du processus de sérialisation, la carte de profondeur est d'abord convertie dans un format d'image traditionnel. Le pipeline d'encodage comporte trois étapes (voir la figure 2) :

  • Convertissez le format d'entrée (par exemple, les valeurs float ou int32) en un format d'image en niveaux de gris entier, par exemple en octets (8 bits) ou en mots (16 bits).
  • Compressez-les à l'aide d'un codec d'image standard, par exemple JPEG ou PNG.
  • Sérialiser en tant que propriété XMP de chaîne base64.
Figure 2. Description du pipeline d'encodage de la carte de profondeur.

Le pipeline peut être sans perte ou avec perte, selon le nombre de bits de la carte de profondeur d'origine et le nombre de bits utilisés pour la stocker (par exemple, 8 bits pour un codec JPEG et 8 ou 16 bits pour un codec PNG).

Deux formats différents sont actuellement acceptés : RangeLinear et RangeInverse. RangeInverse est le format recommandé si la carte de profondeur perdra en précision lors de l'encodage, par exemple lors de la conversion de float en 8 bits. Il alloue plus de bits aux valeurs de profondeur proches et moins de bits aux valeurs éloignées, de la même manière que le z-buffer fonctionne dans les cartes GPU.

Si une carte de confiance est associée à la carte de profondeur, elle est également convertie au format d'image traditionnel à l'aide d'un pipeline semblable à celui utilisé pour la profondeur. La carte de confiance est toujours encodée au format RangeLinear, avec une plage de confiance supposée être [0, 1].

RangeLinear

Soit d la profondeur d'un pixel, et near et far les valeurs de profondeur minimale et maximale considérées. La valeur de profondeur est d'abord normalisée dans la plage [0, 1] comme suit :

puis quantifiez sur 8 ou 16 bits comme suit :

Inversement, étant donné la profondeur quantifiée d8bit, il est possible de récupérer la profondeur d comme suit :

RangeInverse

Soit d la profondeur d'un pixel, et near et far les valeurs de profondeur minimale et maximale considérées. La valeur de profondeur est d'abord normalisée dans la plage [0, 1] comme suit :

puis quantifiez sur 8 ou 16 bits comme suit :

Inversement, étant donné la profondeur normalisée dn, il est possible de récupérer la profondeur d comme suit :