Traitement d'image et HDR à destination du web

a marqué ce sujet comme résolu.

Salut à tous,

Après une discussion avec Kje je viens poser la question ici.

Toujours dans mon approfondissement des techniques de traitement d'image je suis en train de bosser sur un algorithme d'HDR. Le principe étant assez complexe comme algorithme, j'ai essayé de simplifier au maximum.

En gros, si j'ai bien compris le principe je pars de 3 photos : 1 sous exposée, 1 sur exposée et 1 "normale" pour en recréer une très belle. En gros, si j'ai bien saisi, cela permet de prendre la meilleure partie de chaque image pour en faire une seule de grande qualité.

Je m'étais basé de cette source : http://www.developpez.net/forums/d887708/general-developpement/algorithme-mathematiques/traitement-d-images/creation-d-image-hdr/

A moins que je n'ai mal compris.

Mon système est fait suite à un upload de photo sur u site web (php étant la techno que je maîtrise le mieux d'ou ce choix).

Pour cela j'ai commencé par du pixel par pixel mais la méthode est très lourde.

Avez vous des ressources sur la création d'image HDR dans un environnement web ?

Merci Florian

Salut,

Il y a pas mal d'algos différent pour faire ce genre de choses et la majorité ont souvent pas mal de paremètres.

Mais bref, allons y par étape. Dans le liens que tu donne, je ne vois qu'une longue discussion de quelqu'un qui cherche un algo. Peux tu me dire précisément quel message décrit l'algorithme que tu souhaite implémenter ?

Salut,

Ta définition du HDR est un peu vague. Le but de cette technique est générallement d'obtenir une dynamique d'image importante. La dynamique d'image est la différence entre le pixel de plus haute valeur et le pixel de plus faible valeur (si tu prends le noir et blanc, la valeur du pixel c'est ça luminosité).

Le HDR vise à combiner différentes images pour obtenir une dynamique plus grande (High dynamique range). Pour cela on prend plusieurs cliché est on exploite la meilleure partie de chaque image. Dans une image sous-ex, les parties les plus claires sont correctement exposées (les nuages par exemple). Dans une image sur-exposée on peut se servir des zones normalement sombre (ombres, par exemple).

Le but est de composer ces zones pour ne plus obtenir ni de zones bouchées ni cramées. De là à dire que ça rend une image "très belle", il y a un monde… ;)

Si tu traites tes photos en PHP, tu risque de ne pas te retrouver avec des opérations très rapides. Difficile d'en dire plus sans voir le code. Pour t'inspirer tu peux jeter un coup d'oeil aux doc d'OpenCV (et au code aussi) qui cite parfois des références vers des livres ou papiers (en anglais) pour plus de détails.

Bonne continuation,

Anto59290

(Message complémentaire de Kje entre temps)

@Anto59290 : La dynamique serait pas plutôt liée à la perception d'une plus grande différence de luminosité au niveau "réel" ? Parce que pour moi une image, son pixel le plus lumineux il sera toujours limité à 255 255 255 et le plus sombre à 0 0 0. (Vraie question, je me demande juste si c'est moi qui me trompe de vocabulaire). Le HDR servant alors à palier la faible dynamique des capteurs photos.

Sinon, pour aider un peu le sujet, il me semblait que le HDR se faisait avec deux images seulement, non ?

+0 -0

@Anto59290 : La dynamique serait pas plutôt liée à la perception d'une plus grande différence de luminosité au niveau "réel" ? Parce que pour moi une image, son pixel le plus lumineux il sera toujours limité à 255 255 255 et le plus sombre à 0 0 0. (Vraie question, je me demande juste si c'est moi qui me trompe de vocabulaire). Le HDR servant alors à palier la faible dynamique des capteurs photos.

Exactement, oui. C'est pour ça que le nom "HDR" est assez mauvais pour l'usage qu'on en fait. En réalité, on créé une image HDR, mais comme les écrans classiques ne peuvent pas les afficher (leur dynamique est beaucoup plus grande que celle de l'écran), on fait du "tone mapping", pour en gros re-compresser cette dynamique dans le range affichable par un écran, le range encodable dans un JPG, donc RGB 0 - 255.

Sinon, pour aider un peu le sujet, il me semblait que le HDR se faisait avec deux images seulement, non ?

Phigger

Un RAW, 2 JPEG, 3 RAW, 25 RAW, 50 JPEG, c'est égal. De nos jours le HDR se fait généralement à partir d'une seule image. Mais la technique s'applique à autant d'images que tu veux.

+1 -0

En fait pour expliquer ça plus simplement : les écrans actuels (et les formats de fichiers tradi tel que le JPEG) ne sont capable d'avoir que 256 niveau de luminosité différents (c'est pas tout à fait exact mais c'est le principe). Le fait est que l'oeil humain est capable d'en percevoir bien plus. Comment faire en sorte pour rendre une image avec des grandes différences de luminosité ? C'est tout le principe des techniques qu'on nomme, à tord comme le précise Victor, HDR.

Il y a deux étapes essentiel :

  • obtenir une image HDR (ou grossièrement on utilise des flottant pour les couleurs au lieu de nombre de 0 à 255 ou bien de gros entiers)
  • on transforme cette image HDR dans la game gérable par les fichiers traditionnel.

La première étape peut être faite de plusieurs façons. La première est d'utiliser un appareil qui capture directement en HDR (ça existe). Une autre, assez courante, est d'utiliser plusieurs photos de la même chose avec différentes expositions. On peut alors les combiner pour tirer de chacune d'elle le max d'infos (la dynamique des zones sombres des photos surexposé, et inversement).

La deuxième étape, comme expliqué par Victor, s'appel le tone mapping. Il y a des tonnes d'algos. Mais comme on recherche dans ce cadre à "compresser de l'information" il y a forcément une perte. Tout l'intérêt de ces techniques est d'obtenir celle qui est la plus "jolie" (ce qui est très relatif)

Pour implémenter ça il faut une bonne lib de calcul numérique (dans le monde python numpy par ex) ou une lib d'image qui accepte de faire des images avec des flottant.

En effet kje pas d’algo dans le lien donné mais des pistes simples d’implémentation de l’amélioration de photos en partant de 3 photos.

J’ai du mal à concevoir le départ : j’ai 3 photos bien différente, je suis donc bien obligé de réaliser un traitement pixel par pixel pour obtenir les informations nécessaires au traitement ensuite, non ?

Je vais aller me renseigner sur le tone mapping et les images avec flottant.

Cela semble bien plus compliqué qu’imaginé.

Je pensais faire une analyse pixel par pixel des 3 images, réalisé une genre de "moyenne" et redessiné ce pixel moyen. Cela permettrait de corriger les zones sous exposée et surexposée.

Erreur dans mon raisonnement ?

Merci à tous pour votre participation Florian

J’ai du mal à concevoir le départ : j’ai 3 photos bien différente, je suis donc bien obligé de réaliser un traitement pixel par pixel pour obtenir les informations nécessaires au traitement ensuite, non ?

En fait quand je dis "il ne faut pas faire du traitement pixel par pixel dans un langage interprété" il faut comprendre "il faut utiliser une fonction qui le fait pour toi".

Par exemple, si on parle de moyenne, avec les bonne lib, tu peux faire des choses comme :

1
resultat = (im1 + im2 + im3)/3

Il y aura bien une moyenne faite pour chaque pixel mais c’est pas toi qui boucle dessus, tu laisse ça a la lib.

Je pensais faire une analyse pixel par pixel des 3 images, réalisé une genre de "moyenne" et redessiné ce pixel moyen. Cela permettrait de corriger les zones sous exposée et surexposée.

J’ai pris les 3 images dispo dans le lien que tu as donné et je l’ai fait avec ce code (python) :

1
2
3
4
5
6
7
8
9
import numpy as np
from scipy.misc import imread, imsave

files = ["grandcanal_{}.jpg".format(e) for e in ("mean", "over", "under")]
imgs = [imread(f).astype(float) for f in files]

out = (sum(imgs) / 3.).astype(np.uint8)

imsave("out.jpg", out)

Il fait la moyenne des 3 images. Je te laisse juger (ça donne un peu la meme chose que la version intermédiaire en plus fade) :

out
out.jpg

C’est pas une moyenne qu’il faut faire, c’est adapter les dynamiques. Par exemple déjà si tu fait equalization des histogrammes de cette image moyenne tu va avoir un truc un peu plus probant :

out2

On est loin du résultat de l’exemple donné en lien mais ça c’est parce que :

  1. là c’est très simpliste comme approche
  2. le résultat est obtenue probablement par des réglages colorimétrique particulier. Il est peu probable qu’un algo décide de mettre le ciel aussi orangé, vu les 3 photos d’origine, sans que l’auteur l’ai réglé dans ce sens (il a pas une teinte très marqué à l’origine).

edit: plus généralement, il va falloir que tu mets la main à la pate et que tu teste par toi même si tu veux y arriver.

+0 -0

Je comprends mieux se que tu veux dire pour le pixel par pixel. Je vais chercher du coté de php car c’est le langage avec javascript que je maîtrise le mieux.

En effet, pour le résultat.

Pour tester, tu as tout à fait raison, je ne savais juste pas par quel bout le prendre pour commencer. J’ai commencé par la création d’image pixel par pixel… Je vais essayer de trouver une lib en php avec des fonctions qui feront le bouclage pour moi et à partir de là je pourrais faire une config.

J’ai des pistes pour améliorer et complexifier le traitement de la photo mais tu as raison mon approche est ultra simpliste.

Merci pour ton retour kje.

Tu peux faire le traitement pixel par pixel. Ça risque d’etre lent (trop pour l’utiliser en vrai) mais ça peut te permettre de tester et de t’entraîner.

Tu t’attaque a une catégorie particulière de problèmes : ceux qui n’ont fondamentalement pas de solution parfaite (car ça dépend beaucoup de ce que tu veux). Ici le problème est forcément insoluble : tu n’as pas assez de données pour le résoudre. Il faut que tu utilise des algorithmes pour faire "au mieux".

Donc en soit, si tu prefere le faire pixel par pixel, vas y. Quand tu aura un algo qui fonctionne comme tu le souhaite on pourra t’aider a l’accélérer avec les bonnes libs. Il faut toujours commencer a faire un algo qui fonctionne avant de vouloir le rendre rapide.

Il faut que tu trouve des algos et des référence pour rentrer dedans. Cherche sur google des algo ou des articles (Ou sur google scholar).

Ça n’apporte probablement pas grand chose à ce niveau de la discussion, mais dans cet exemple, le bateau et les vagues qui bougent d’une image à l’autre sont une difficulté en plus si tu fais du pixel par pixel.

Les outils dédiés au HDR ont souvent une option qui essaie de réduire le phénomène de "ghosting", c’est à dire de voir des objets fantômes dupliqués (ou trupliqués) parce qu’ils ont bougé d’une image à l’autre.

Kje -> yes, je vais faire comme ça. Je vais bosser sur mes algos comme j’y arrive même si pas optimisé et on optimisera la rapidité ensuite. Je te remercie pour ton temps et tes explications.

Si je ne me trompe pas dans le cas du HDR Clems, les 3 photos doivent être prise sans mouvement pour éviter ce bruit. Mais personnellement je vais d’abord bosser sur des cas simples sans mouvements.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte