CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Algo HDR (longue présentation)

deeplo
deeplo
Niveau 4
23 octobre 2013 à 23:25:40

Bonjour je code actuellement un algo pour faire de la photo type 'HDR'.

Je rappelle le principe brièvement qui est de prendre plusieurs photos de la meme scène avec des expositions différentes pour faire apparaitre dans chacune des photos des détails que les autres n'ont pas.
Par exemple une photo a contre jour, si l'on expose correctement le sujet, le plan derriere est completement cramé (blanc). A l'inverse si l'on expose pour avoir le détail du fond, le sujet est complètement sombre.
D'ou l'interet de prendre le fond de la photo sous exposée et prende le sujet de la photo surexposée.

Comme je ne savais pas par ou commencer, j'ai commencé à chercher des infos theoriques sur les prises de vue, les expositions etc...
Je n'ai utilisé que mon bon sens pour arriver au point ou j'en suis mais le résultat n'es pas satisfaisant d'ou mon appel au secours sur ce forum.
Je vais donc vous détailler mon raisonnement et j'espère que vous saurez me corriger si il y a des erreurs ou bien me guider si je ne vois pas la suite.

Parlons de photo noir et blanc pour simplifier le raisonnement mais je suppose que pour la couleur cela revient à travailler sur plusieurs plans.
Une image va du noir au blanc, de 0 à 255 pour chaque pixel. Mais chaque image est plus ou moins exposée ce qui signifie que le blanc d'une photo correspond a du blanc moins clair ou du gris ou du noir d'une autre photo exposée moins longtemps.
Si je resume l'idee de base c'est de dire que la scène finale à reconstruire possède une dynamique de lumiere
Il convient donc de faire le lien entre la valeur d'un pixel d'une photo avec sa valeur dans la nouvelle echelle (dynamique complète de la scène)

Tout d'abord listons les informations d'une photo
- ISO (sensibilité de la prise de vue)
- Temps d'exposition
- longueur de focale
- ouverture du diaphragme
La longueur de focale ne me semblait pas interessante pour l'algo donc je n'en ai pas tenu compte.

J'ai trouvé une formule qui permet d'avoir une information d'exposition (?) d'une photo en fonction de ses paramètres de prise de vue.

EXPOSITION = 2*log2(OUVERTURE) - log2(TEMPS)

avec OUVERTURE le diviseur de la focale et TEMPS le temps d'ouverture du diaphragme.
Pour une meme ouverture, plus le temps est long plus EXPOSITION est petit.

Avec cette formule, j'ai une valeur "relative", un score qui me permet de "placer" les images les une par rapport aux autres sur une echelle d'exposition.
donc je suis capable de placer les valeurs de pixels noirs de chaque photo les unes par rapport aux autres.

Maintenant, sur cette echelle d'exposition, il me faut placer les pixels blancs de chaque photo. Pour cela j'utilise le "tonal range" du capteur de mon appareil.
J'ai été sur le site de DxOMark, et j'ai pris la courbe qui donne une valeur de plage d'exposition en fonction de l'ISO.
Donc je suis capable de déterminer la difference maximale d'exposition entre mon blanc et mon noir de photo.

Du coup maintenant je connais ma plage d'exposition pour toutes mes photos :
cela va de EXPOSITION de la photo surexposée à EXPOSITION + plage(ISO) de la photo sous exposée.

Je suis donc capable de passer, pour chaque photo, d'une valeur 0-255 à une valeur décimale sur ma plage d'exposition finale de la scène (c'est une valeur flottante pour garder la dynamique)

----------

Maintenant je parcours chaque emplacement de pixel de la photo et récupère pour CHAQUE photo, les valeurs des pixels dans la nouvelle echelle d'exposition (la dynamique finale quoi)
AU départ je faisais simplement la moyenne de ces valeurs, mais cela n'allait pas car un noir de la photo surexposée est forcément un noir que l'on veut garder.
Mais ce noir est forcément "encore plus" noir dans les autres photos mais comme il y a saturation du noir dans les photo sous exposées du coup la valeur "00" de chaque photo va se reporter sur la dynamique finale
comme un noir, un gris foncé , un gris moyen, etc... en fonction du nombre de photos et la moyenne de tout ca donne un gris .
Une fois que j'ai ma valeur de sortie dans l'echelle de grande dynamique d'exposition, je "compresse cette echelle pour la ramener a des valeurs entre 0 et 255 en sortie.

Au final la photo reste très "plate" sans contraste : ok ya de l'information partout, dans les noirs et les blancs mais la resultante est surtout du gris.

Ensuite j'ai décidé de pondérer chaque valeur dans l'echelle d'exposition finale par la distance entre la valeur 0-255 et le "centre" de l'echelle de l'image.
Le centre de l'echelle d'une image depend de son exposition : l'image du milieu cela sera 128, mais pour l'image surexposée (si on a 3 images sera 255/3).
En fait je pondère pas l'inverse de cette distance au carré (il y a un article sur PID, Ponderation Inverse Distance sur wikipedia qui est très bien expliqué)
Avec cette méthode, j'obtiens un résultat meilleur mais je trouve que cela reste trop fade.

Ma première question est : faut-il que j'applique une courbe de gamma pour faire ressortir les élements de la photo avec
plus de contraste ?
Deuxième question, vu que je prend chaque valeur 0-255 des photos et que je les converti avec une formule qui a un log2, mon echelle
de sortie est une echelle avec une unite IL qui n'est pas linéaire mais moi je fait l'hypothese qu'elle l'est et j'applique la valeur 0 au minimum et la valeur 255 au maximum
Faut il repasser par une expo dans la compression de l'echelle de sortie ?
Troisème question : je suis parti de l'hypothese que l'algo HDR pouvait s'effectuer pixel par pixel sans aucun lien entre eux.
Faut il au contraire appliquer des pondérations différentes en fonctions des "zones" de l'image dans lesquelles on se trouve (a ce moment la ca devient deja plus chaud car je n'ai pas trop les bagages mathématiques pour ce qui est de la détection de contours etc...)
Ou bien il faut juste regarder localement la luminance moyenne pour savoir si l'on est dans une zone sombre ou claire et savoir depuis quelles photos prendre l'info ?

J'espère avoir été suffisamment clair dans mes explications (en fait je pense que non mais j'espere que cela va generer des questions et faire avancer mes reflexions)
Je vois bien que mes résultats concordent avec les principes que je voulais appliquer (garder des valeurs claires des images foncées et des valeurs foncees des images claires) du coup ca revient à garder les gris quoi.

Merci par avance

Romuald

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Programmation
  • Création de sites web
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment