TP5: Insertion d'objets virtuels

HW5: Adding virtual objects

Date limite: 12 avril 2018 à 23h59

Deadline: 23h59 on April 12th, 2018

Résumé

Le but de ce projet est de vous familiariser avec les images à haute plage dynamique (High Dynamic Range ou HDR), l'éclairage à base d'images (Image Based Lighting ou IBL), et de leurs applications. À la fin de ce travail, vous serez en mesure de créer des images HDR à partir d'ensembles d'images à plage dynamique faible (Low Dynamic Range ou LDR) et, aussi, d'ajouter des objets 3D dans les photos en utilisant des techniques d'éclairage à base d'images.

La photographie HDR est la méthode de capture des photos contenant une plage dynamique plus grande que ce que les photos normales contiennent (c'est-à-dire qu'elles contiennent des valeurs de pixels en dehors de la plage standard des images LDR entre 0-255 et contiennent plus de précision). La plupart des méthodes pour créer des images HDR impliquent la fusion de plusieurs images LDR à diverses expositions, ce que vous ferez dans ce projet.

Les images HDR sont utilisées dans une grande variété d'applications, telles que l'amélioration du contraste, l'art hyper-réaliste, des ajustements d'intensité post-traitement, et l'éclairage à base d'images. Nous allons nous concentrer sur leur utilisation dans l'éclairage à base d'images, spécifiquement sur la "ré-illumination" d'objets virtuels. Une façon de ré-illuminer un objet est de capturer une image HDR panoramique 360 ​​degrés (omnidirectionnelle) d'une scène qui fournit des informations d'éclairage sur tous les angles incident à la caméra (d'où le terme éclairage à base d'images). La capture d'une telle image est difficile avec des caméras standards, car cela nécessite à la fois de l'assemblage de photos et de la conversion LDR à HDR. Une alternative plus facile consiste à capturer une photographie HDR d'un miroir sphérique ce qui fournit les mêmes informations d'éclairage omnidirectionnel (jusqu'à certaines limites physiques dépendant de la taille de la sphère et de la résolution de la caméra).

Dans ce TP, nous utiliserons l'approche du miroir sphérique. Avec cette image panoramique HDR, nous pouvons alors ré-illuminer des modèles 3D et les ajouter harmonieusement dans des photographies.

Le travail à effectuer est divisé en trois étapes principales:

  1. Capturer plusieurs expositions d'une sphère métallique;
  2. Convertir les images capturées en une carte de radiance à haute plage dynamique;
  3. Effectuer le rendu d'objets artificiels dans une photo en utilisant cette carte de radiance panoramique.

Chacune de ces étapes sont décrites plus bas.

Overview

The goal of this project is to familiarize yourself with high dynamic range (HDR) imaging, image-based lighting (IBL), and their applications. By the end of this project, you will be able to create HDR images from sequences of low dynamic range (LDR) images and also learn how to composite 3D models seamlessly into photographs using image-based lighting techniques.

HDR photography is the method of capturing photographs containing a greater dynamic range than what normal photographs contain (i.e. they store pixel values outside of the standard LDR range of 0-255 and contain higher precision). Most methods for creating HDR images involve the process of merging multiple LDR images at varying exposures, which is what you will do in this project.

HDR images are widely used by graphics and visual effects artists for a variety of applications, such as contrast enhancement, hyper-realistic art, post-process intensity adjustments, and image-based lighting. We will focus on their use in image-based lighting, specifically relighting virtual objects. One way to relight an object is to capture an 360 degree panoramic (omnidirectional) HDR photograph of a scene, which provides lighting information from all angles incident to the camera (hence the term image-based lighting). Capturing such an image is difficult with standard cameras, because it requires both panoramic image stitching and LDR to HDR conversion. An easier alternative is to capture an HDR photograph of a spherical mirror, which provides the same omni-directional lighting information (up to some physical limitations dependent on sphere size and camera resolution).

In this homework, we will take the spherical mirror approach. With this panoramic HDR image, we can then relight 3D models and composite them seamlessly into photographs.

This homework is divided into three main steps:

  1. Capturing multiple exposures of a metallic sphere;
  2. Converting these exposures into a single HDR radiance map;
  3. Rendering synthetic objects into a photograph using this panoramic radiance map.

The steps are described in more details below.

1. Capturer plusieurs expositions d'une sphère métallique

1. Capturing multiple exposures of a metallic sphere

Dans cette partie du travail, vous devez capturer plusieurs expositions d'une balle métallique placée dans la scène d'intérêt, et fusionner ces expositions en une seule image à haute plage dynamique.

Matériel nécessaire

Ce que vous avez besoin:

Necessary equipment

You will need:

Collecte de données

Pour collecter vos données,

  1. Choisissez une scène intéressante à photographier. La scène devrait avoir une surface plane sur laquelle vous pourrez placer votre miroir sphérique. Elle peut être intérieure ou extérieure. Si vous êtes à l'extérieur, vous devriez vous placer à l'ombre, le soleil vous causera probablement des problèmes.
  2. Trouvez une place fixe et rigide pour placer votre caméra. Un trépied est idéal, mais vous pouvez aussi utiliser un objet stable.
  3. Placez votre miroir sphérique sur une surface plate et assurez-vous qu'il ne bouge pas. Soyez certain que la sphère ne soit pas trop éloignée de la caméra; elle devrait occuper au moins 256x256 pixels dans l'image.
  4. Photographiez le miroir sphérique en utilisant au moins trois différents temps d'expositions. Soyez certain que la caméra ne bouge pas trop (de très petite variation sont ok, mais le point de vue devrait être fixe). Pour de meilleurs résultats, vos temps d'expositions devraient être au moins 4 fois plus long et plus court (±2 stops) que votre temps d'exposition moyen (par exemple, si votre temps moyen est de 1/40s, alors vous devriez avoir des temps d'expositions d'au moins 1/10s et 1/160s). Notez les temps d'exposition, ou assurez-vous que votre caméra enregistre cette information dans l'en-tête EXIF du fichier image.
  5. Retirez le miroir de la scène et, du même point de vue que les autres photos, prenez une autre photo de la scène avec un temps d'exposition normal (la plupart des pixels sont ni trop ni pas assez exposés). C'est dans cette image que vous allez insérer des objets virtuels.
  6. Après avoir capturé les images, chargez-les dans votre ordinateur. Dans un éditeur d'image (ou dans Matlab), découpez l'image manuellement pour conserver uniquement la sphère (voir l'exemple plus bas).
  7. De petites erreurs d'alignement pourraient se produire (dues à un déplacement de la caméra, ou une erreur de découpage). S'il y a des différences substantielles avec la position/rotation de la caméra visible dans l'ensemble d'images, tentez d'aligner les images manuellement, ou recommencez à l'étape 4.

Data collection

To collect your data,

  1. Find a good scene to photograph. The scene should have a flat surface to place your spherical mirror on (see my example below). Either indoors or outdoors will work. If you go outdoors, we recommend shooting in the shade, as the sun may cause problems.
  2. Find a fixed, rigid spot to place your camera. A tripod is best, but you can get away with less. The back of a chair, a desk, a shelve, etc. should work well enough.
  3. Place your spherical mirror on a flat surface, and make sure it doesn't roll by placing a cloth/bottle cap/etc under it. Make sure the sphere is not too far away from the camera; it should occupy at least a 256x256 block of pixels.
  4. Photograph the spherical mirror using at least three different exposures. Make sure the camera does not move too much (slight variations are OK, but the viewpoint should generally be fixed). For best results, your exposures should be at least 4 times longer and 4 times shorter (±2 stops) than your mid-level exposure (e.g. if your mid-level exposure is 1/40s, then you should have at least exposures of 1/10s and 1/160s; the greater the range the better). Record the exposure times, or make sure they are available in the EXIF header of the image file.
  5. Remove the mirror from the scene, and from the same viewpoint as the other photographs, take another picture of the scene at a normal exposure level (most pixels are neither over- or under-exposed). This will be the image that you will use for object insertion/compositing (the "background" image).
  6. After you copy all of the images to your computer, load the spherical mirror images (from step 4) into your favorite image editor and crop them down to contain only the sphere (see example below).
  7. Small alignment errors may occur (due to camera motion or cropping). If there are substantial differences in camera position/rotation among the set of images, re-take the photographs.

De gauche à droite: une photo de sphère (étape 4), sphère découpée (étape 6), scène vide (étape 5)
Left to right: a sphere photo (step 4), cut sphere (step 6), empty scene (step 5)

2. Convertir les images capturées en une carte de radiance à haute plage dynamique

2. Converting these exposures into a single HDR radiance map

HDR radiance map

Cette étape vise à calculer une carte de radiance HDR (High Dynamic Range) à partir de plusieurs expositions LDR (Low Dynamic Range). Pour ce faire, nous utiliserons l'algorithme vu durant le cours, et décrit dans les sections 2.1 et 2.2 de Debevec et Malik 1997.

Lisez attentivement cet article: le code, que vous pouvez utiliser directement, est disponible dans l'annexe A de l'article.

La valeur observée $Z_{i,j}$ d'un pixel $i$ dans une image $j$ est fonction de la radiance d'une scène $E_i$ (inconnue) et d'un temps d'exposition $\Delta t_j$ (connue):

\[ Z_{i,j} = f(E_i \times \Delta t_j) \,. \]

Afin de rendre le problème linéaire, posons $g=\log f^{-1}$:

\[ g(Z_{i,j}) = \log(E_i) + \log(\Delta t_j) \,, \]

voir l'équation 2 dans l'article de Debevec. Ces équations peuvent être écrites sous forme matricielle, et il est alors possible de résoudre à la fois pour $g(0), \ldots, g(255)$.

Afin de rendre les résultats encore plus robustes, il nous faudra deux détails supplémentaires:

We want to build an HDR radiance map from several LDR exposures. It is highly recommended that you read Sections 2.1 and 2.2 in Debevec and Malik 1997 to help understand this process. Below is a summary.

The observed pixel value Zij for pixel i in image j is a function of unknown scene radiance and known exposure duration:

\[ Z_{i,j} = f(E_i \times \Delta t_j). \]

Ei is the unknown scene radiance at pixel i, and scene radiance integrated over some time Ei x Δtj is the exposure at a given pixel. We will not solve for f, but for g=ln(f-1) which maps from pixel values (from 0 to 255) to the log of exposure values:

\[ g(Z_{i,j}) = \log(E_i) + \log(t_j) \]

(equation 2 in Debevec). Solving for g might seem impossible (and indeed, we only recover g up to a scale factor) because we know neither g nor Ei. The key observation is that the scene is static, and while we might not know the absolute value of Ei at each pixel i, we do know that the value remains constant across the image sequence.

To make the results robust, we consider two additional things:

3. Rendu d'objets synthétiques dans des photos

Dans cette dernière étape, nous utiliserons notre carte de radiance HDR comme source lumineuse pour effectuer de l'éclairage à base d'images et insérer des objets 3D dans la scène. Cela se divise en trois étapes:

  1. la modélisation de la scène;
  2. le rendu;
  3. la composition dans l'image originale.

Nous vous fournissons des instructions détaillées ci-bas. Si vous êtes intéressés, vous trouverez plus de détails sur cette approche dans un autre article du même Debevec, publié un an plus tard, soit en 1998.

Tout d'abord, téléchargez et installez la dernière version de Blender. Dans les fichiers fournis plus bas, trouvez le fichier .blend et ouvrez le avec le logiciel. Ce fichier .blend est celui qui a été utilisé pour créer le résultat dans le haut de la page. Pour créer ce fichier, les étapes ci-bas ont été effectuées (servez-vous du fichier donné comme exemple, mais vous devrez refaire ces étapes sur vos propres photos).

La capture d'écran suivante illustre l'interface de Blender (version 2.79a), et identifie les sections principales:

Rendering synthetic objects into photographs

Next, we will use our HDR radiance map as an image-based light, and insert 3D objects into the scene. This consists of 3 main parts:

  1. modeling the scene;
  2. rendering;
  3. compositing into the original background image.

Specific instructions follow below; if interested, see additional details in this other Debevec paper, published one year later.

Begin by downloading/installing the latest version of Blender here. In the example materials package below, locate the blend file and open it. This is the blend file used to create the result at the top of the page. The instructions below assume you will modify this file to create your own composite result, but feel free to create your own blend file from scratch if you are comfortable with Blender.

Modélisation de la scène

Pour insérer des objets dans une scène, nous devons, en plus de l'information d'illumination que nous avons capturée aux étapes précédentes, avoir une idée de la géométrie et des propriétés des surfaces de la scène. À cette étape, vous allez créer manuellement une géométrie approximative de la scène en utilisant Blender.

Une fois que le fichier .blend est ouvert dans Blender, ajoutez votre image d'arrière-plan à votre scène. Dans la fenêtre de visualisation 3D en bas à droite, trouvez "Background Images". Cliquez sur "Add image" et ensuite sur "Open" pour ajouter votre image d'arrière-plan de l'étape 5 de l'étape de collecte de données. Assurez-vous que votre point de vue soit par rapport à la perspective de la caméra en appuyant sur "View->Camera" (ou "View->Cameras->Active Camera"); vous devriez voir votre image à l'arrière-plan.

Ensuite, modélisez la "scène locale". Créez une scène 3-D simple (généralement, des plans suffisent) pour recréer la géométrie de la scène proche de l'endroit où vous voudriez insérer des objects. Pour de meilleurs résultats, cela devrait être fait proche d'où vous avez placé le miroir sphérique. Après que la scène 3-D ait été placée correctement, spécifiez les paramètres de surface ("materials"): sélectionnez une partie de la géométrie de la scène locale, allez à "Properties->Materials", ajoutez un matériel avec une BSDF "Diffuse" et modifiez la "Color" pour qu'elle ressemble approximativement à la couleur de la photo.

Ensuite, ajoutez votre image HDR (la carte de radiance créée précédemment) à la scène. Dans la languette "Properties->World", assurez-vous que Surface="Background" et Color="Environment Texture". Ajoutez le nom de votre image HDR sauvegardée dans le champ approprié sous "Environment Texture".

Finalement, insérez des objets synthétiques dans la scène. Vous pouvez utiliser les modèles standards à l'intérieur du fichier .blend inclus sur cette page, ou vous pouvez trouver vos propres modèles (e.g. Turbosquid, Google 3D Warehouse, DModelz, etc). Ajoutez aussi des matériaux intéressants à vos objets insérés. Ce tutoriel est une superbe introduction à la création de matériaux dans Blender. Une fois tout terminé, votre scène devrait ressembler à l'image de droite ci-dessous.

Modeling the scene

To insert objects, we must have some idea of the geometry and surface properties of the scene, as well as the lighting information that we captured in previous stages. In this step, you will manually create rough scene geometry/materials using Blender.

With the sample blend file open, add your background image to the scene. In the 3D view window near the bottom right, locate "Background Images". Make sure this is checked, and click "Add image", then click "Open" and locate your background image from step 5 of data collection. Make sure your view is from the camera's perspective by pressing View->Camera (or View->Cameras->Active Camera); you should see your image in view.

Next, model the "local scene." That is, add simple geometry (usually planes suffice) to recreate the geometry in the scene near where you'd like to insert objects. For best results, this should be close to where you placed the spherical mirror. Feel free to use the sample scene provided and move the vertices of the plane to match the surface you'd like to recreate (ignore the inserted bunny/teapot/etc for now). Once you're happy with the placement, add materials to the local scene: select a piece of local scene geometry, go to Properties->Materials, add a Diffuse BSDF material, and change the "Color" to roughly match the color from the photograph.

Then, add your HDR image (the radiance map made above) to the scene. In the Properties->World tab, make sure Surface="Background" and Color="Environment Texture". Locate your saved HDR image in the filename field below "Environment Texture".

Finally, insert synthetic objects into the scene. Feel free to use the standard models that I've included in the sample blend file, or find your own (e.g. Turbosquid, Google 3D Warehouse, DModelz, etc). Add interesting materials to your inserted objects as well. This tutorial is a great introduction to creating materials in Blender. Once finished, your scene should now look something like the right image below.


Scène Blender après: ajout de l'image d'arrière-plan, modélisation de la scène locale, insertion d'objets Blender scene after: loading background image, modeling local scene, inserting objects

Rendu

Nous pouvons maintenant effectuer le rendu de la scène. Assurez-vous que "Cycles Render" soit sélectionné dans le haut de l'interface de Blender et, ensuite, de faire le rendu de la scène (F12). Votre rendu pourrait être trop clair/sombre, car il existe un facteur d'échelle inconnu pour l'illumination: il doit donc être déterminé manuellement. Pour ce faire, ajustez l'intensité lumineuse (languette "Properties->World", ajustez le réglage "Strength" sous "Color" en conséquence). Une fois que vous êtes satisfaits de la luminosité, sauvegardez le résultat du rendu sur votre disque dur.

Cela n'est pas tout à fait le résultat final. Pour insérer les objets harmonieusement, nous devons suivre une procédure de composition décrite par Debevec (Section 6 de l'article de 1998).

D'abord, nous allons faire le rendu de la scène "vide" (sans les objets). Créer une copie de votre scène blender et nommez-la ibl-empty.blend. Ouvrez votre copie, retirez tous les objets, mais conservez la géométrie de votre scène locale. Faites le rendu de cette scène et sauvegardez le résultat.

Finalement, nous aurons besoin d'un masque binaire des objets. Le masque doit être 0 où il n'y a pas d'objets insérés et plus grand que 0 autrement. Créez une autre copie de votre scène et ouvrez-la (e.g. ibl-mask.blend). Nous pouvons créer le masque facilement en utilisant Blender; cela se fait en manipulant le matériel des objets et leurs propriétés de rendu:

  1. Dans le panneau en haut, assurez-vous qu'il soit écrit "Blender Render" (s'il est écrit quelque chose d'autre, e.g. "Cycles Render", changez cela pour "Blender Render")
  2. Sélectionnez un objet (clique droit dessus)
  3. Allez dans le panneau des matériaux ("Properties->Materials"; ressemble à un cercle noir/rouge)
  4. Retirez le "Material" en appuyant sur le 'x' (à gauche de "Data")
  5. Cliquez sur "New" pour ajouter un nouveau matériel
  6. Dans les propriétés du nouveau matériel, sous "Diffuse", changez "Intensity=1" et la couleur RGB = (1,1,1)
  7. Sous "Shading", sélectionnez la boîte "Shadeless"
  8. Répétez pour tous les objets inserés
  9. Dans "Properties->World", mettez la "Horizon RGB color = (0,0,0)"
  10. Faites le rendu de la scène et sauvegardez votre masque en PNG (ou n'importe quel autre format sans perte)

Rendering

We can now render the scene to see a preview of what the inserted objects will look like. Make sure "Cycles Render" is selected at the top of Blender's interface, and then render the scene (F12). Your rendering might be too bright/dark, which is caused because we don't know the absolute scale of the lighting, so this must be set manually. To fix, adjust the light intensity (Properties->World tab, adjust "Strength" setting under "Color" accordingly). Once you're happy with the brightness, save the rendered result to disk.

This is not quite the final result. To seamlessly insert the objects, we need to follow the compositing procedure outlined by Debevec (Section 6 of the paper).

First, we'll render the "empty" scene (without inserted objects). Create a copy of your blender scene and name it something like ibl-empty.blend. Open up the copy, and delete all of the inserted objects (but keep the local scene geometry). Render this scene and save the result.

Finally, we need to create an object mask. The mask should be 0 where no inserted objects exist, and greater than 0 otherwise. Create another duplicate of your scene and open it up (e.g. ibl-mask.blend). We can create the mask quickly using Blender by manipulating object materials and rendering properties:

  1. In the top panel, make sure it says "Blender Render" (if it says something else, e.g. Cycles Render, change it to Blender Render)
  2. Select an object (right click on it)
  3. Go to the materials panel (Properties->Materials; looks like a black/red circle)
  4. Remove the Material by pressing the 'x' (to the left of "Data")
  5. Click "New" to add a new material
  6. In the new material properties, under "Diffuse", change Intensity=1 and the RGB color = (1,1,1)
  7. Under "Shading", check the "Shadeless" box
  8. Repeat for all inserted objects
  9. In Properties->World, set the Horizon RGB color = (0,0,0)
  10. Render the scene and save your mask as a PNG (or some lossless format)

Images pour les étapes 3-9 ci-dessus. Visuals for steps 3-9 above.

Après ces étapes, vous devriez obtenir des images similaires à celles-ci:

After these steps, you should have the following three rendered images:


Image rendue avec objets (R), image rendue sans objets (E), masque des objets (M) Rendered image with objects, rendering without objects, object mask

Tutoriels sur Blender

Le tutoriel suivant pourrait vous être utile pour vous familiariser avec l'interface graphique de Blender:


De plus, cette page contient de l'information additionnelle sur le rajout d'un «matériel» sur une surface.

Composition

Pour compléter l'insertion d'objets, nous allons utiliser les trois images rendues précédemment pour effectuer une composition par "rendu différentiel". Cela peut être fait par une simple équation à appliquer pour chaque pixel. Si $R$ est l'image rendue avec les objets, $E$ l'image rendue sans les objets, $M$ le masque des objets et $I$ l'image d'arrière-plan, la composition finale $C$ est calculée avec:

\[ C = M R + (1-M)(I + c(R-E)) \,. \]

Cette équation est décrite dans la section 6 de l'article de Debevec 1998. Les deux premiers termes copient les objets insérés dans l'image d'arrière-plan et le troisième terme, modulé par $c$, ajoute les effets d'illumination des objets insérés (ombres, caustiques, les inter-réflexions, etc.). Fixez $c=1$ initialement, mais ensuite essayez différentes valeurs pour obtenir des ombres et inter-réflexion plus sombres ou plus claires. Un exemple d'un résultat de composition obtenu en utilisant cette approche est affichée en haut de la page.

Compositing

To finish the insertion, we will use the above rendered images to perform "differential render" compositing. This can be done using a simple pixel-wise equation. Let R be the rendered image with objects, E be the rendered image without objects, M be the object mask, and I be the background image. The final composite is computed with:

composite = M.*R + (1-M).*(I + (R-E).*c) 

This equation is described in sec. 6 of the 1998 Debevec paper. The first two terms effectively paste the inserted objects into the background image, and the third term adds the lighting effects of the inserted objects (shadows, caustics, interreflected light, etc), modulated by c. Set c=1 initially, but try different values to get darker or lighter shadows/interreflections. An example of a final compositing result achieved using this is at the top of the page.

Conseils

Quelques conseils pour calculer $g$:

Quelques conseils sur Blender:

Tips

Some hints on solving for g:

Some tips on using Blender:

Crédits supplémentaires

Essayez une de ces idées pour approfondir vos connaissances (et augmenter votre note):

Bells and Whistles

Try one of these ideas to increase your understanding on this subject (and increase your score):

Livrables

Comme lors des travaux précédents, celui-ci sera remis dans un format page Web. Rappel: le site Web n'a pas besoin d'être esthétiquement agréable; ne faites que décrire ce que vous avez fait.

Plus précisément, la page devrait contenir:

Deliverables

As in the previous homework, this one will be handed in a webpage format. Remember: the aesthetics of the website will not be evaluated, but it is important that the information be presented clearly.

More precisely, the webpage should:

Remise

Pour la remise de votre travail, créez un fichier tp5.zip qui contient:

Finalement, veuillez téléverser votre fichier tp5.zip sur le portail des cours avant la date limite. La politique des retards mentionnée dans le plan de cours sera appliquée. Pour toutes questions concernant la procédure de remise ou le travail lui-même, posez vos questions sur Piazza!

Attention! La taille limite permise sur le portail des cours est de 250MB.

Handing in procedure

For this homework, you must create a tp5.zip file. In this file you'll put:

Finally, you should upload this file (tp5.zip) on Pixel (http://pixel.fsg.ulaval.ca) before the deadline. The late submission policy described in the course plan will be applied. For any question regarding the submission process or the project as such, ask your questions on Piazza!

Beware! File size limit on Pixel is 50MB. Make sure that your tp5.zip file size does not exceed 50MB.

Liens rapides

Quick links

Remerciements

Merci à Derek Hoiem et Kevin Karsch d'avoir créé le TP original qui a servi d'inspiration pour celui-ci!

Thanks

Many thanks to Derek Hoiem and Kevin Karsch for creating the assignment which inspired this one!

Retour à la page web du cours.

Back to the class webpage.