Sous-sections

Déformation d'images

Dans cette partie, nous décrivons les techniques de déformation d'images basées sur des images de profondeurs. La problématique est la suivante : étant donnée une image obtenue à partir d'une caméra placée dans une scène, comment utiliser uniquement cette image pour construire un nouveau point de vue (une nouvelle image) pour une position de caméra différente. Ici, nous connaissons la profondeur des pixels, c'est à dire que nous disposons d'une représentation surfacique discrète de la scène et nous connaissons aussi les caractéristiques de la caméra (position, direction, matrice de transformation).


Reprojection de pixels

La façon directe permettant de transformer ces points dans l'espace d'une autre caméra est la reprojection de pixels. Le principe est d'effectuer deux changements de repère successifs pour chaque point de l'image de départ. Ainsi, cf. figure 1.29, $ p_{1}$ dans l'image $ I_{1}$ s'exprime dans l'espace de la scène par la transformation représentée par la matrice de transformation inverse du point de vue 1 ($ P^{-1}$), et donne le point $ p$ exprimé dans l'espace de la scène, soit $ p=P_{1}^{-1}.p_{1}$. Reste alors à projeter de façon conventionnelle le point $ p$ sur le plan de projection de la caméra 2, soit : $ p_{2}=P_{2}.p$ . Les matrices de transformation (linéaires) se concatènent et l'on obtient finalement : $ p_{2}=P_{2}.P_{1}^{-1}.p_{1}$ .

Cette technique nécessite l'emploi d'un tampon de profondeurs pour l'image 2 car plusieurs points de l'image de départ peuvent se projeter sur le même pixel de l'image de destination. De plus, les problèmes de visibilité et d'échantillonnage ne sont pas traités : l'image finale contient des trous (cf. image $ I_{2}$). Cette technique a été utilisée dans [DCV97,Gro98].

Figure 1.29: Principe de la rétroprojection de pixels
\includegraphics[%
width=0.90\columnwidth,
keepaspectratio]{eps/ea-retroprojection2.eps}


Déformation 3D d'images

Dans [McM97,McM95b], McMillan formalise les équations de reprojection. Il dérive de la profondeur classique la profondeur projective (projective depth) ou encore disparité généralisée (generalized disparity), pour laquelle l'expression des équations de reprojection est plus simple. La profondeur projective d'un pixel correspond au rapport de la distance focale de la caméra par la profondeur du point (cf. figure 1.30 page [*]). Ainsi, si l'on souhaite calculer le point $ p_{2}(x_{2},y_{2})$ de $ I_{2}$ à partir du point $ p_{1}(x_{1},y_{1})$ , de disparité généralisée $ \delta(x_{1},y_{1})$ , on a :

$\displaystyle x_{2}=\frac{\overrightarrow{a_{1}}.(\overrightarrow{b_{2}}\times\...
...C_{1}}.(\overrightarrow{a_{2}}\times\overrightarrow{b_{2}})\delta(x_{1},y_{1})}$

$\displaystyle y_{2}=\frac{\overrightarrow{a_{1}}.(\overrightarrow{c_{2}}\times\...
...C_{1}}.(\overrightarrow{a_{2}}\times\overrightarrow{b_{2}})\delta(x_{1},y_{1})}$

De plus, McMillan proposa une méthode permettant de gérer correctement la visibilité lors du rendu, sans utiliser de tampon de profondeur1.25 [McM95a], ainsi qu'une technique de reconstruction d'image incrémentale permettant de remplir l'image de destination par balayage de lignes direct. Cette technique fût appelée 3D Image Warping, et a été utilisée dans de très nombreux travaux, dont [MMB97,PZvG00,SGwHS98,CBL99] ainsi que dans [SP99,OBM00] dans lesquels cette technique a été étendue au rendu de cartes de déplacement orthogonales.

Figure 1.30: 3D Image Warping
\includegraphics[%
width=0.70\columnwidth,
keepaspectratio]{eps/ea-3d-warping.eps}

Parmi les utilisations du 3D Warping, les sprites with depth de Shade [SGwHS98], introduits en même temps que les LDI (section suivante) peuvent être vus comme une extension des nailboards de Schaufler. La profondeur du sprite est utilisée pour le déformer légèrement en fonction du point de vue, augmentant ainsi leur temps de vie. Bien sûr, la déformation ne peut dépasser un certain seuil à cause des problème de dé-occlusion (trous) qui se produisent lors de la déformation.

Une façon de combler les trous a été proposée dans [MMB97] par Mark et al. Ils accélèrent la visualisation de séquences vidéos en n'affichant que quelques images de la séquence et en interpolant par déformation 3D les images intermédiaires. Pour créer les images intermédiaires entre une image de départ $ I_{1}$ et une image d'arrivée $ I_{2}$ , ils déforment $ I_{1}$ et $ I_{2}$ selon un point de vue intermédiaire et superposent les deux images obtenues pour combler les trous (figure 1.31). Ce système va plus vite que l'extraction de la vidéo, surtout à de hautes résolutions d'image. Ils passent ainsi de 5Hz à 60Hz.

Figure 1.31: Post-Rendering 3D Warping [MMB97]. Les zones noires des images correpondent aux trous dûs aux effets de parallaxe.
\includegraphics[%
width=1.0\columnwidth,
height=6cm,
keepaspectratio]{eps/ea-post-rendering-3d-warping.eps}


Images à plans de profondeurs

A cause des problèmes de dé-occlusion, une seule image ne contient pas assez d'information pour générer un nouveau point de vue complet. Certaines parties de la scène peuvent être cachées dans l'image de référence et être visibles à partir d'un autre point de vue. Les LDI (''Layered Depth Images'', Images à Plans de Profondeurs) ont été spécifiquement conçues pour résoudre ce problème. Une LDI stocke plusieurs pixels par rayon optique, c'est à dire que chaque rayon intersecte plusieurs couches de la scène. Le principe des couches (Layers) est un concept très puissant en modélisation et en rendu. Max [MO95,Max96] a proposé d'utiliser un tampon de profondeur en couches (layered z-buffer) pour modéliser des arbres. Schaufler [Sch98] utilise des imposteurs en couche pour représenter des objets. Shade et al. [SGwHS98] ont généralisé le principe et proposé les LDI comme primitive de rendu, puis Chang et al. [CBL99] ont introduit les LDI-tree (LDI hiérarchiques) pour résoudre les problèmes d'échantillonnage inhérents aux LDI.

Shade et al. ont donc proposé les LDI pour résoudre les problèmes d'occlusion en stockant plusieurs points de la scène par pixel, tout en gardant la simplicité de la déformation d'image de McMillan. Une LDI peut être créée de plusieurs façons. Si on dispose d'un ensemble d'images de profondeurs de la scène, on peut les rétro-projeter sur la caméra de référence. On peut également effectuer un lancer de rayons et stocker les multiples intersections entre la scène et chaque rayon. Une fois la LDI construite, on dispose d'une liste de surfels par pixels. Le rendu s'effectue à l'aide de l'algorithme de déformation 3D d'images de McMillan, adapté de façon à ce que les trous soient comblés avec les informations stockées dans les couches de profondeurs des pixels. Les pixels étant dessinés d'arrière en avant, il est possible d'utiliser l'écrasement de point (splatting) directement afin d'améliorer la qualité de l'image en remplissant les trous qui peuvent néanmoins apparaître si la LDI n'est pas assez bien échantillonnée. Ceci permet un rééchantillonnage rapide des pixels de l'image. Dans leurs travaux, ils utilisent un splat de taille variable dépendant de la profondeur et de la normale à la surface. Une table d'indexation quantifiée peut être utilisée pour accélérer ce calcul et donc l'algorithme.

Cet algorithme comporte quand même quelques problèmes. Premièrement, les pixels subissent deux rééchantillonnages avant d'arriver à l'écran, ce qui dégrade la qualité de l'image. Deuxièmement, de l'information peut être perdue si une surface est mieux échantillonnée dans une image de base qu'à partir du point de vue de la LDI. Les performances sont moyennes : 8 à 10 FPS pour une résolution de 300x300 pixels sur un Pentium 300Mhz.

Chang et al. [CBL99] ont proposé les LDI-tree pour résoudre ces problèmes. Un LDI-tree est un octree comportant une LDI à chacun de ses noeuds, ainsi que sa boîte englobante. Une face de la boîte englobante est utilisée comme plan de projection (orthographique) pour les images de référence de la LDI. La LDI attachée à chaque noeud de l'octree contient uniquement les échantillons de points de l'objet qui sont contenus dans sa boîte englobante. Le LDI-tree est construit à partir d'images de référence en les rétroprojetant sur les LDI des cellules de l'octree, et en filtrant chaque pixel affecté d'une LDI dans les LDI des cellules parentes. Lors du rendu, l'octree est traversé de haut en bas. A chaque niveau un test est effectué pour déterminer si la LDI du noeud donne assez d'informations si elle est projetée sur le plan de la caméra, et si elle ne donne pas assez de détails, l'opération est effectuée sur les noeuds enfants. Une LDI est considérée comme donnant assez de détails si la taille d'un de ses pixels permet de recouvrir un pixel de l'image de destination. L'image de destination est implémentée sous la forme d'une LDI afin de gérer la visibilité. A la fin du rendu, les pixels projetés sur un même pixel sont triés en fonction de leur profondeur et mélangés à l'aide de leur composante de transparence afin d'obtenir la couleur finale du pixel.

Porquet Damien 2005-03-02