 En 1988, la mathématicienne belge Ingrid Dobéchize met au point une famille de fonctions aux propriétés remarquables, les ondelettes de Dobéchize. Ces ondelettes trouvons une application très concrète une dizaine d'années plus tard, le standard de compression d'image, JPEC 2000. Il faut dire que la théorie des ondelettes est un champ de la recherche mathématique aujourd'hui particulièrement fertile, aux applications très variées, reconstruction d'images numériques, détection des ondes gravitationnelles, imageries médicales, géosciences etc. Mon application préférée, c'est tout de même la compression d'image et ça tombe bien. Prenons cette jolie photo, comment peut-on décrire précisément son contenu ? On peut dire qu'il s'agit d'une splendide vue aérienne du village de Motovune en Croatie, mais ce n'est pas vraiment la question. Comment peut-on la décrire précisément d'un point de vue informatique ? On peut commencer par dire qu'il s'agit d'une image de 1024 pixels sur 1024 pixels soit 1,48,566 pixels en tout. Pour décrire l'image, il suffit donc de lister tous ces pixels les uns à la suite des autres. Pour décrire la couleur d'un pixel, il existe plusieurs codages, le plus élémentaire est le code RVB. On décrit la quantité de rouge, de vert et de bleu qui composent la couleur. Par exemple, le premier pixel de cette photo est un carré bleu charrette, constitué de 48% de rouge, 62% de vert et 74% de bleu. En ramenant chaque pourcentage sur une échelle de 0 à 255, ce pixel a donc pour code RVB 123, 160, 189. Le code RVB d'une couleur, c'est donc 3 nombres entiers entre 0 et 255. Puisqu'il faut 1 octet pour coder de tels entiers, chaque pixel demandera donc 3 octets. Ma photo croâtée son million de pixels demandera donc 3 millions d'octets pour être sauvegardé, c'est-à-dire 3 mébis octets. Pour une photo de cette taille, c'est beaucoup trop, il va falloir ruser un peu pour minimiser la taille et échanger de point de vue. Pour coder une couleur, on a vu que l'on a besoin de 3 nombres, sa quantité de rouge, de vert et de bleu, mais c'est loin d'être la seule façon de définir une couleur par 3 nombres. On peut par exemple définir une couleur parfaitement en indiquant uniquement la quantité de rouge et de bleu, mais en ajoutant sa luminance. On a alors d'un côté la luminance, l'image en niveau de gris, et de l'autre les chrominances qui caractérisent les couleurs de l'image. Et cette décomposition a un avantage non négligeable, elle est bien plus adaptée à la façon dont un être humain typique perçoit les couleurs. L'œil humain est en effet beaucoup plus sensible aux différences de l'huménosité qu'aux différences de couleur. Une idée pour gagner de la place en trop gêner les yeux, c'est alors de légèrement dégrader le codage des couleurs. Dans les deux images de chrominance, je peux par exemple remplacer chaque carré de 10 ans 8 pixels sur 8 pixels par leur moyenne. Ces deux composantes de l'image vont donc prendre 64 fois moins de place. On peut alors reconstituer l'image originale, elle fait un peu illusion quand on y regarde pas de trop près. Bon, j'y suis allé un peu avec mes gros sabots, personne ne compresse des images comme ça. Mais il y a tout de même derrière cette première approche des idées intéressantes. Il faut oublier l'idée de coder l'image pixel par pixel, on va travailler bloc par bloc en découpant l'image en carré de 8 pixels sur 8 pixels. Prenons donc un de ces carré de 64 pixels. Pour simplifier, on va travailler que sur la composante des luminances mais gardons en tête que tout cela s'applique également aux composantes de chrominance. On a donc à présent sous la main un bloc de 64 pixels, c'est-à-dire une matrice de 64 nombres qu'il faut chercher à décrire de façon efficace. Une façon de faire, c'est de le voir comme une somme de pixel unité. 188 fois le premier pixel, plus 187 fois le deuxième pixel, plus 186 fois le troisième pixel et ainsi de suite. De manière générale, n'importe quelle image de dimension 16 par 16 pourra s'exprimer comme somme de ces pixels unités. On dit que ces pixels forment une base de l'espace de toutes les images. Mais ce n'est qu'une façon de faire parmi bien d'autres. Plutôt que de prendre des pixels unités comme base, on peut plutôt partir sur une sélection de motifs bien choisis. Il faut donc exprimer notre image comme une somme de motifs. Mais quel motif utiliser ? Les adeptes de la théorie du signal ont une réponse parfaite, la théorie de fourrier. Résumons dans les grandes lignes cette théorie. Si je prends un signal périodique comme celui-là, il existe toujours un moyen de le décomposer sous la forme d'une somme de signaux périodiques de plus ou moins haute fréquence, des fonctions sinus et co-sinus. La beauté de cette décomposition, c'est que si on te conserve que les signaux de plus basse fréquence, la forme globale du signal sera conservée. J'ai déjà fait une superbe vidéo sur ce sujet et je vous invite à la visionner au plus vite. Ce principe de fourrier peut s'adapter en deux dimensions. N'importe quelle image de 8 pixels sur 8 pixels pourra être exprimé en une somme de ces 64 motifs de plus ou moins haute fréquence. Pour coder une image de 64 pixels sur cette base de motifs, il faut donc les 64 coefficients de la somme. L'image obtenue par cette décomposition est en théorie identique, mais présente en pratique quelques différences mineures à cause des erreurs d'arrondis. Mais si on accepte de dégrader très légèrement l'image, on peut se permettre de ne conserver qu'une partie de ses nombres, ceux qui correspondent aux fréquences les plus basses. Les motifs de haute fréquence correspondent en effet à des changements brusques de lumière ou de couleur dans la photographie. Elles sont donc plus rares. Cela fait donc encore moins de coefficients à sauvegarder et donc une image qui prend moins de place en mémoire. La contrepartie, c'est que notre photographie pourra présenter quelques artefacts qui trahissent la compression et son découpage en bloc. Cette décomposition d'une image en bloc exprimée en somme de motifs de fourrier, c'est le cœur du format de compression d'image JPEG, celui que l'on utilise tous les jours dès que l'on manipule n'importe quelle photographie numérique. Malheureusement, cette belle compression JPEG en somme de motifs de fourrier a de nombreux défauts. Le plus flagrant, c'est cette présence d'artefacte de compression assez visible. Lorsque l'image est découpée en bloc, une approximation de fourrier effectuée sur un bloc donné n'a aucune raison d'être dans le prolongement de celui du bloc voisin. Lorsque l'image est fortement compressée, ces discontinuités ressortent particulièrement. Mais surtout, le vrai problème de cette compression via la théorie de fourrier, c'est sa difficulté à bien appréhender les changements brusques dans une image. Lorsque l'on cherche à approximer une fonction discontinue par une somme de fonctions consignues et sinus, on pourra observer une sorte de sursaut au niveau des discontinuités. C'est ce que l'on appelle le phénomène de JPEG et il faut l'éviter. Bref, la théorie de fourrier, c'est très bien, mais on s'y sent parfois à l'étroit. Le cœur de cette théorie, ce sont les fonctions trigonométriques, des fonctions périodiques définies partout, tout le temps. Si on veut modéliser avec ça un signal court dans le temps, comme un coup de tonnerre ou un bruit de cymbale, on va vite déchanter. Il nous faudrait des zones plus courtes, bornées dans le temps, mais qui permettent tout de même de reconstruire des signaux qui t'allaient déplacer ou aller dilater. On donnera dans les années 80, à ces petites ondes, le nom d'ondelette. Historiquement, la première ondelette a été mise au point par Alfred Hahr au début du XXe siècle. La théorie des ondelettes devient très solide dans les années 80-90 grâce au travail de nombreux mathématiciens, en particulier Yves Meyer, qui sera récompensé du prix Abel, l'autre récompense la plus préciseuse en mathématiques. Pour comprendre l'idée derrière les ondelettes, on va prendre la plus simple d'entre elles, l'ongelette de Hahr. C'est simplement une fonction qui vaut 0 partout, sauf entre 0 et 1, où elle vaut soit moins 1, soit plus 1. Faisons un petit exemple. Avec cette ondelette, on va tenter de coder un signal que l'on va représenter par une suite ici de 8 nombres, 4, 6, 7, 8, 8, 8, 9, 7. On commence par appliquer cette ondelette sur les deux premiers nombres de la liste, ce qui consiste à prendre négativement le premier et positivement le deuxième. Moins 4 plus 6, ça fait 2. On fait de même sur le couple de nombres suivants. Moins 7 plus 8, égale 1. On poursuit le processus, ce qui nous donne finalement 4 coefficients qui correspondent aux différences des nombres de la liste. On met de côté ces 4 coefficients et on va maintenant remplacer chaque couple de nombres par leur moyenne. On a alors la liste 5, 7,5, 8, 8. On recommence alors à la première étape. On calcule les différences de chaque pair, ce qui nous donne 2,5 et 0 que l'on met de côté et on remplace nos nombres par leur moyenne. On a maintenant 6,25 et 8. On effectue dernière fois le calcul de la différence 1,75 et de la moyenne 7,125. On met enfin les deux nombres de côté. La liste de 8 nombres que l'on obtient, 2, 1, 0, moins 2, 2, 5, 0, 1,75, 7,125, codent alors les variations sur différentes échelles de ma liste de départ. De plus, il est possible de reconstruire cette liste de départ en remontant le processus. En partant du nombre d'arrivés, 7,125, il suffit d'ajouter ou de retirer la moitié de la différence pour trouver les 2 nombres que l'on a formés. En poursuivant, on retrouve bien la liste de départ. Cette transformation de art, il est possible de l'appliquer en 2 dimensions pour encoder les différences d'une image. Pour cela, on va prendre les pixels de l'image par bloc de 4. Dans chacun de ces petits blocs, on va calculer d'une part les différences horizontales, verticales et diagonales des valeurs de ces pixels et on va d'autre part calculer la moyenne. Une fois que tous les calculs sont faits, on se retrouve avec 4 images, 3 qui correspondent aux différences horizontales verticales et diagonales dans l'image de départ et une dernière qui est l'image de départ diminuant en taille d'un facteur 4. On peut alors répéter l'opération sur cette image-là jusqu'à ce que l'image originale soit réduite à un seul point. Le processus peut lui aussi être remonté de façon à retrouver l'image originale. Après cette transformation, on obtient alors une image qui représente les différences entre les pixels dans toutes les directions et à différents niveaux d'échelles. Ce que l'on remarque surtout, c'est que cette image est essentiellement noire. Ces pixels noirs correspondent en fait aux zones de l'image de départ où les variations de lumière sont très faibles, tandis que les pixels clairs indiquent les changements plus prononcés. Cette façon de coder l'image permet donc de mettre l'accent sur ce qui est essentiel aux yeux dans une image, les changements brusques de fréquences. Pour compresser une image, il nous suffit alors de ne pas sauvegarder ces pixels noirs. Cette compression via les ondolettes permet donc de mieux mettre en valeur ses 10 continuités tout en ayant l'avantage de ne pas être trop gourmand en termes de calcul. Le format de compression JPEG existe aujourd'hui sous plusieurs standards. Le standard classique, qui utilise les transformations de fourriers, et le standard JPEG 2000, qui s'appuie sans les transformer en ondolettes. Ce n'est pas l'ondelette de AR qui est utilisée en pratique, mais celle de D'Aubéchis. Plus précisément, l'ondelette bi orthogonal CDF97 de Cohen, D'Aubéchis et Fovot. La théorie des ondolettes est un sujet de recherche mathématique très actif, notamment à l'IIIM, l'Institut de Mathématiques de Marseille, placé sous la tutelle du CNRS, d'ex Marseille Université et de l'école centrale de Marseille. La mathématicienne Sandrine Antoine, qui m'a beaucoup aidé à l'écriture de cette vidéo, travaille par exemple sur les problèmes inverses en imageries médicales. Lorsque l'on passe une IRM ou un PET scan, par exemple, on veut obtenir une belle image de notre intérieur. Pour cela, il est nécessaire de résoudre ce que l'on appelle un problème inverse, celui de la reconstruction 3D. En effet, ces scanners ne mesurent pas directement ce que l'on voit de l'objet, mais plutôt les projections de son intérieur sous différents angles. Dans un PET scan, par exemple, les mesures opérées forment ce que l'on appelle des intégrales de lignes. Et le passage de cet ensemble de mesures à l'objet final n'a rien de très évident. Il n'est en effet possible que d'en acquérir un nombre fini. On ajoute à ce manque d'information. Des incertitudes sont les mesures elles-mêmes, ce qui fait qu'une méthode d'inversion simple pourra produire des reconstructions bruitées. Pour résoudre ces problèmes, on peut concevoir des ondolettes et des modèles sur ces coefficients, ayant les bonnes propriétés mathématiques et qui seront adaptées au type d'objet que l'on cherche à reconstruire. Ainsi, l'ondolette utilisée pour modéliser un cerveau humain ne sera pas tout à fait la même que celle utilisée pour observer l'intérieur d'un muscle, par exemple. Cette application des ondolettes à imageries médicales n'est qu'un exemple parmi tant d'autres. Les ondolettes peuvent aussi être utilisées pour enlever le flou d'une observation essu d'un microscope, pour modéliser les turbulences d'un fluide, pour construire des images, etc. Bref, les ondolettes, c'est bien, mangaisant. Cette vidéo a été réalisée en partenariat avec Écoscience Provençalpe Côte d'Azur dans le cadre des vidéos écoscientifiques. Elle a été écrite en collaboration avec Sandrine Antoine, mathématicienne à l'I2M. Pour en savoir plus sur les ondolettes, retrouvez mon interview de Sandrine sur la chaîne d'Écoscience en lien dans la description.