Restaurer des films en utilisant les maths
Les vieux films présentent de nombreux défauts comme le "papillonnage". Mais on peut utiliser les maths pour les corriger.
Les vieux films présentent de nombreux défauts. L’un d’entre eux est le papillonnage (appelé « flicker » en anglais) qui est visible sous forme de fluctuations importantes de contraste d’une image du film à l’autre. Le but de cet article est de montrer comment les images peuvent se modéliser comme des objets mathématiques, et comment manipuler ces objets de façon à modifier les contrastes et corriger le papillonnage.
Les vieux films présentent de nombreux défauts : des rayures, des taches, mais aussi des défauts de luminosité qui se traduisent par des variations non naturelles de contraste dans le film. Ce sont ces défauts de luminosité qui sont désignés par le terme papillonnage (ou flicker pour reprendre le terme anglais). Ces défauts de contraste peuvent être dus à la fois à la dégradation chimique du support du film (qui crée alors des zones plus sombres ou plus claires lors du visionnage), mais aussi à des problèmes de temps d’exposition variables d’une image à l’autre. Ceci est en particulier vrai pour les films tournés à l’époque où la pellicule était entraînée manuellement.
Ci-dessous, la vidéo un court extrait du film Les Aventures des Pieds Nickelés (Emile Cohl/Eclair, 1917-1918, copyright Marc Sandberg). Dans cet extrait, on se rend bien compte de la présence de papillonnage, qui donne l’impression que le film « clignote ».
Le papillonnage se rencontre également dans des films plus récents, comme dans certaines vidéos de type vidéo-surveillance ou vidéo-amateur. Contrairement à d’autres défauts couramment observés dans les films (rayures, poussières, etc.), le papillonnage ne fait pas apparaître de nouvelles structures dans les images. Sa particularité est donc d’être transparent, voire quasiment « invisible » sur une image isolée. Seul le visionnage des images successives du film permet de se rendre compte de sa présence.
Comment les mathématiques peuvent-elles intervenir pour éliminer ce type de défaut ? Tout d’abord, les films sont numérisés, ce qui veut dire que la pellicule est scannée, image par image, et que cette suite d’images numériques est stockée sur un ordinateur. En général, une seconde de film comporte 24 images. Un film d’une heure, une fois scanné, contient donc 86400 images numériques. Une image numérique en « noir et blanc »1 est modélisée mathématiquement comme une fonction définie sur une grille rectangulaire de carrés (appelés pixels pour la contraction de « picture elements ») et à valeur dans l’ensemble des nombres positifs. La valeur de l’image en un pixel est appelée le niveau de gris de ce pixel. Introduisons quelques notations utiles pour la suite de l’exposé. Si v désigne une image numérique, définie sur une grille de [latex] N \times M [/latex] pixels, pour un pixel [latex](xy)[/latex], la valeur [latex]v(xy)[/latex] est son niveau de gris. Dans ce texte, on considèrera que les niveaux de gris sont des valeurs entières comprises entre [latex]0[/latex] et [latex]L[/latex]. Dans les images que l’on manipule tous les jours (photos numériques), les niveaux de gris prennent généralement des valeurs entières entre [latex]0[/latex] (noir) et [latex]L=255[/latex] (blanc). Des valeurs de [latex]L[/latex] beaucoup plus grandes sont utilisées dans des domaines plus pointus (comme en imagerie satellitaire par exemple).
Pour éliminer le papillonnage dans un film, on applique à toutes ses images numérisées des changements de contraste (nous verrons plus loin comment les construire). Dire qu’une image v subit un changement de contraste veut dire qu’elle est transformée en [latex]g(v)[/latex] où [latex]g[/latex] est une fonction croissante : chaque pixel [latex](x,y)[/latex] voit son niveau de gris [latex]v(x,y)[/latex] devenir [latex]g(v(x,y))[/latex]. L’intérêt d’utiliser une fonction g croissante est qu’elle conserve l’ordre des niveaux de gris : si le pixel [latex](x_1,y_1)[/latex] est plus sombre que le pixel [latex](x_2,y_2)[/latex] dans l’image [latex]v[/latex], cette propriété reste vraie dans l’image [latex]g(v)[/latex]. En conséquence, un changement de contraste ne modifie pas le contenu géométrique d’une image, c’est-à -dire qu’on voit la même chose dans l’image avant et après un changement de contraste. Il n’y a pas d’apparitions de nouveaux objets dans l’image.
Comment mesurer le contenu géométrique d’une image ? Ceci peut se faire à l’aide de ce qu’on appelle la carte topographique de l’image. Pour la définir, on commence par regarder les ensembles de niveau supérieur de l’image : on fixe un niveau de gris [latex]n[/latex] et on regarde l’ensemble des pixels ayant leur niveau de gris supérieur ou égal à [latex]n[/latex]. La frontière de cet ensemble s’appelle alors une ligne de niveau. Ceci est illustré sur la figure ci-dessous. Lors d’un changement de contraste, les ensembles de niveau sont préservés dans leur ensemble (un ensemble de niveau n pour v devient un ensemble de niveau [latex]g(n)[/latex] pour [latex]g(v)[/latex]).
Le nom de carte topographique vient de l’analogie avec la géographie, où on peut voir [latex]v(x,y)[/latex] comme la mesure de l’altitude du terrain (niveau au dessus de la mer) au point de coordonnées [latex](x,y)[/latex].
Avant de s’attaquer à la restauration des films, commençons par étudier le cas de deux images. Etant données deux images, on veut appliquer à chacune un changement de contraste tel que les deux images aient la même distribution de niveaux de gris. On dira alors qu’on a effectué une égalisation de contraste entre les deux images, Pour formaliser tout cela, on commence par définir pour une image [latex]v[/latex] (de taille [latex]N \times M[/latex] pixels), son histogramme de niveaux de gris noté [latex]h[/latex] : c’est une fonction qui mesure le nombre de fois où chaque niveau de gris n apparait dans l’image [latex]v[/latex]. Ce qui peut s’écrire :
[latex]h(n)= \# \{ (x,y) \text{ tel que } v(x,y)=n \},[/latex]
où la notation [latex]\#[/latex] désigne le nombre d’éléments d’un ensemble. On peut ensuite définir l’histogramme cumulé de l’image [latex]v[/latex] par
[latex]H(n)=\# \{ (x,y) \text{ tel que } v(x,y) \leq n \} = h(0)+h(1)+\ldots + h(n).[/latex]
L’histogramme cumulé [latex]H[/latex] est une fonction croissante de [latex]n[/latex]. L’histogramme [latex]h[/latex] peut être reconstruit à partir de l’histogramme cumulé [latex]H[/latex] en remarquant que [latex]h(n) = H(n) – H(n-1)[/latex].
Que devient l’histogramme cumulé d’une image v lorsqu’elle subit un changement de contraste ? Si on applique à [latex]v[/latex] un changement de contraste g, comme expliqué plus haut, alors l’histogramme cumulé de [latex]g(v)[/latex] est [latex]H(g^{-1})[/latex], où [latex]H[/latex] est l’histogramme cumulé de [latex]v[/latex], et où [latex]g^{-1}[/latex] est l’inverse de la fonction croissante [latex]g[/latex]2 . En effet, pour un niveau de gris [latex]n[/latex] donné, le nombre de pixels [latex](x,y)[/latex] tels que [latex]g(v(x,y))[/latex] est inférieur à [latex]n[/latex] est égal au nombre de pixels [latex](x,y)[/latex] tels que [latex]v(x,y)[/latex] est inférieur à [latex]g^{-1}(n)[/latex], et ce nombre est par définition [latex]H(g^{-1}(n))[/latex].
En conséquence, en choisissant bien le changement de contraste [latex]g[/latex], on peut rapprocher la distribution de niveaux de gris de l’image [latex]v[/latex] de n’importe quelle autre distribution de niveaux de gris. Plus précisément, soit [latex]G[/latex] une fonction discrète strictement croissante sur [latex]\{0,\dots ,L\}[/latex], alors [latex]H(g^{-1})[/latex] est une image dont l’histogramme cumulé est donné par la fonction [latex]H((G^{-1}(H))^{-1})=G[/latex] (c’est la formule du paragraphe précédent avec [latex]g=G^{-1}(H)[/latex]). Nous allons utiliser cette propriété dans ce qui suit pour donner à deux images une distribution de niveaux de gris commune.
En effet, on vient de voir que si on a deux images [latex]v_1[/latex] et [latex]v_2[/latex] d’histogrammes cumulés respectifs [latex]H_1[/latex] et [latex]H_2[/latex], alors pour n’importe quelle fonction [latex]G[/latex] discrète et croissante sur [latex]\{0,\dots ,L\}[/latex], les images [latex]G^{-1}H_1(v_1)[/latex] et [latex]G^{-1}H_2(v_2)[/latex] ont même histogramme cumulé [latex]G[/latex]. On est donc amené à répondre à la question : comment « bien » choisir [latex]G[/latex] ? La réponse à cette question (voir le paragraphe déroulant ci-dessous pour les explications de cette réponse) est qu’il faut prendre [latex]G=H_{1/2}[/latex] , où [latex]H_{1/2}[/latex] est appelée distribution mi-chemin ou midway entre [latex]H_1[/latex] et [latex]H_2[/latex] et est donnée par
[latex]H_{1/2}=\left(\frac{H_1^{-1}+H_2^{-1}}{2}\right)^{-1} .[/latex]
Deux images et leurs histogrammes cumulés respectifs.
Les mêmes images qu’au-dessus après égalisation mi-chemin (midway) et leurs histogrammes cumulés.
Dans la formule ci-dessus, [latex]H_{1/2}[/latex] est définie comme étant la moyenne harmonique des histogrammes cumulés [latex]H_1[/latex] et [latex]H_2[/latex].
(Pour savoir pourquoi c’est le « bon » choix pour G, cliquez ici)
L’égalisation de contraste expliquée ci-dessus pour deux images peut se généraliser à un plus grand nombre d’images, et permet en particulier de restaurer un vieux film qui papillonne. On note
[latex](u_t)[/latex]t=1,2,…,T le film, c’est-à -dire que chaque [latex]u_t[/latex] est une image numérique, et [latex]T[/latex] est un entier qui désigne le nombre total d’images du film. Pour chaque [latex]t[/latex], on désigne par [latex]H_t[/latex] l’histogramme cumulé de ut. La restauration consiste ici à modifier le contraste de chaque image [latex]u_t[/latex] de façon à lui donner le même contraste moyen que les [latex]r[/latex] images qui la suivent et les [latex]r[/latex] images qui la précèdent dans le film (en prenant par exemple [latex]r=5[/latex]). En d’autres termes, on restaure simplement le film en changeant chaque image [latex]u_t[/latex] en [latex]\widetilde{u}_t[/latex], qui est donnée par
[latex]\widetilde{u}_t (x,y)= \frac{1}{2r+1} \sum_{s=t-r}^{t+r} H_{s}^{-1} ( H_{t} (u_t(x,y))) .[/latex]
Plus [latex]r[/latex] est grand, plus on prend en compte un grand nombre d’images dans le film pour restaurer ut, et plus on élimine les fluctuations dues au papillonnage. En contrepartie, prendre une valeur de [latex]r[/latex] trop grande n’a pas forcément de sens si le film comporte beaucoup de mouvements de caméra ou d’objets qui se déplacent.
Voici pour finir quelques résultats. La première vidéo montre l’effet de cette restauration sur l’extrait du film Les aventures des Pieds Nickelés, avec à gauche le film original et à droite le film corrigé. On voit que l’effet de papillonnage a globalement disparu : les différentes images du film ont maintenant des contrastes similaires.
Ci-dessous un deuxième exemple sur un extrait du court-métrage The Cure, de Charlie Chaplin, 1917.
>> La rédaction d’Images des maths, OWNIsciences ainsi que l’auteur, remercient pour leur relecture attentive, les relecteurs dont le pseudonyme est le suivant : Yoann, tumiac et Anne-Laure Dalibard.
>> Article initialement publié sur Images des maths
>> Photo d’illustration FlickR CC by-nc-nd StudioTempura
Pourquoi est-ce le « bon » choix pour G ?
Pour bien choisir [latex]G[/latex], on veut qu’il vérifie un critère simple, à savoir : si [latex]v_1[/latex] et [latex]v_2[/latex] sont deux images provenant d’une même image u par deux changements de contraste différents [latex]g_1[/latex] et [latex]g_2[/latex] (c’est-à -dire que [latex]v_1=g_1(u)[/latex] et [latex]v_2=g_2(u)[/latex]) alors on veut que G vérifie [latex]G^{-1} \left( H_1(v_1)\right) = G^{-1} \left( H_2(v_2)\right)= \frac{v_1+v_2}{2}[/latex]. Et ceci est satisfait pour [latex]G=H_{1/2}[/latex] où [latex]H_{1/2}[/latex] est défini comme ci-dessus par la moyenne harmonique de [latex]H_1[/latex] et [latex]H_2[/latex].
D’autres choix pour [latex]G[/latex] non seulement ne vérifient pas le critère énoncé ci-dessus mais ont aussi, dans certains cas, l’inconvénient de créer des artefacts. C’est ce qui se passe par exemple si on applique à chaque image un changement de contraste qui amène son histogramme cumulé sur l’histogramme cumulé moyen [latex](H_1+H_2)/2[/latex]. Ceci n’est pas satisfaisant, comme le montre l’exemple ci-dessous.[?]
- On parle généralement de films en « noir et blanc », pour les distinguer des films en couleur, mais dans l’absolu il faudrait plutôt parler de films en nuances de gris ! [↩]
- Comment est défini l’inverse ? Pour une valeur n donnée, on a une valeur [latex]k[/latex] telle que [latex]g(k)=n[/latex], et c’est alors cette valeur [latex]k[/latex] qui est appelée l’inverse de n par la fonction [latex]g[/latex] et qui est noté [latex]k=g^{-1}(n)[/latex]. Si de plus on a deux fonctions croissantes [latex]g_1[/latex] et [latex]g_2[/latex], alors on a la propriété que (g1(g2) )-1=g2-1(g1-1) . [↩]
Laisser un commentaire