TP5 - Insertion d'objets virtuels
GIF-7105 - Photographie algorithmique - Maxime Leclerc - 12 avril 2015
Le premier objectif de ce travail est de
créer la carte de radiance d'une balle métallique. La radiance est
la quantité d'énergie électromagnétique émise, réfléchie, transmise ou
reçue sur une surface. Cette carte est crée en format haute plage dynamique.
Ce format permet d'obtenir une plage de luminosité plus large que les techniques
standards utilisées en photographie.
Le second objectif du travail est de
convertir la carte de radiance d'un format sphérique vers un
format rectangulaire.
Le troisième objectif du travail est d'utiliser cette carte de radiance
afin d'
insérer des objets dans une photo.
Carte de radiance en format HDR
Carte de radiance rectangulaire
Insertion d'objets dans une photo
Carte de radiance HDR
La démarche pour obtenir la carte de radiance est la suivante:
- Choisir une scène avec une surface plane sur laquelle un miroir sphérique est placé.
- Fixer la position de la caméra.
- Photographier le miroir sphérique avec au moins trois temps d'exposition.
- Retirer le miroir de la scène et prendre une photo.
- Découper les images pour ne conserver que la sphère.
Conversion de la radiance en pixels
Formules pour retrouver la fonction g(z)
-
Retrouver g(z) pour chaque couleur avec gsolve.m et à partir
de:
- Un échantillon de pixels - Ceci permet de réduire l'utilisation de la mémoire et le temps d'exécution.
- Z - La valeur entre 0 et 255 de chaque pixel.
- Delta t - Le temps d'exposition.
- Lambda - La constante qui s'assure que la courbe de g(z) soit lisse. On cherche à minimiser la variation de la pente, c'est-à-dire, la dérivée seconde de g(z). On ajuste lambda afin que g(z) soit lisse et augmente continuellement.
- La pondération de chaque pixel - Une fonction triangulaire avec une amplitude maximale à Z=127.5 et dont la valeur est zéro à Z=0 et Z=255. On utilise donc surtout les pixels d'intensité moyenne qui ne sont pas trop bruités ni trop saturés.
- Calculer la radiance à partir de z, g(z) et delta t. Radiance = exp(sum(w(Z_R).*g_R(Z_R+1)-B,2)./sum(w(Z_R),2)).
Les résultats sont présentés plus bas.
On ne peut pas encore utiliser ces résultats à cette étape. En effet,
nous devons premièrement les convertir sous un format rectangulaire. Ensuite,
ils pourront être utilisés dans Blender pour insérer des objets synthétiques.
On voit bien cependant que l'algorithme combine correctement les différents
temps d'exposition. (Résultat A: 1/25, 1/50, 1/100. Résultat B: 1/40, 1/80,
1/160).
Il faut aussi prendre note que nous n'avons pas utilisé de reproduction
tonale locale ici. (C'est un crédit supplémentaire.) La reproduction tonale
local permet de mieux visualiser les résultats.
La prochaine étape permettra de mieux voir les résultats pour l'ensemble
de la pièce.
g(z)
Carte de radiance HDR sphérique des fichiers ressources
Carte de radiance HDR sphérique du résultat A
Carte de radiance HDR sphérique du résultat B
Transformation panoramique
Formules des vecteurs de réflexion
X, Y, Z, Phi et Theta
L'algorithme utilisé pour faire la transformation panoramique est le suivant:
- Calculer les vecteurs normaux N de la sphère. N_X et N_Y varient de -1 à 1 dans l'image sphérique. N_Z est obtenu en s'assurant que le rayon de la sphère est 1.
- V, les vecteurs de la direction d'observation orthographique sont constants (0,0,1).
- Calculer les vecteurs de réflexion R = V - 2 .* dot(V,N) .* N;.
- Calculer la longitude phi = arctan(R_Z/R_X).
- Calculer la latitude theta = arccos(R_Y).
- Utiliser scatteredInterpolant pour faire la transformation panoramique. Les lignes de la carte rectangulaires sont la latitude et les colonnes la longitude.
- Sauvegarder la carte rectangulaire en format HDR.
Carte de radiance rectangulaire
Les résultats sont présentés plus bas.
On ne peut pas encore utiliser ces résultats dans Blender pour insérer
des objets synthétiques.
On voit bien cependant que l'algorithme combine correctement les
différents temps d'exposition. (Résultat A: 1/25, 1/50, 1/100. Résultat
B: 1/40, 1/80, 1/160) puis transforme la sphère en latitude et longitude.
Encore une fois, nous n'avons pas utilisé de reproduction tonale locale
ici. (C'est un crédit supplémentaire.) La reproduction tonale local permet
de mieux visualiser les résultats.
Ce format rectangulaire permet de voir la disposition de la pièce dans
laquelle la photo a été prise. On voit par exemple les lumières et les
chaises dans le résultat A. Dans le résultat B, on voit les divans et les
fenêtres.
Carte de radiance HDR rectangulaire du résultat A
Carte de radiance HDR rectangulaire du résultat B
Rendu d'objets synthétiques
La procédure utilisée pour faire la modélisation et le rendu de la scène est la suivante:
- Ajouter l'image d'arrière-plan à la scène.
- Modéliser la scène en créant manuellement une géométrie approximative de la surface plane.
- Spécifier les paramètre des matériaux pour qu'ils ressemblent à la photo.
- Ajouter la carte de radiance HDR dans les propriétés du monde Blender.
- Insérer des objets synthétiques dans la scène.
- Faire le rendu avec Cycles Render.
- Faire un second rendu de la scène vide, sans les objets synthétiques.
- Faire un troisième rendu du masque binaire des objets synthétiques.
- Effectuer la composition des images. 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. c permet de contrôler les ombres et réflexions.
- composite= M.*R + (1-M).*I + (1-M).*(R-E).*c
Insertion d'objets synthétiques dans une photo
Résultat A
Résultat B
Photo A vide
Rendu A
Masque A
Rendu A vide
Photo B vide
Rendu B
Masque B
Rendu B vide
Crédits supplémentaires
Reproduction tonale locale
(30 points)
L'objectif est d'améliorer le contraste des images HDR. Voici l'algorithme
de Durand et Dorsey:
- Calculer l'intensité(I): carte_I = (carte_R+carte_G+carte_B)/3
- Calculer le log de l'intensité: L = log2(I)
- Filtrer avec un filtre bilatéral: B = bilateralFilter(L)
- Calculer les " détails" (detail layer): D = L - B.
- Normaliser la base: B' = (B - o) * s
- o = max(carte_B)
- s = 4.5/ (o - min(carte_B))
- Reconstruire l' intensité logarithmique: O = 2^(B' + D)
- Remettre les couleurs: R',G',B' = O * carte_chrom
- Appliquer une compression gamma. c arte_nouv = carte_nouv.^.8. (Sans la compression gamma le résultat sera trop sombre.)
On voit que le contraste est correctement amélioré pour le résultat A.
On voit plus de détails dans le résultat que dans chacune des trois
photo source.
De plus, on voit que la reproduction tonale locale donne de meilleur résultats
que les opérateurs globaux. L/(1+L) est trop sombre et a peu de contraste.
sqrt(L) est trop clair et a lui aussi peu de contraste.
Résultat
Source 1/3
Source 2/3
Source 3/3
Opérateur L/(1+L)
Opérateur sqrt(L)
Transformation panoramique en croix verticale
(10 points)
On désire projeter la carte dans un format: le format cubique. La stratégie
est la même que l'algorithme présenté plus haut: on effectue une transformation
géométrique qui converti l'espace latitude et longitude vers l'espace cube.
Les résultats sont intéressants car on peut bien voir l'intérieur de la
pièce contrairement aux deux projections précédentes. Certains logiciels
préfèrent utiliser certains formats de carte. Les différents formats peuvent
influencer la densité de pixels pour une région donnée.
Autres formats de cartes
Latitude et longitude
Cube
Résultat A
Résultat B