TP5: Insertion d'objets virtuels

Résumé

Ce travail a pour but d'implémenter un algorithme de génération de photos HDR à partir de photos LDR et d'insérer des objets virtuels dans une scène réelle.

Partie 1: Cartes de radiance HDR

Approche générale

Pour construire une carte de radiance HDR à partir de photos LDR, la méthode suivante est utilisée:

Tout d'abord, des photos d'une scène avec un miroir sphérique sont prises avec différents temps d'exposition afin d'obtenir une approximation générale de l'éclairage dans la scène. Une dernière photo est prise sans miroir sphérique pour l'insertion d'objets virtuels. Toutes les photos ont été prises avec une caméra DSLR avec trépied. Pour chaque scène, cinq photos ont été prises avec des temps d'exposition augmentant d'un facteur deux entre chaque photo. La scène sans miroir sphérique a quant à elle été photographiée avec le temps d'exposition moyen.

Ensuite, les photos sont découpées afin de seulement conserver le miroir dans la scène. Pour construire la carte de radiance HDR, l'algorithme de Debevec et Malik (1997) est utilisé. 150-200 points sur la sphère sont par la suite choisis afin de retrouver la fonction g représentant la relation entre la valeur d'un pixel et son exposition. Pour ce qui est de la fonction de pondération w, la fonction triangulaire proposée dans l'article est utilisée (voir première figure ci-dessous). Une fois les calculs effectués, on obtient la valeur de la fonction g pour des intensités de 0 à 255, ainsi que la radiance (à un facteur près) pour chacun des points utilisés dans le calcul de g. Ce calcul est effectué pour chacun des trois canaux de couleurs.

La dernière étape de l'algorithme consiste à moyenner les photos de la sphère à différents temps d'exposition en utilisant la fonction g, leurs temps d'exposition et une version modifiée de la fonction w établie précédemment. Cette fonction est modifiée afin d'être plus restrictive dans les valeurs de pixels considérées dans le calcul de la moyenne. Les intensités 0-3 et 252-255 sont négligées ici et sont considérées comme étant saturées ± du bruit et qu'elles n'offrent pas d'information utile. La fonction w modifiée est représentée ci-dessous à droite de la première fonction w. Enfin, la carte de radiance est obtenue en utilisant l'équation (6) du même article de Debevec et Malik. Le résultat final est une carte de log-radiance avec un facteur d'échelle inconnu. Ce facteur d'échelle est ensuite choisi manuellement en prenant l'exponentielle de la carte de radiance et la multipliant par un facteur alpha quelconque jusqu'à ce que le résultat soit cohérent visuellement avec les conditions d'éclairage lors de la prise de photos. Pour visualiser rapidement ces cartes, l'opérateur de Reinhard est utilisé. Leurs versions HDR peuvent ensuite être validées dans un visualisateur d'images HDR.

Résultats

Les cartes obtenues pour chacune des quatre scènes présentées dans ce travail sont affichées ici. Les cartes de radiance sont aussi représentées dans la prochaine section. Les résultats incluent aussi une représentation des points choisis pour calculer g, les courbes g pour les canaux R,G et B, ainsi que toutes les photos utilisées pour reconstruire la carte de radiance. Pour toutes les fonctions g, un facteur lambda de 5 est utilisé pour adoucir la pente de la fonction. Bien que les résultats ne soient pas tous super lisses, ils le sont suffisamment pour obtenir des cartes de radiances valides.

Première scène:

Photos utilisées:

Temps d'exposition en secondes: 1/1000,1/500,1/250,1/125,1/80.

Légende: Points sélectionnés pour trouver courbes d'exposition, courbes d'expositions pour canaux R,G et B, carte de radiance résultante affichée avec tone mapping Reinhard.

Comme on peut voir, les fonctions g résultantes sont douces et s'aplatissent aux extrémités. On peut aussi voir un peu de saturation dans la carte de radiance finale au dessus des portes. Cette saturation causée par le Soleil est due aux temps d'expositions utilisés pour construire la carte. Pour éviter cela, il aurait fallu prendre une ou deux photos avec des temps d'exposition inférieurs à 1/1000 seconde. Même si le miroir était à l'ombre, ceci n'était pas suffisant. Néanmoins, la carte de radiance obtenue demeure utilisable. Il n'y a pas de pixels aberrants.

Deuxième scène:

Photos utilisées:

Temps d'exposition en secondes: 1/60,1/30,1/15,1/8,1/4.

Légende: Points sélectionnés pour trouver courbes d'exposition, courbes d'expositions pour canaux R,G et B, carte de radiance résultante affichée avec tone mapping Reinhard.

On peut remarquer que les fonctions g sont moins lisses que dans la première scène, mais qu'ils ont des plateaux plus importants. En zoomant sur la carte finale, on peut trouver quelques pixels aberrants dans les portes, mais rien de majeur qui empêcherait d'utiliser cette carte comme source lumineuse. Encore une fois, ces zones de saturations sont causées par l'éclairage extérieur (Soleil + neige).

Troisième scène:

Photos utilisées:

Temps d'exposition en secondes: 1/2,4/5,8/5,16/5,6.

Légende: Points sélectionnés pour trouver courbes d'exposition, courbes d'expositions pour canaux R,G et B, carte de radiance résultante affichée avec tone mapping Reinhard.

Comme pour le cas précédent, les sources de lumière ont tendance à créer un effet de saturation dans la carte finale. Cependant, puisqu'il n'y a pas de "pixels morts" dans la carte, on peut supposer que les zones qui ont l'air saturées ont simplement de très hautes intensités. La fonction g est lisse pour la première moitié des valeurs d'intensité et devient plus "bruitée" dans la deuxième moitié.

Quatrième scène:

Photos utilisées:

Temps d'exposition en secondes: 1/2,4/5,8/5,16/5,6.

Légende: Points sélectionnés pour trouver courbes d'exposition, courbes d'expositions pour canaux R,G et B, carte de radiance résultante affichée avec tone mapping Reinhard.

Cet exemple est un cas où la carte de radiance calculée comporte des anomalies. Par exemple, le néon au plafond crée une zone de saturation avec pixels aberrants dans le centre de l'image. Ceci s'explique par le manque de photos où cette zone n'est pas saturée. On remarque aussi que la fonction g du canal bleu n'est pas propre, comparée aux deux autres courbes. Dès lors, la carte de radiance résultante est beaucoup moins bonne que les trois autres. Cela dit, elle sera quand même utilisée à la section suivante pour voir l'impact d'utiliser une carte de moins bonne qualité.

Partie 2: Rendus

Approche générale

Les rendus sont générés avec le logiciel Blender. Pour obtenir les résultats présentés ci-dessous, la méthode suivante est utilisée:

1) Construction de la scène dans Blender en utilisant une des photos des scènes vides. Des plans sont ajoutés aux endroits où les objets sont placés afin d'obtenir des ombres.
2) Choix des objets et de leurs matériaux.
3) Ajout de la carte de radiance sphérique de la scène comme source d'éclairage. Son intensité est modifiée jusqu'à ce que les objets soient illuminés et que des ombres apparaissent.
4) Génération du rendu de la scène avec les objets. Génération aussi du masque des objets de la scène.
5) Génération du rendu de la scène sans objets (avec plans).
6) Génération de la composition finale via MATLAB selon équation suivante: Composition = Masque*Rendu_Objets + (1-Masque)*(Photo + (Rendu_Objets-Rendu_Vide)*c).
6b) La variable c est un scalaire et est modifiée itérativement jusqu'à ce que la composition soit bonne.

Résultats

Pour chacune des quatre compositions réalisées dans ce travail, les résultats intermédiaires sont affichés en plus de la composition finale. Des détails concernant les scènes sont donnés pour chaque rendu. Les cartes de radiance utilisées sont aussi représentées dans cette section.

Rendu 1

Légende: Rendu avec objets, rendu sans objets, masque utilisé pour composition.

Légende: Scène originale, rendu final avec éclairage.

Étant donné que la zone dans la scène où il était possible de mettre des objets était petite, seulement deux des six objets proposés ont été utilisés dans cette composition. Plutôt que de mettre six petits objets, il a été préférable d'en mettre deux plus gros sur le plan. Le matériau de la face de singe a d'ailleurs été modifié afin de rendre le résultat plus intéressant. Le matériau utilisé est "Glossy BSDF-Sharp-blanc-roughness = 1/2". L'utilisation d'un matériau glossy permet de vérifier l'éclairage. On voit d'ailleurs bien la carte de radiance reprojetée sur la tête. Puisque la couleur de la scène est relativement sombre, il est difficile de voir les ombres sur le sol. Néanmoins, on peut remarquer une zone dans la composition qui tire sur le violet autour du lapin. On peut aussi voir une zone un peu plus sombre autour de la tête. Enfin, on peut noter que la tête est un peu trop réfléchissante pour qu'elle ait l'air totalement réaliste. Étant donné que la vue est vers le sol et que la scène est sombre, il est plus difficile d'analyser en détail l'impact réel de la composition sur le réalisme.

Rendu 2

Légende: Rendu avec objets, rendu sans objets, masque utilisé pour composition.

Légende: Scène originale, rendu final avec éclairage.

Ici, afin de bien voir les ombres, une scène plus claire a été utilisée. On note tout d'abord la présence de quatre objets au total, dont plusieurs superposés. En utilisant des objets de couleurs claires en dessous d'autres, on peut voir plus facilement les ombres. Tous les matériaux utilisés dans cette scène sont diffus. Étant donné que la scène est entièrement plane, un grand plan a pu être utilisé, facilitant ainsi la génération d'une composition réussie. En analysant le résultat, on peut voir les ombres sur l'assiette et sur la planche à découper, mais aussi les ombres de ces derniers sur le sol. Malheureusement, étant donné que le point de vue est encore vers le sol, les ombres sont moins intéressantes. Malgré tout, le résultat est bon.

Tasse à café - Source
Pomme - Source
Planche à découper - Source

Rendu 3 (Bonus)

Légende: Rendu avec objets, rendu sans objets, masque utilisé pour composition.

Légende: Scène originale, rendu final avec éclairage.

Flamant rose - Source
Orignal - Source

L'objectif ici était de tester la méthode avec des objets ayant des propriétés moins réalistes et de voir si le résultat semble réaliste tout de même. Puisque le flamant est très mince et grand, un deuxième plan a été utilisé pour lui. Le matériau utilisé est le suivant: Refraction BSDF-Beckmann-rose-roughness=0-IOR=1.45. Puisque l'objet est petit dans la scène finale, l'effet est réussi. Pour ce qui est de l'orignal, je trouvais intéressant d'utiliser un matériau et une couleur très peu réaliste pour en voir l'impact. Dès lors, le matériau utilisé est: Transluscent BSDF-Violet. Ses bois sont simplement une Diffuse BSDF beige. Contrairement au flamant, l'orignal semble définitivement avoir été ajouté dans la scène. Sa texture semble trop simple et trop "propre" pour qu'il soit réel. Enfin, comme dans le premier rendu, puisque la scène est sombre, les ombres des objets insérés sont difficilement distinguables.

La conclusion pour ce test est que même si l'éclairage est correct, il existe d'autres facteurs influençant notre perception du rendu, comme la couleur et la texture. Puisque les modèles ici sont lisses, ils semblent moins réels.

Rendu 4 (Bonus)

Légende: Rendu avec objets, rendu sans objets, masque utilisé pour composition.

Légende: Scène originale, rendu final avec éclairage.

Canard - Source
Oiseau - Source

Pour ce dernier rendu, l'objectif était d'utiliser une carte de radiance de basse qualité avec des objets aussi de basse qualité pour tester les limites de la méthode d'insertion d'objets. Le premier objet est un canard avec comme matériau une Transparent BSDF-Magenta. Le deuxième objet est un oiseau (modèle très simple) avec une Hair BSDF rouge et verte. Puisque la scène est relativement planaire, un seul plan est utilisé pour les deux objets. Comme pour les autres rendus, la couleur du plan correspond à la couleur de la scène réelle où le plan est déposé. Malheureusement ici, le plan ne se morphe pas avec la photo et ce, peu importe l'intensité de l'éclairage utilisé. Par contre, pour ce qui est des ombres, on peut voir qu'ils sont quand même corrects. Ceci étant dit, le résultat final semble peu réaliste. Comme prévu, on peut attribuer ceci à la qualité des objets insérés, ainsi qu'à l'éclairage utilisé.

Bonus: Tone Mapping

Pour ce bonus, l'algorithme de tone mapping de Durand et Dorsey a été implémenté. Ses performances seront comparées à celles de l'opérateur de Reinhard. L'article étant très peu clair sur la façon concrète de procéder pour effectuer du tone mapping, les articles de Tumblin (1999) et Schlick (1994) ont aussi dû être utilisés pour compléter les trous dans l'article de Durand. Les sources complètes pour ces deux articles se trouvent dans l'article de Durand. On peut résumer l'algorithme implémenté avec ces étapes:

1) Calcul des ratios U et V tels que U = R/G et V = R/B pour tous les pixels.
2) Calcul de l'image en intensité (teintes de gris)
3) Calcul du log10 des intensités.
4) Calcul de l'image de base en filtrant le résultat de l'étape 3 avec un filtre bilatéral.
5) Calcul de l'image de détails en prenant la différence du résultat de l'étape 3 avec le résultat de l'étape 4.
6) Mise à l'échelle des valeurs de l'image de base selon un facteur choisi manuellement.
7) Calcul de l'image finale en intensité en prenant 10^(base_img + detail_img).
8) Calcul du canal rouge de l'image final selon :R'= img_intensité_fin/(0.299 + 0.587U + 0.144V).
9) Calcul des deux autres canaux tels que G' = U*R' et B = V*R'.
10) Optionnel: Élévation de l'image finale à un scalaire X pour diminuer/augmenter intensité de l'image.

Résultats

Tous les résultats ci-dessous suivent le même format. Les deux premières images correspondent aux résultats de l'algorithme implémenté avec deux facteurs d'échelle différents. La troisième image correspond au résultat avec l'opérateur de Reinhard.


Image 1: scale = 1.2. Image 2: scale = 2.


Image 1: scale = 1.5. Image 2: scale = 2.


Image 1: scale = 1.5. Image 2: scale = 2.

Légende: Résultat de l'algorithme de Durand (Gauche et centre), Résultat avec opérateur de Reinhard (Droite).

Jardin - Source
Memorial Church - Source

On peut voir qu'en fonction du facteur d'échelle utilisé, l'implémentation de l'algorithme de Durand tend à réaliser des images plus claires que l'opérateur de Reinhard. Un désavantage de cette implémentation est qu'elle tend à jaunir l'éclairage blanc. On peut voir ce phénomène dans les images de l'église où les vitraux tirent sur le jaune. On peut aussi voir que l'algorithme a de la difficulté à gérer les fortes intensités, comme dans l'étang dans la troisième image. Tandis que l'opérateur de Reinhard rend l'eau plus simple, l'algorithme implémenté lui donne une couleur grisâtre/bleue. Pour le miroir sphérique, on peut voir que les résultats sont meilleurs que le résultat avec l'opérateur de Reinhard. Les couleurs sont plus riches et l'éclairage n'est pas diminué lors du traitement.

Enfin, suite aux résultats obtenus, on peut dire que l'algorithme de Durand tend à produire des images plus riches, mais qu'il n'est pas à toute épreuve. Compte tenu du peu de détails donnés dans l'article, les performances de l'algorithme vont dépendre de l'interprétation de l'article et des décisions prises pour les méthodes à implémenter (par exemple, ratios de couleurs de Schlick). L'opérateur de Reinhard est plus robuste, ne crée pas de biais dans le blanc et ne nécessite pas d'être testé itérativement pour obtenir une image de bonne qualité, contrairement à l'algorithme de Durand.

Conclusion

Ce travail m'a permis de me familiariser avec la création de modèles et de scènes 3D et aux techniques de composition pour ajouter des objets virtuels dans des scènes réelles, en plus de m'avoir permis de tester différentes méthodes de tone mapping.