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. Avec cette image panoramique HDR, nous pouvons alors ré-illuminer des modèles 3D et les ajouter harmonieusement dans des images.
Le travail à effectuer est divisé en trois étapes principales:
Capturer plusieurs expositions d'une sphère métallique;
Convertir les images capturées en une carte de radiance à haute plage dynamique;
Effectuer le rendu d'objets artificiels dans une photo en utilisant cette carte de radiance panoramique.
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:
Capturing multiple exposures of a metallic sphere;
Converting these exposures into a single HDR radiance map;
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:
Un miroir sphérique (emprunté au professeur)
Une caméra vous permettant de contrôler l'exposition. Cette option est disponible sur tous les appareils photographiques à réflexe numérique (DSLR en anglais), la plupart des appareils photo compacts et même sur la plupart des téléphones intelligents en utilisant une application adaptée.
Un trépied, une surface rigide ou des mains très stables
Necessary equipment
You will need:
Spherical mirror (borrowed from your professor)
Camera with exposure control. This is available on all DSLRs (Digital single-lens reflex camera) and most point-and-shoots, and even possible with most mobile devices using the right app.
Tripod / rigid surface to hold camera / very stead hand
Collecte de données
Pour collecter vos données,
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.
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.
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.
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.
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.
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).
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,
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.
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.
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.
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.
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).
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).
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.
2. Convertir les images capturées en une carte de radiance à haute plage dynamique
2. Converting these exposures into a single 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}$:
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:
Afin d'enforcer la contrainte que $g$ soit lisse, il nous faudra minimiser la magnitude de la dérivée seconde de $g$. Puisque $g$ est une fonction discrétisée (définie uniquement sur des valeurs entières de $g(0)$ à $g(255)$, la dérivée seconde peut être approximée par:
\[
g^{\prime\prime}(x) = (g(x-1) - g(x)) - (g(x) - g(x+1)) = g(x-1) + g(x+1) - 2g(x) \,.
\]
Ces équations doivent être écrites pour toutes les valeurs de $g(1)$ à $g(254)$, car pour $g(0)$ et $g(255)$ la dérivée seconde est indéfinie. Ces contraintes sont combinées aux équations précédentes avec un facteur $\lambda$, qui indique l'importance de minimiser la dérivée seconde.
Chaque temps d'exposition nous donne uniquement de l'information fiable sur certains pixels (i.e. les pixels correctement exposés pour cette image). Pour les pixels sombres, la contribution relative du bruit est haute et, pour les pixels très clairs, le capteur aurait pu être saturé. Pour que nos estimations de $E_i$ soient plus précises, nous devons mesurer la contribution de chaque pixel selon l'équation 6 dans Debevec. Un exemple d'une fonction mesurant la contribution de chaque pixel $w$ est une fonction triangulaire avec une amplitude maximale à $Z=127.5$ et dont la valeur est zéro à $Z=0$ et $Z=255$. Cette pondération devrait être utilisée pour résoudre $g$ et lorsque vous utilisez $g$ pour créer la carte de radiance HDR pour tous les pixels.
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 this article carefully: the code, which you can use directly, 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:
We expect $g$ to be smooth. Debevec adds a constraint to our linear system which penalizes $g$ according to the magnitude of its second derivative. Since $g$ is discrete (defined only at integer values from $g(0)$ to $g(255)$ we can approximate the second derivative with finite differences:
\[
g^{\prime\prime}(x) = (g(x-1) - g(x)) - (g(x) - g(x+1)) = g(x-1) + g(x+1) - 2g(x) \,.
\]
We will have one such equation for each integer in the domain of g, except for $g(0)$ and $g(255)$ where the second derivative would be undefined.
Each exposure only gives us trustworthy information about certain pixels (i.e. the well exposed pixels for that image). For dark pixels the relative contribution of noise is high and for bright pixels the sensor may have been saturated. To make our estimates of $E_i$ more accurate we need to weight the contribution of each pixel according to Equation 6 in Debevec. An example of a weighting function $w$ is a triangle function that peaks at $Z=127.5$, and is zero at $Z=0$ and $Z=255$. This weighting should be used both when solving for $g$ and when using $g$ to build the HDR radiance map for all pixels.
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:
la modélisation de la scène;
le rendu;
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.
Blender
Pour effectuer le rendu des objets virtuels, nous utiliserons le logiciel libre Blender.
Tout d'abord, téléchargez et installez la dernière version de Blender (v2.79b). Dans les fichiers fournis plus bas, trouvez le fichier ibl.blend et ouvrez le avec le logiciel. Ce fichier ibl.blend est celui qui a été utilisé pour créer le résultat dans le haut de la page. Dans le cadre de ce TP, nous vous conseillons d'utiliser ce fichier comme point de départ et de le modifier pour vos propres images et objets.
Le tutoriel suivant pourrait vous être utile pour vous familiariser avec l'interface graphique de Blender:
La capture d'écran suivante illustre l'interface de Blender (version 2.79b), et identifie les sections principales (notez qu'elles peuvent être modifiées mais ces trois sections sont les plus importantes):
3. 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:
modeling the scene;
rendering;
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 (v2.79b). 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.
The following screenshot illustrates the Blender interface (version 2.79b) and identifies its main sections (note that they can be modified but these three are the most important):
Voici une brève description de chacune des sections:
Éditeur de graphe: Spécifie chacune des images qui doivent être rendues (voir section "Rendu" ci-bas).
Vue 3D: Spécifie la géométrie de la scène virtuelle (en 3D) (voir section "Modélisation de la scène" ci-bas).
Vue d'ensemble: Permet de spécifier les propriétés de chaque objet dans la scène.
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. Dans cette étape, vous verrez comment:
Modifier l'image d'arrière-plan;
Modifier la source lumineuse;
Modifier la "scène locale";
Rajouter des objets 3D dans la scène.
Modifier l'image d'arrière-plan: Dans la fenêtre "Vue 3D", cliquez sur "Background images" (dans la section à droite), et sélectionnez votre image "Source".
Pour bien voir l'image, 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").
Modifier la source lumineuse : Dans la fenêtre "Vue d'ensemble", cliquez sur l'onglet "World", puis dans la section "Surface". Sélectionnez votre image juste sous "Environment Texture". Assurez-vous que l'option "Mirror Ball" soit activée.
Vous pouvez également modifier l'intensité lumineuse de la source avec le paramètre "Strength".
Modifier la "scène locale": généralement, nous pouvons approximer la scène réelle près des objets avec des plans. La scène de base vous fournit un seul plan, mais vous pouvez en rajouter d'autres pour simuler, par exemple, des ombres sur les murs, des miroirs réels présents dans la scène, etc. Pour ce faire, vous pouvez rajouter des objets (des plans) et les orienter pour qu'ils soient alignés avec les plans réels dans la scène. Lorsque c'est fait, deux choses importantes doivent être validées dans l'onglet "Object" de la section "Vue d'ensemble":
L'objet doit être présent dans les deux premières "layers". Utilisez "shift-clic" pour sélectionner les deux premières.
Le "pass index" doit être de 0. Cela doit être fait pour éviter que cette scène locale apparaisse dans le masque de composition.
Finalement, spécifiez les paramètres de surface ("materials"): sélectionnez une des plans, 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 à cet endroit.
Rajouter des objets 3D dans la scène: vous pouvez rajouter les modèles 3D qui vous plaisent à 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, ou encore celui-ci, sont d'excellentes introductions à la création et au rajout de matériaux dans Blender. Lorsque vous avez rajouté et orienté votre objet, assurez-vous que les deux étapes suivantes soient effectuées correctement dans l'onglet "Object" de la section "Vue d'ensemble":
L'objet ne doit être présent que dans la première "layer".
Le "pass index" doit être de 1. Cela doit être fait pour s'assurer que l'objet apparaisse dans le masque de composition.
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. Note: The plane object will be rendered twice in two layers, go to "Properties->Object->Relations", check the first two layers with the Shift button pressed.
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. Note: the object will be rendered only once in the first layer. In order to get the object mask, pass an index to each object in "Properties->Object->Relations: Pass Index:1".
Once finished, your scene should now look something like the right image below.
Rendu
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). Nous pouvons directement construire le pipeline dans Blender et générer toutes les images nécessaires d'un seul coup.
C'est ce qui est illustré dans l'éditeur de graphe de Blender. Dans cette section, vous devez spécifier l'emplacement où les images seront sauvegardées. Pour ce faire, cliquez sur l'icône dans la boîte "File Output" et spécifiez l'emplacement sur votre disque dur.
Lorsque vous êtes prêt à effectuer le rendu, rendez-vous dans l'onglet "Render" de la section "Vue d'ensemble". Vous pouvez spécifier les dimensions des images produites par blender. Idéalement, elles devraient avoir la même dimension que votre image d'arrière-plan. Pour pré-visualiser le résultat sans avoir à attendre après un rendu (ce qui peut parfois être long), vous pouvez réduire le pourcentage de l'image produite, ou encore réduire le nombre d'échantillons utilisés pour chaque pixel. Pour générer vos résultats finaux, utilisez 100% de résolution, et augmentez le nombre d'échantillons afin d'obtenir des rendus de bonne qualité.
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. Vous pouvez implémenter cette étape en python ou en matlab directement.
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)) \,.
\]
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 or matlab directly. An example of a final compositing result achieved using this is at the top of the page.
Conseils
Quelques conseils pour calculer $g$:
N'utilisez pas tous les pixels disponibles autrement vous allez probablement manquer de mémoire ou bien avoir un temps d'exécution horriblement long. À la place, échantillonnez aléatoirement un ensemble de pixels (environ une centaine devrait suffire), mais assurez-vous que les pixels soient les mêmes pour toutes les images.
Utilisez l'équation 4 de l'article (i.e. matlab: w = @(z) double(128-abs(z-128))), python: w = lambda z: 128.0-np.abs(z-128.0) pour calculer $w$.
Essayez différentes valeurs de $\lambda$ pour retrouver $g$. Initialement, essayez $\lambda=1$, résolvez $g$ et affichez-le. Il devrait être lisse et augmenter continuellement. Si $\lambda$ est trop petit, $g$ sera bosselé.
Référez-vous à l'équation 6 dans l'article de 1997 pour utiliser $g$ et combiner toutes vos expositions dans une image finale. Notez que cela produit les valeurs log de la radiance, donc assurez-vous de faire l'exponentielle du résultat et de sauvegarder la radiance absolue.
Quelques conseils sur Blender:
Sauvegardez vos fichiers régulièrement!
Pour déplacer plus qu'un objet à la fois, sélectionnez plusieurs objets en utilisant la touche shift. Appuyez sur 'a' pour désélectionner tous les objects/vertex.
Vous pouvez modifier les vertex directement en "Edit mode" (la touche tab change entre le "Object mode" et le "Edit mode").
Tips
Some hints on solving for $g$:
When providing input, don't use all available pixels, otherwise you will likely run out of memory / have very slow run times. To overcome this problem, just randomly sample a set of pixels (100 or so can suffice), but make sure all pixels are the same for each exposure.
The weighting function $w$ should be implemented using Eq. 4 from the paper (i.e. matlab: w = @(z) double(128-abs(z-128)), python: w = lambda z: 128.0-np.abs(z-128.0)).
Try different $lambda$ values for recovering $g$. Try $lambda=1$ initially, then solve for $g$ and plot it. It should be smooth and continuously increasing. If $lambda$ is too small, $g$ will be bumpy.
Refer to Eq. 6 in the 1997 paper for using $g$ and combining all of your exposures into a final image. Note that this produces log radiance values, so make sure to exponentiate the result and save absolute radiance.
Some tips on using Blender:
Save your Blender file regularly!
To move more than one object at once, select multiple objects using shift. Pressing 'a' deselects all objects/vertices.
You can edit vertices directly in "Edit mode" (tab toggles between Object and Edit modes).
For image-based lighting, the camera should always be pointed such that the +z axis is up, and the +x axis is forward (as it is in the sample blend file in the project materials). This is the coordinate system used by Blender when applying an image-based light to the scene; otherwise your IBL will have incorrect orientation w.r.t. the scene.
Crédits supplémentaires
Essayez une de ces idées pour approfondir vos connaissances (et augmenter votre note):
(10 points par scène, maximum 20 points) Insérez des objets virtuels dans plus de deux scènes! Pour être comptabilisées, vos scènes additionnelles devront être décrites de la même façon que les deux scènes obligatoires (voir dans la section "Évaluation" plus bas). De plus, ces scènes additionnelles ne peuvent pas contenir les objets présents dans le fichier .blend fourni en exemple.
(jusqu'à 15 points) Pour 10 points, implémentez une fonction de conversion entre l'image de la sphère et une représentation en "latitude-longitude" de votre carte d'environnement. Rappel: la représentation "latitude-longitude" est une image de résolution N lignes x 2N colonnes, où les lignes représentent l'élévation (de haut en bas, de pi à -pi), et les colonnes l'azimuth (de gauche à droite de -pi à pi). Affichez les cartes d'environnement de vos deux scènes avec cette nouvelle représentation. Pour 5 points supplémentaires, implémentez la conversion inverse (de "lat-long" vers "sphère").
(20 points) Reproduction tonale locale. Les images HDR peuvent également être utilisées pour créer des images hyper-réaliste avec un contraste amélioré. Ce papier décrit une technique simple pour augmenter le contraste des images en utilisant un opérateur de reproduction tonale locale qui comprime efficacement la gamme dynamique de la photo dans un format visualisable tout en préservant les détails et le contraste. Implémentez la méthode présentée dans l'article et comparez vos résultats à d'autres opérateurs de reproduction tonale, par exemple celui de Reinhard vu dans le cours (15 points pour la méthode de Durand et ses résultats, 5 points pour la comparaison). Vous n'avez pas à implémenter le filtre bilatéral vous-mêmes, vous pouvez vous trouver une implémentation sur Internet (n'oubliez pas de citer vos sources cependant). Vous trouverez quelques exemples d'images HDR ici.
(10 points par scène, maximum 20 points) Adaptez l'éclairage à l'emplacement dans la scène. L'éclairage capturé par la sphère n'est valide qu'à l'endroit où la sphère est placée dans la scène. Donc, si on voulait placer plusieurs objets dans la scène, il faudrait idéalement capturer des sphères métalliques à tous ces endroits. Pour ces crédits supplémentaires, vous pouvez utiliser l'une des 3 scènes que nous avons déjà capturé en HDR pour vous: scène 0, scène 1, scène 2. Insérez des objets différents aux endroits correspondants à chacune des sphères métalliques. Illustrez vos résultats, et comparez à ce que vous obtenez si vous illuminez tous les objets avec la même source lumineuse (par exemple, une des sphères située près du centre de l'image).
Bells and Whistles
Try one of these ideas to increase your understanding on this subject (and increase your score):
(5 points per scene, max 20 points) Insert virtual objects into more than 2 scenes! To count, your new scenes must be described in the same way as your mandatory scenes (see "Evaluation" below). These new scenes may not contain the objects in the example .blend file.
(up to 20 points) Photographer/tripod removal. If you look closely at your mirror ball images, you'll notice that the photographer (you) and/or your tripod is visible, and probably occupies up a decent sized portion of the mirror's reflection. For these extra points, implement one of the following methods to remove the photographer: (a) cut out the photographer and use in-painting/hole-filling to fill in the hole with background pixels, or (b) use Debevec's method for removing the photographer (outlined here. For steps 3-5; feel free to use Debevec's HDRShop for doing the panoramic rotations/blending). The second option works better, but requires you to create an HDR mirror ball image from two different viewpoints, and then merge them together using blending and panoramic rotations.
(up to 30 points) Local tonemapping operator. HDR images can also be used to create hyper-realistic and contrast enhanced LDR images. This paper describes a simple technique for increasing the contrast of images by using a local tonemapping operator, which effectively compresses the photo's dynamic range into a displayable format while still preserving detail and contrast. Implement the method found in the paper and compare your results to other tonemapping operations. You can use this bilateral filter code in your implementation. You can find some example HDR images here.
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:
(30 pts, 20 pour les étudiants gradués) Pour une des scènes que vous aurez photographiée, présentez et décrivez brièvement tous les résultats intermédiaires nécessaires au calcul de la radiance:
La collecte de données (nombre de photos, expositions, etc.), affichez les photos capturées;
La fonction g estimée, discutez de l'influence du facteur $\lambda$;
La carte de radiance obtenue en log (calculez le log d'une version «grayscale» de l'image obtenue);
La carte de radiance obtenue en RGB (utilisez une méthode de reproduction tonale simple pour afficher votre image HDR).
(70 pts, 60 pour les étudiants gradués) Rendu d'objets synthétiques dans deux de vos photos:
Votre première photo peut contenir les mêmes objets que la scène .blend fournie en exemple.
La deuxième photo doit contenir des objets différents, avec des propriétés différentes. Soyez créatifs!
Expliquez vos scènes: comment la scène (plans) a-t-elle été modélisée? Quels matériaux avez vous employés? Couleurs? etc. Montrez des images de rendu avant et après la composition. Montrez et discutez vos résultats.
(N pts) pour les crédits supplémentaire. Rappel: les étudiants gradués doivent livrer au moins 20 pts de crédits supplémentaires.
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:
(30 pts, 20 pts for graduate students) Explain how you recovered your HDR radiance maps. You should describe what you did for the data collection, what you have taken as a weighting function, how you calculated g and how you calculated the radiance. Illustrate your results (you can use a simple tone mapping operator to display your HDR images).
(70 pts, 60 pts for graduate students) Rendering synthetic objects into two of your own photographs:
Your first photo can contain the same objects as the example .blend scene.
Your second photo must contain different objects, with different material properties. Be creative!
Explain your scene: How was the scene (planes) modeled? What materials have you used? Colors? etc. Show rendered images before and after the composition. Show and discuss your results.
(N pts) for any bells and/or whistles you've added in. Reminder: graduate students must add to their assignment at least 20 pts worth of bells and whistles.
Remise
Pour la remise de votre travail, créez un fichier tp5.zip qui contient:
Votre rapport en format HTML dans un dossier tp5/web. Vos images doivent être dans un dossier tp5/web/images.
Votre page principale doit être tp5/web/index.html. De plus, assurez-vous qu'il n'y a aucun caractère spécial (accent, ponctuation, espace, etc.) dans les noms de vos fichiers, images, etc.
Votre code Matlab doit être dans un dossier tp5/code. N'incluez pas les images que vous avez utilisées pour produire vos résultats dans ce dossier dans le but de ne pas alourdir le fichier.
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:
Your report in an HTML format inside a folder named tp5/web. Your images for this web page should be inside a folder named tp5/web/images.
Your main page has to be tp5/web/index.html. Make sure none of the files have special characters (e.g. accents, punctuation, spaces, etc.) in their filenames.
Your Matlab code should be put inside the folder tp5/code. Do not include the images you have used to generate your results inside this folder, as this will likely generate huge files.
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 "portail" is 250MB. Make sure that your tp5.zip file size does not exceed 250MB.