Programmation graphique

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.

Mosaique (C/C++)

Principe


L'image de référence
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.

Premiére idée

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.

La bonne idée

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 !!!