En tant qu'ancien enseignant et chercheur en informatique graphique, j'ai fait
de la programmation informatique (en C/C++, java, ml, html, shell scripts,
action script, javascript, Mel script ...) et même si en tant que
graphiste 3D, j'ai moins l'occasion de programmer, il m'arrive encore de
retourner à mes vieilles marottes, d'autant plus que les deux
activités ne sont pas si éloignées.
En effet, pendant mon activité en tant qu'enseignant-chercheur, je travaillais essentiellement sur les modèles dynamiques de solides ou de fluides. Ces compétences m'ont été très utiles pendant la prod d'Arthur et les Minimoys. Et même si je n'ai pas fait réellement de programmation, la connaissance des modèles physiques m'a permis de mieux contrôler ces outils pour l'animation de l'eau, des fumées, mais aussi des solides simulés. |
![]() |
Mais ici, je voudrais vous parler de mon dernier programme écrit
en C++ à l'aide de VisualC++ et à des fins strictement
personnelles. On part d'une photo de référence (ci-contre) et d'une multitude d'autres photos formant une base de données. L'objectif est de mettre les photos de la base les unes à côté des autres en formant une mosaïque qui doit reproduire la photo de départ. L'intérêt de la démarche est qu'on puisse voir en un seul coup d'oeil, l'image globale et chaque image carreau sans avoir à se rapprocher ou à s'éloigner. Ceci limite le nombre de carreaux qui composeront la mosaïque. En pratique, il faut se limiter à une mosaïque de 30 x 30 carreaux. Pour ce faire, on se donne le droit de retourner les photos de la base horizontalement. Les photos format paysage sont tournées de 90 degrés pour prendre le format portrait. Ces dernières peuvent être retournées aussi bien horizontalement que verticalement. Enfin, on se donne également le droit d'éclaircir, d'assombrir et même d'ajouter ou d'enlever du rouge, du bleu ou du vert sur l'ensemble de chaque carreau. |
Dans tous les cas, il faut découper l'image de référence en 30 x 30
carreaux et de calculer la couleur moyenne de chacun d'eux. Ensuite, on calcule aussi
la couleur moyenne de toutes les images de notre base de données.
La première idée a été d'associer à chaque carreau de l'image de référence l'image de la base dont la couleur moyenne est la plus proche de celle de ce carreau. Dans cette approche, le résultat idéal est celui où pour chaque carreau de l'image de référence, on peut trouver des photos ayant exactement la même couleur moyenne que celle du carreau. Dans l'objectif d'avoir une idée de l'aspect global du résultat, on peut simplement remplir chaque carreau par sa couleur moyenne. Le résultat est représenté ci-contre. J'ai été très déçu par ce résultat, car les traits les plus caractéristiques de la personne représentée, c'est-à-dire les yeux, les sourcils, le coin de la bouche et la fossette dans la joue disparaissent dans le processus du moyennage. On pourrait obtenir de meilleurs résultats en prenant des carreaux plus petits. Mais alors chaque petit carreau devient trop petit pour qu'on puisse en distinguer le contenu tout en regardant l'ensemble. Il me fallait donc une autre méthode. |
![]() |
![]() |
Si on veut garder la résolution de 30x30 tout en voulant voir les détails
de l'image de rérérence, la seule solution est que le contenu mêkme
de chaque image-carreau doit participer à reproduire les détails de l'image
de référence. Il ne faut plus se contenter de la moyenne des couleurs.
Il faut donc pouvoir comparer la composition globale de deux images. Par exemple, il faut
savoir si une image donnée est sombre en haut, en bas, au milieu. Est-ce que la
frontière entre le clair et l'obscur est horizontale, verticale, oblique. Est-ce
qu'elle est centrée ou décalée vers le haut, le bas, la droite, la gauche ?
Pour déterminer cela, je me suis contenté de réduire chaque image jusqu'à ce qu'elle ne contienne que 9 x 12 pixels. Toutes les informations de couleur sont également éliminées pour ne garder que les informations d'intensité lumineuse. Ainsi pour savoir si deux photos-carreaux ont sensibelement la même forme, il suffit de comparer leur 9 x 12 pixels un à un. La photo-carreau dont la somme des différences des 9 x 12 pixels avec un carreau de référence est la plus petite est la photo-carreau dont la forme est la plus proche de ce carreau de référence. En appliquant ce principe, on peut facilement faire apparaître des détails plus petits que la taille des carreaux, ce qui était impossible avec la premiére méthode. Le résultat est l'image ci-contre. Elle peut être agrandie si on clique dessus. |
![]() |
Les deux images ci-contre représentent deux agrandissements, l'une d'un
oeil et l'autre d'une oreille. On peut voir comment les détails internes
de chaque carreau dessinent les sourcils, les yeux, le lobe de l'oreille et
la fossette. Mais en regardant l'image ci-dessus, on peut voir que le principe
permet même de dessiner des détails plus fins, comme une mèche
de cheveux ou les rayures bleues et blanches sur le polo de Marie-Laure. Et accessoirement ... très bon anniversaire à toi Marie-Laure !!! |
![]() |