Annulation d'un bougé: déconvolution.

Retour au sommaire Photos

ou des maths sans une seule formule!



0- Avant propos



 Il arrive de rater une photographie par manque de lumière... La photo est bougée et devient inutilsable.
Dans certains cas, il est légitime de vouloir la sauver.

Lors de discussions sur les NG (NewsGroups), GR, par malice a souvent montré une photo ratée représentant un chevreuil, prise avec une lumière trop faible... Le bougé est important, mais il est tentant d'essayer de l'éliminer.

0mbtODHufX6_Chevreuil_Flou.jpg
Photo originale trainant sur les NG. (Copyrigth GhostRider)

Voyons s'il est possible de réparer cette image...   (Cette tâche va faire partie de ma conquête de l'inutile.)



1- Qu'est-ce qu'un bougé?


   

Le bougé d'une photo, n'est que la convolution d'une image nette par une information de bougé.

Exemple: prennons quelques étoiles brillantes (fictives ! car il caille dehors... il neige !) dans le ciel, en pose longue et à la main.

Etoiles.jpg


Supposons que le bougé soit défini par:     masqueConvol_Chevreuil_Flou.jpg

La photo obtenue sera:

EtoilesConv.png
(on voit déjà sur cette image le résultat des approximations!)

En gros chaque étoile est remplacée par le motif du bougé.

Il est tentant d'écrire un programme qui va rechercher le motif du bougé, et le remplacer par un point: on obtiendrait ainsi une image nette. Mais ce n'est pas si simple!

Prennons une photo théorique avec des étoiles, et des traces brillantes d'étoiles filantes, ou de satellites (fictifs):

EtoilesSat.jpg

Si on introduit le bougé, on obtiendra:

EtoilesSatConv.png

Là on se doute que récupérer les étoiles simples est encore facile, mais retrouver les traces satellites devient impossible, car les motifs se sont superposés.

Il existe une méthode en mathématiques pour faire ce traitement inverse: la déconvolution.
 


2- La déconvolution (sans maths)


 
 Il est possible, en mathématiques, d'effectuer des changements d'espace, tant que le changement inverse existe et est unique. (C'est un peu comme passer une pensée du Français à l'Anglais. La pensée est la même, et pourtant on achangé de monde...)

L'espace de Fourier est ainsi souvent utilisé. Il s'agit de remplacer les données par des fréquences (soit en hertz soit en cycle/mm)
Ce qui est intéressant, c'est de remarquer que le bougé dans notre monde image, est remplacé par une simple mutiplication  de Transformée de Fourier de l'image et du motif!

TF (image + bougé)  = TF(image non bougée) x TF(bougé)

Si on a une image bougée, et qu'on arrive à estimer le bougé, pour obtenir l'image non bougée, il faudra faire:

TF (image non bougée) = TF (image +bougé) / TF(bougé)

Le calcul de la Transformée de Fourier Inverse de TF(image non bougée) donne l'image non bougée !

Ainsi par des calculs complexes, on obtient une image non bougée.

Toute la difficulté consiste à estimer le mouvement avec le plus de précision possible. (et à faire les calculs !)



3-  Exemple d'images et  TF d'images




(dans les chapitres suivants, l'image réelle sera à gauche et sa TF à droite. Les médaillons décrivant un gros plan)

Champ d'étoiles:

etoile.jpg
Détail du motif étoile

Etoiles.jpg   FFT%20of%20Etoiles.jpg


Le masque:


DetailBouge.jpg
détails du masque

masque512.jpg  FFT%20of%20masque512.jpg


Le champ d'étoiles bougés


EtoilesConv.png  FFT%20of%20EtoilesConv.jpg

On voit bien sur la dernière TF qu'on a le motif TF(champ étoiles) x TF(motif bougé)
 

 

4- Revenons à notre chevreuil



Conditions
: Pour simplifier les calculs de Transformées de fourier, on va prendre une image carrée 512x512.

Chevreuil512.jpg

Que l'on va traiter en Noir et Blanc:

ChevreuilNB512.jpg  FFTChevreuilNB512.jpg

La déconvolution  (TF(flou)/TF(masque) donne:

ResultBrut.jpg  FFTofResultBrut.jpg

La TF du masque ayant des pixels très noirs, la division par presque zéro donnent des anomalies blanches qu'on va supprimer...

FFTofResultSansBlanc.jpg  InverseFFTofResultSansBlanc.jpg

Qu'on traite ensuite pour corriger les dérives... (non normalisation des coefficients)

InverseFFTofResultSansBlanc1.jpg  InverseFFTofResultSansBlanc2.jpg

On peut voir ici que le bougé a (en partie) disparu. Mais le résultat reste grossier...

Causes pouvant expliquer le mauvais résultat:
- mauvaise estimation du bougé
- mauvaise définition de l'image
- masquage de la TF mal maitrisé
- absence de couleur

 

5- Et en couleur?



J'ai essayé le processus en traitant l'image en couleur:

- séparation des 3 couleurs RVB
- calcul de chaque déconvolution
- masquage des pics blancs  (ici TF Rouge et Verte)

FFTinverseRougeMasquee.jpg  FFTinverseVerteMasquee.jpg

-TFI (R V B) et recomposition de l'image couleur

R.jpg  V.jpg

B.jpg  New_Chevreuil.jpg

 Les résultats sont décevants...  franchement plats... 

6- Et le gamma?



 Et si j'avais oublié le gamma?

En effet, les images jpg sont dans un espace en gamma=0.45. Pour avoir une vraie linéarité, il faut passer dans un espace naturel et donc faire subir un gamma=2.2 à toutes les images... Faire les caculs de TF, déconvolution, et revenir dans un espace à gamma=0.45

- séparation des 3 couleurs RVB
- passage en espace naturel (application d'un gamma 2.2)
- calcul de chaque déconvolution
- masquage des pics blancs
- passage en espace gamma=0.45
- ajout de contraste (à la main)

Images R, V, B et finale

InverseFFTofGamma_rouge.jpg  InverseFFTofGamma_vert.jpg

InverseFFTofGamma_bleu.jpg  New%20chevreuil%20gamma2.jpg

Pas si mal que ça (pour une bidouille!)




X- Conclusion


 Seul le recours à l'artillerie lourde améliore le bougé!

Il s'agit ici de simples manipulations, avec beaucoup d'approximations... (bidouilles) Mais cela permet de comprendre comment on peut améliorer une image bougée.

Chevreuil512.jpg  New%20chevreuil%20gamma2.jpg

Il faudrait, pour améliorer le procédé, avoir:

- des images mieux définies. (ici seulement 512x512)

- trouver une méthode pour mieux caractériser le bougé. Une meilleure image d'origine, permettrait également de caractériser le bougé avec plus de définition. Les calculs se feraient aussi moins "à la hache!"

- Voir si les images ont subi une rotation de bougé, car tout ce qui a été décrit ici, considère que le bougé est le même quelque soit les points de l'image.

- ne pas travailler en jpg, car c'est aussi un système qui utilise Fourier (DCT) et qui fait de mauvaises approximations... , en 8 bits.

- faire tous les calculs en 32 bits...

J'ai plein d'autres idées pour améliorer le procédé, mais est-ce bien utile? Il suffit de prendre des photos non bougées!

PICT2832a.JPG

PICT2839a.JPG

NB Je n'ai pas abordé un point important dans cette description... c'est pour voir si des gens vont lire ce document!



Merci à Ghost-Rider qui m'a prêté spontanément, sans le vouloir et sans le savoir son image de chevreuil, qui m'a permis de faire ces essais.   (Depuis, j'ai obtenu son autorisation. Voir msg 2010-12-04 17h20)

A GR, je lui conseillerai de s'entrainer sur...

PICT2848.JPG

Ah, Ah, Ah!    ;-)


Une nouvelle déconvolution a été lancée  quelques jours plus tard, les résultats se sont améliorés. Voir Deconv2.php

JMP, le 4 et 6 décembre 2010