La première étape, après avoir chargé les images et les logarithmes naturels du temps d'exposition est de remplir les matrices A et B afin de résoudre une équation de type Ax+B=0. Ces matrices sont issues de l'équation de base g(Zij) = ln(Ei) + ln(tj). Les i représentent l'index d'un pixel, j représente les différentes images, Zij représente la valeur des pixels dans les différentes images, Ei représente la radiance à un pixel et g représente le logarithme de la fonction qui lie les pixels à la radiance et au temps d'exposition. Le logarithme est utilisé afin de linéariser les équations. On de connait pas g et on ne connaît pas la radiance. Il est cependant possible de résoudre l'équation en imposant un terme et en combinant les données de plusieurs images identiques, mais à différents temps d'exposition.
Afin d'éliminer le bruit, un deuxième terme est ajouté à l'équation à minimiser. Ce terme (situé après le lambda) vise à minimiser les variations dans la courbe et à obtenir un résultat lisse. Pour ce faire, la formule utilise la dérivée seconde. Le lambda sert à augmenter ou encore diminuer la pénalité.
La fonction W est une fonction qui sert à donner un poids aux pixels. En effet, pour trouver la radiance, on veut négliger les zones sous-exposées et surexposées des images. Le poids accordé par la fonction W est un triangle où un poids minimal est donné à un pixel blanc ou noir et un poids maximal est donné aux pixels gris.
Pour créer une image avec la radiance, on utilise le log2 (devient linéaire) de la radiance (ie L). À partir de L, on extrait les informations de base de l'image (retire les détails) avec un filtre bilatéral qui se rapproche d'un filtre gaussien, mais qui conserve les contours/traits. Une fois cela fait, on modifie la porté de l'image de Base et l'on remet les détail qui avaient été retirés. On ramène le résultat "dans une échelle de radiance" et on la multiplie à la chrominance pour retrouver une image.
Les pixels utiliés dans mon implémentation sont choisit de manière aléatoire. En général, 800 sont sélectionnés sur chaque image et des fois jusqu'à 2000. Cependant, 800 s'est avéré très souvent amplement suffisant.
Les images suivantes testent différents lambdas sur l'image. Son influence n'est pas énorme dans cet exemple. Cela veut certainement dire que le résultat de l'équation donne déjà une bonne courbe. Cela est certainement dû au grand nombre d'images et à la bonne qualité des entrées. Cela démontre la robustesse de l'algorithme avec autant de données.
Voici un exemple de la courbe g générée avec l'algorithme. On peut voir que la courbe est essentiellement presque la même (attention à l'échelle).
Avec la courbe de g, il est possible d'illustrer la radiance. Comme la plage de la radiance est très large, l'afficher simplement n'illustre pas grand chose. Voici plusieurs manières de le faire: (directe, r/(1+r), ln(r), sqrt(r))
Dans mes test, r/1+r et ln(r) se sont toujours avérés relativement bons comme manière d'affichage. Ils permettent de bien voir les différences de radiances.
L'essai suivant teste l'influence du filtre bilatéral. Il semble qu'il a peu d'influence sur cet image. Le filtre y est deux fois plus gros.
Les images suivantes démontrent ce qui a été jugé comme les meilleurs résultats et qui n'ont pas encore été montrés dans le rapport. Celles-ci ont demandé beaucoup d'essais/erreurs afin d'arriver à ce résultat.
Les images où un mouvement a eu lieu, le photographe a bougé, les conditions d'éclairage ont changés sont problématiques. Cela est dû au fait que l'hypothèse de départ n'est plus vrai, car un pixel dans une image ne représente plus le même points dans le monde physique pour les autres images. De plus, une modification dans l'éclairage invalide aussi l'hypothèse/relation entre les images.
Pour ce qui est de mon implémentation, certaines images dont le nombre de photo en entré est plus petit, sont plus difficiles à traiter et nécessitent davantage d'ajustements et de réglages avec les paramètres. Cela a amené des erreurs comme le canal ci-dessous. En effet, la différence avec un logiciel commercial (www.fotor.com/features/hdr.html) est assez importante. Le plus marquant est le ciel dont les nuages forment des aberrations et des couleurs qui ne devraient pas être là. De plus, pour St-Louis, le lambda corrige une aberration qui crée de petits carrés en arrière-plan.
© 2014 Charles Ricard