Insertion d'objets virtuels

Carte de radiance en haute plage dynamique

La première étape du travail consiste à prendre des photos avec différents temps d'exposition. Un exemple de ces captures est présenté à la figure 1. Les captures ont été prises à l'aide de gphoto2.

Figure 1. Exemples de captures d'une sphère de chromée à différents temps d'exposition. Les temps d'exposition sont, de gauche à droite: 1/4s, 1/32s, 1/128s, 1/256s, 1/1024s.

Une fois ces photos prises, il faut les fusionner ensemble pour obtenir une carte d'environnement à haute plage dynamique (appelée HDR Environment Map). Cette carte donne la radiance émise par chacun des pixels. Cette radiance est la somme de toute l'énergie lumineuse contenue dans le cône sous-tendu par le champ de vue d'un pixel. Les opérations pour l'obtenir sont décrites dans [1]. Pour résumer, une caméra effectue la relation suivante: $$ Z_{ij} = f(E_i \Delta t_j) \quad ,$$ où $E_i$ est l'irradiance (soit l'intégrale de la quantité d'énergie lumineuse sur une surface) d'un pixel $i$, $\Delta t_j$ est le temps d'exposition de l'image $j$ et $Z_{ij}$ les valeurs de l'image $j$ au pixel $i$. Il faut donc prendre plusieurs images $j$ couvrant toutes les valeurs possibles intéressantes de $i$, soit sur le domaine $]0, 255[$. Les valeurs 0 et 255 ne sont pas intéressantes puisqu'elles sont saturées et ne correspondent donc pas nécessairement la réalité. Notre but est d'inverser la fonction de la caméra, soit retrouver la carte de radiance à partir de plusieurs images. On peut ainsi trouver $$ E_i = e^{g(Z_{ij}) - \ln{\Delta t_j}} \quad, $$ où $g = \ln{f^{-1}}$. Il suffit ensuite d'estimer la fonction $g()$. Des exemples de ces estimations sont présentées à la figure 2.


Figure 2. Courbes de radiance en fonction de l'intensité d'un pixel. Les trois courbes représentent le canal de leur couleur respective (Rouge, Vert et Bleu).

Il faut faire attention lors de la prise de capture pour que les pixels soient toujours dans l'intervalle $[1, 254]$ au moins dans une image. Lorsque cette contrainte n'est pas respectée, on peut obtenir une carte problématique comme à la figure 3.


Figure 3. Carte d'environnement avec pixels toujours saturés.

Transformation panoramique

Une fois la carte d'environnement à haute plage dynamique estimée, il est nécessaire de la convertir depuis le système de coordonnées de la sphère chromée à un système de coordonnées pris en charge par un engin de rendu. Un de ces systèmes de coordonnées est le Latitude-Longitude (communément appelée latlong). Pour effectuer la conversion d'un à l'autre, il suffit de trouver la transformation inverse, soit de latlong à sphérique (pour une explication, voir TP #2). Pour ce faire, il faut convertir les coordonnées latlong à un repère monde, puis de ce repère monde aux coordonnées sphériques.

Pour convertir les coordonnées latlong 2D à un repère monde 3D, il suffit d'effectuer la conversion suivante (on assume une sphère unitaire): $$ \begin{align} x &= \sin \theta \cos \phi \\ y &= \sin \theta \sin \phi \\ z &= \cos \theta \end{align} $$

Ensuite, pour convertir ce repère monde à la sphère, il est nécessaire d'effectuer deux opérations, soit trouver la relation entre la normale de la sphère et le vecteur d'illumination qu'il représente et ensuite changer le repère selon ce vecteur d'illumination. Premièrement, la relation entre la normale de la sphère $N$ et son vecteur d'illumination $R$ est déterminé par: $$ R = V - 2 \cdot \langle V, N \rangle \cdot N \quad,$$ où $V$ est la direction d'observation et $\langle \cdot, \cdot \rangle$ dénote le produit scalaire. Si on décortique cette relation, pour $V = \begin{bmatrix} 0 \\ 0 \\ 1 \end{bmatrix}$, on obtient: $$ \begin{bmatrix} R_x \\ R_y \\ R_z \end{bmatrix} = \begin{bmatrix} 0 \\ 0 \\ 1 \end{bmatrix} - 2 \cdot \left \langle \begin{bmatrix} 0 \\ 0 \\ 1 \end{bmatrix} , \begin{bmatrix} N_x \\ N_y \\ N_z \end{bmatrix} \right \rangle \cdot \begin{bmatrix} R_x \\ R_y \\ R_z \end{bmatrix} \quad.$$ Lorsque décomposée en indices cartésiens, l'équation donne: $$ \begin{align} R_x &= - 2 N_z R_x \\ R_y &= - 2 N_z R_y \\ R_z &= 1 - 2 N_z ^2 \\ \end{align}$$ On trouve alors que $ N_z = \sqrt{\frac{R_z - 1}{2}} $, que l'on peut ensuite substituer dans les deux équations précédentes pour trouver $ N_x = \frac{R_x}{\sqrt{2\left(1+R_z\right)}} $ et $ N_y = \frac{R_y}{\sqrt{2\left(1+R_z\right)}} $. Si on suppose que tous les rayons provenant de la sphère sont parallèles (soit que la caméra soit orthographique), on peut alors supposer que les coordonnées des pixels $(u, v)$ sont directement $(N_x, N_y)$.

Il suffit ensuite de générer une grille de $\theta \in \left\{ [\pi, 2\pi[ \; || \; [-\frac{\pi}{2}, \frac{\pi}{2}] \right\}$ et $\phi \in [0, \pi[$. Avec les équations ci-haut, il est possible de convertir ces coordonnées en $(x, y, z)$, puis obtenir $(u, v)$ à l'aide des équations de $N_x$ et $N_y$.


Figure 4. Conversion du format sphérique (gauche) à Latitude-Longitude (droite). Notez que la carte d'environnement sous format Latitude-Longitude est tournée de 180 degrés par rapport à la réalité (La carte est positionnée vu de la sphère vers la caméra et non vu de la caméra vers la sphère).

Rendu d'objets synthétiques dans des photos


Figure 5. Les images nécessaires pour effectuer la composition. De gauche à droite: l'image d'arrière-plan $I$, l'image rendue sans objets $E$, l'image rendue avec objets $R$ et le masque $M$ tiré du canal alpha de l'image de l'objet.

Une fois les quatre images de la figure 4 obtenues avec un logiciel d'édition 3D comme Blender et un engin de rendu, il est possible de les fusionner en une image composite à l'aide de l'équation $$ \mathrm{composite} = M \cdot R + (1-M) \cdot I + (1-M) \cdot (R-E) \cdot c \quad ,$$ où $c$ est un coefficient de mélange des ombres sur la scène locale et le reste de la notation décrit à la figure 4. Cette équation est tirée de [2]. Des exemples de composition sont disponibles à la figure 5.

Figure 6. Images composées.

On peut voir dans les deux premières images que je me suis fait photobomber par mon chat. Pour la deuxième image, la valeur de $c$ pourrait être ajustée pour que les contours des brins d'herbe soient moins visibles. La troisième image est le rendu de démonstration demandé.

Librairie de manipulation de cartes d'environnement à haute définition

Pour réaliser ce TP, j'ai créé la librairie SkyLibs. Celle-ci permet d'écrire (travail emprunté) et de lire (travail original) des fichiers .hdr et .exr (migration à Python 3 en collaboration avec Marc-André Gardner). Elle contient également une classe, EnvironmentMap, permettant de d'ouvrir et de convertir des cartes d'environnement en plusieurs systèmes de coordonnées. Ce projet, encore en développement, est basé sur l'équivalent Matlab, un travail de Prof. Lalonde.


Figure 7. Exemples de conversions en format Angular et Cube.


Citations

[1] Debevec, Paul E., and Jitendra Malik. "Recovering high dynamic range radiance maps from photographs." ACM SIGGRAPH 2008 classes. ACM, 2008.
[2] Debevec, Paul. "Rendering synthetic objects into real scenes: Bridging traditional and image-based graphics with global illumination and high dynamic range photography." ACM SIGGRAPH 2008 classes. ACM, 2008.