TP5: Mélanger le réel au virtuel (English version) Posez une question sur ce TP!

HW5: Adding virtual objects (Version française) Ask us a question!

Date limite: 10 avril 2024 à 23h59 Deadline: 23h59 on April 10th, 2024

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.

Dans ce TP, nous utiliserons l'approche du miroir sphérique. Une image HDR de ce miroir nous permettra de ré-illuminer des modèles 3D et de les composer harmonieusement dans des images.

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.

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

Matériel nécessaire

Ce dont 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 convertir en python 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:

N'oubliez pas d'enregistrer les images HDR dans un format compatible tel que HDR, EXR, ou TIFF.

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.

Read the paper carefully: the code, which you can directly translate into python, is available in Appendix A of the article.

The observed pixel value $Z_{i,j}$ for pixel $i$ in image $j$ is a function of unknown scene radiance $E_i$ and known exposure duration $\Delta t_j$:

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

$E_i$ is the unknown scene radiance at pixel $i$, and scene radiance integrated over some time $E_i \times \Delta t_j$ is the exposure at a given pixel. We will not solve for $f$, but for $g=\log 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 $E_i$. The key observation is that the scene is static, and while we might not know the absolute value of $E_i$ 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:

Remember to save your HDR images in a compatible format such as HDR, EXR, or TIFF.

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 quatre étapes:

  1. L'estimation les paramètres de la caméra et le plan de la scène;
  2. L'ajoute d'objets à la scène;
  3. Le rendu;
  4. La composition dans l'image originale.

Téléchargez tout d'abord ce fichier qui contient du matériel (image, objets virtuels, etc.) et qui vous permettra de bien suivre les étapes expliquées ci-bas. Vous pouvez vous en servir comme point de départ, mais vous devrez ensuite remplacer l'image d'arrière-plan par vos propres photos!

Si vous êtes intéressés, vous trouverez plus de détails sur cette approche dans un autre article du même Debevec.

3. Rendering synthetic objects into photographs

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

  1. Estimating the camera and ground plane parameters;
  2. Adding and matching HDR lighting and virtual objects to the scene;
  3. Rendering;
  4. Compositing into the original background image.

Download this file, which contains materials (image, virtual objects, etc.) that will allow you to follow the steps explained below. You can use it as a starting point, but you will eventually have to replace the background image with your own photos!

If interested, see additional details in this other Debevec paper.

Estimation de la caméra

Une fois que l'image HDR de l'environment est générée, la première étape à l'insertion d'objets est la modélisation d'une scène qui correspond à l'image d'arrière-plan. Cela peut être fait en identifiant un plan dans la scène d'arrière-plan, sur lequel nos objets virtuels seront placés, ainsi que la configuration de la caméra qui verrait le plan de cette perspective. Si vous êtes à l'aise avec la modélisation 3D avec Blender, vous pouvez modéliser manuellement la scène 3D et passer à la prochaine section.

L'outil libre-accès fSpy permet d'obternir le plan et la caméra facilement. Après avoir installé le logiciel, ouvrez l'image d'arrière-plan avec l'option "File -> Open Image" dans le menu du haut. Le programme devrait ressembler à ceci:

Notre objectif est de positionner le plan XY pour correspondre avec l'image. Pour ce faire, déplacez les quatre coins du rectangle pour obtenir deux lignes orthogonales (formant un rectangle projeté) et positionnez le centre du plan en déplaçant le point blanc.

Pour avoir un ZOOM sur l'image en déplaçant les points, appuyez sur SHIFT.

Si votre axe Z pointe vers le bas, changez simplement le signe d'un de vos Vanishing point axes (par exemple, Y à -Y ou X à -X).

Si vous connaissez la longueur focale de la caméra (ou si elle est disponible dans les metadata de l'image), vous pouvez la mentionner dans la section Focal length dans le menu de droite. Cela rendra l'approximation du logiciel plus robuste. Sinon, une valeur par défaut sera utilisée. La même chose s'applique au centre du plan image de la caméra, qui peut être mentionné dans la section Principal point ou laissé tel quel. En général, le placer au centre de l'image est une approximation suffisante (à moins que vous ayez la calibration des paramètres intrinsèques de votre caméra).

Le fonctionnement du logiciel fSpy est basé sur l'utilisation de lignes parallèles (définies manuellement par vous sur le plan XY) pour approximer l'horizon du monde et la ligne de fuite du plan XY. Si nous supposons que le plan XY est situé à l'origine 3D du monde sans rotation supplémentaire, nous pouvons interpréter la position de l'horizon comme une indication de la position de la caméra. Pour plus de détails sur l'obtention des paramètres de la caméra par géométrie projective, vous pouvez regarder le livre de Hartley et Zisserman.

Faites attention de sélectionner le plus grand rectangle que vous pouvez annoter avec confiance. Sinon, de petites différences de pixels introduisent de grandes différences dans les plans estimés (comme nous l'avons vu avec les homographies du TP4).

Lorsque vous êtes satifait du plan estimé, sélectionnez File -> Save As dans le menu du haut pour sauvegarder votre annotation. Assurez-vous d'utiliser l'extension .fspy dans le nom du fichier.

Camera Estimation

Once we have the HDR environment map, the first step to object insertion is constructing a local scene that matches our background image (see Figure 6 in Debevec's 1998 paper above for more details). This can be done efficiently by identifying a ground plane of the background scene, onto which our virtual objects will be placed, together with the camera configuration that would view the plane from that specific viewpoint. If you are comfortable with 3D modeling in Blender, feel free to skip to the next section and manually model the 3D scene, positioning the camera aligned with the background image.

Otherwise, we can obtain the ground plane and camera efficiently with the open-source tool fSpy. After unzipping the program in your desired location, go ahead and open the background image using the top bar's File -> Open Image menu. You should see something like this:

Our goal here is to position the XY plane such that the Z axis points up. To do this, drag the line vertices to orthogonal positions (forming a projected rectangle) and position the ground mesh (by draggin the white center). You can also not utilize Rectangle mode and set the Vanishing point axes in a different configuration, if that's easier for your image. Usually, though, rectangle mode is enough.

To zoom-in on the image when dragging the vertices, hold SHIFT.

If you find your Z axis is pointing down, simply change one of your Vanishing point axes to a negative (e.g., Y to -Y or X to -X).

If you know the focal length of your camera (or it is available in the image's metadata), you can set it on the Focal length portion of the right-hand side. This will make your approximation more robust. Otherwise, a generic value will be used. The same applies to the camera's image plane center, which you can adjust manually using the Principal point setting or leave it as-is. Usually, setting it to the image's midpoint is a good-enough approximation (unless you have already calibrated your camera's intrinsic parameters).

The whole concept behind fSpy is to utilize parallel lines (manually set by you on top of the ground plane) to approximate the world's horizon, or, in other words, the ground plane's vanishing line. If we assume the ground plane is located at the world's 3D origin with no additional rotation, we can instead interpret the position of the horizon to be an indication of the camera's position. For more details on obtaining camera parameters through projective geometry, check out Hartley and Zisserman's seminal book.

Make sure to provide the largest rectangle you can confidently annotate. Otherwise, small pixel differences may provide very degenerated planes (as we saw in the homographies of TP4).

Once you're happy with your plane, select the topbar's File -> Save As to store your annotation. Make sure to utilize the .fspy extension in the filename.

Blender

Pour effectuer le rendu des objets virtuels, nous utiliserons le logiciel libre Blender.

Blender

To perform virtual object insertion, we will be using the open source software Blender.

Modélisation de la scène

Les instructions ci-dessous supposent que vous modifierez le fichier fourni pour créer votre propre résultat composite, mais n'hésitez pas à créer votre propre fichier si vous êtes à l'aise avec Blender.

Une fois le fichier ibl.blend ouvert, vous devriez voir une interface similaire à celle-ci:

Voici une brève description de chacune des sections:

Pour importer la caméra fSpy, allez dans le menu du haut File -> Import -> fSpy. Assurez-vous de supprimer la caméra existante avant d'ajoutez la vôtre. Pour voir la scène de la perspective de la caméra, cliquez sur l'icone camera view.

Importez également l'image d'arrière-plan dans le compositeur (voir l'image ci-dessus). Il est possible que l'arrirère-plan soit légèrement transparent dans la vue 3D:

Pour régler l'opacité de l'arrière-plan, sélectionnez la caméra fSpy, puis allez dans les paramètres de la caméra (voir l'image ci-dessus), cherchez la section Background images et ajustez le curseur Opacity à 100%.

Ensuite, ajouter l'éclairage HDR. Pour ce faire, allez dans les paramètres du monde comme suit:

Assurez-vous que l'option Mirror Ball est activée. Suivez les instructions de l'image pour sélectionner votre fichier HDR, puis ajustez la force si la lumière est trop forte ou trop faible. Il peut également être nécessaire de tourner votre image HDR autour de l'origine en utilisant les options indiqués sur la première image ci-dessus. Un bon truc est d'utiliser une sphère miroir dans votre scène, comme celle du fichier fourni, et d'ajuster la rotation de votre image HDR en fonction de ses réflexions pour qu'elle corresponde à la photo. Un autre guide utile est la direction des ombres.

Il est maintenant temps d'ajouter vos objets! Ils peuvent être importés dans le menu File -> Import et apparaîtront dans la vue d'ensemble. Après avoir ajouté un objet, vous devez ajuster son échelle, sa translation et sa rotation pour qu'il soit bien placé sur le plan de la scène:

Il est aussi très important de changer le Pass Index de chaque nouvel objet à 1, comme indiqué ci-dessus sinon ils n'apparaîtront pas dans le masque binaire du compositeur.

Un bon truc pour positionner vos objets est de sélectionner l'objet Plane, d'aller dans ses paramètres comme indiqué ci-dessus, puis de chercher la section Visibility. Activez l'option Shadow Catcher. Ensuite, allez dans les Render Properties (icône de caméra grise, au-dessus des paramètres du monde dans le menu des propriétés). Là, cherchez Film et sélectionnez Transparent. Cela rendra votre plan transparent mais les ombres et les reflets des objets resteront visibles, vous donnant un aperçu de ce que la composition pourrait ressembler. N'oubliez pas de désactiver le shadow catcher lorsque vous avez terminé de positionner vos objets, sinon l'équation de Debevec ne fonctionnera pas! N'oubliez pas non plus de désactiver le film transparent, sinon vous aurez des problèmes de mélange alpha dans vos compositions.

Finalement, vous devez changer l'apparence de votre plan (très important pour les objets réfléchissants) pour qu'elle corresponde à l'image d'arrière-plan. Vous devez changer sa couleur et sa spécularité (i.e., à quel point la surface du plan doit être "brillante" et réfléchissante). Cela peut être fait en utilisant le slider de roughness, comme indiqué ci-dessous:

La fonction Shadow Catcher est également très utile ici, pour s'assurer que les réflexions correspondent à la surface du matériau de l'arrière-plan (par exemple, un sol en béton ne devrait pas réfléchir comme une table en bois poli).

Modeling the local scene

Open the provided ibl.blend file. 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.

At first glance, the Blender scene should look something like this:

Clockwise from the top-left, we have 6 main views: the viewport, outliner, properties, world shader editor, and compositor (for render passes). We'll go through them in a bit more detail soon.

Assuming you have the fSpy plug-in installed, the camera can be imported through the top bar's File -> Import -> fSpy. Make sure to delete the existing camera when you add yours. To view the scene from the camera's viewpoint, click on the camera view icon above. Now is also a good time to import the background image in the compositor (see the image above).

You may notice the background image in the viewport is slightly transparent:

To fix this, select your fSpy camera, then go to the camera settings (see the image above), look for the Background images section and set the Opacity slider to 100%.

Next, you need to add your HDR lighting. To do this, go to the world settings as follows:

Make sure the option Mirror Ball is enabled. Following the image's directions, select your HDR file, then adjust the strength in case the light is too strong or weak. It might also be necessary to rotate your HDR image around the origin using the sliders indicated on the first Blender image above. A good trick is to utilize a mirror sphere in your scene, like the one in the provided file, and adjust your HDR rotation by the reflections on it, as seen from the camera's viewpoint. Another useful guideline is the direction of the cast shadows: do they look coherent?

Next, you need to add your own objects. Meshes can be imported on the same File -> Import menu and will appear listed on the outliner. After adding an object, you must adjust its scale, translation, and rotation, so it looks right on top of the ground plane:

It is also very important to remember to change the Pass Index of every new object to 1, as indicated above, otherwise they won't show up in the compositor's binary mask.

A good tip to help positioning your objects is to select the Plane object, go to its settings like shown above, then look for the Visibility section. There, enable Shadow Catcher. Then, go to the Render Properties (gray camera icon, above the world settings on the properties menu). There, look for Film and select Transparent. This will make your plane transparent but the object shadows and highlights will remain visible, giving you a preview of what the composition would look like. Remember to disable the shadow catcher when you are done positioning your objects, though, otherwise Debevec's equation won't work! Also remember to disable the transparent film, otherwise you will get alpha blending issues in your compositions.

Finally, you need to change the color of your plane (very important for reflective objects) to match the background image. You also need to change how specular the plane surface should be (i.e., how "shiny" and reflective it should be). This can be done using the roughness slider, as shown below:

The shadow catcher feature is also very useful here, to make sure the reflections match the surface material in the background (e.g., a concrete floor should not reflect like a polished wooden table).

Rendu

Une fois que vous êtes satisfait de votre scène, allez dans la barre du haut et sélectionnez Render -> Render Image. Lorsque le rendu sera terminé (cela peut prendre un certain temps, selon la résolution de votre image), les quatre images nécessaires pour la composition seront sauvegardées dans le même dossier que votre fichier Blender.

Rendering

Once you're happy with your scene, go to the top bar and select Render -> Render Image. After the rendering is done (can take a while, depending on the resolution of your image) the four images needed for composition will be saved in the same folder as your blend file.



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)) \,. \] rendering

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. Vous pouvez implémenter cette étape en python.

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:

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

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. You can implement this step in python. 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:

Idées pour les discussions

L'objectif des discussions dans vos rapports est que vous nous fassiez part de vos réflexions sur vos résultats. Tentez d'être précis(es) dans vos descriptions. Voici quelques idées :

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:

Discussion Ideas

The objectif of the discussions in your reports is to share your reflections on your results. Try to be precise in your descriptions. Here are some ideas:

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 PAX!

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 the "portail des cours" 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 PAX!

Beware! File size limit on "portail" is 250MB. Make sure that your tp5.zip file size does not exceed 250MB.

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!