|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Lors des articles précédents (1, 2 et 3), nous avons étudié différentes méthodes en vue de traiter des images numériques, d'en améliorer les caractéristiques ou d'en extraire des informations de contours. Après avoir considéré l'image comme une fonction bidimensionnelle qui associe une valeur de luminance à chaque pixel, nous avons décrit des opérateurs qui s'appliquent point par point et sur un environnement restreint. Il en découle toutes les méthodes basées sur la notion de masques, appelés aussi filtres locaux ou noyaux de convolution. Cette fois-ci, nous allons nous intéresser à un aspect plus géométrique du traitement de l'image puisque le thème de cet article repose sur des transformations de pixels. En effet, qui dit coordonnées de pixel sous-entend repère (si possible orthonormé) et l'on peut appliquer des opérations géométriques aussi bien sur ce repère que sur ces pixels. Elles se résument souvent concrètement aux fameuses transformations linéaires de base comme la translation, la rotation ou l'homothétie (zoom). Ces transformations peuvent être appliquées dans l'espace des réels R comme celui des complexes C. Dans ce dernier cas, de nombreuses manipulations sont possibles et des effets spéciaux comme l'effet de loupe sont d'une simplicité déconcertante. Voyons comment mettre en oeuvre toute cette théorie ! Précautions de départ Pour transformer une image en une autre, il faut prévoir une zone destination qui correspond à l'image finale. Nous considèrerons que cette zone est de même taille (largeur, hauteur) que l'image originale pour simplifier les explications. Dans toutes les opérations de ce genre, le processus consiste à parcourir linéairement, à l'aide de boucles imbriquées (en x,y) l'image destination et, à rechercher dans l'image source le pixel correspondant au vu de la transformation escomptée. Cette démarche paraît peu intuitive a priori, car l'on aurait plutôt tendance à parcourir l'image de départ, calculer la transformation du pixel courant puis, de le stocker à ses nouvelles coordonnées dans l'image finale. En fait, cette méthode est théoriquement possible, mais elle induit des artefacts dans l'image finale. Pourquoi ? Tout simplement parce que l'on n'est pas sûr qu'à chaque pixel de départ correspond son image (au sens mathématique) dans la zone de destination. En procédant, à l'inverse, le programme recherche, en fait, tous les antécédents de la transformation dans l'image source. Il faut donc appliquer l'opération inverse (Cf. fig. 1). Figure 1 Rotation et translation d'images La rotation d'image d'un angle A en degré, peut s'exprimer par la multiplication de tous ses points [x,y] par une matrice de rotation :
A est l'angle de rotation en degré. Comme dans la plupart des langages, les arguments des fonctions trigonométriques sont exprimés en radians. Il faut opérer une transformation pour passer des degrés en radians :
Les coordonnées (X,Y) sont les coordonnées du point antécédent au point (x,y) dans l'image originale. Si on applique seulement la rotation, l'image finale sera décalée, il faut donc inclure une translation pour changer le centre de rotation. De façon classique, on place le centre de rotation au milieu de l'image : centrex = largeur /2 centrey = hauteur /2 Une translation s'exprime donc comme suit :
Algorithme de Rotation Centrée : Fonction Rotation (Image source, Image destination, angle_degre, centrex, centrey)
La figure 3 montre un exemple de rotation d'image d'un angle de 60 degré. Figure 2 Figure 3 Cette transformation est encore plus simple que les précédentes et est basée sur les mêmes principes. Il suffit, pour agrandir une image de multiplier chacun des points par un facteur homothétique H et de regarder dans l'image source la valeur correspondante.
Il n'est pas exclu de multiplier la composante x par un facteur Hx et la composante y par un autre facteur Hy, auquel cas, nous obtenons ce que les mathématiciens appellent une similitude de l'image. Rappel : nous parcourons l'image destination, donc, il faut opérer la transformation inverse : Pour une rotation d'angle A, il faut fournir l'angle opposé (-A). Pour une translation de Tx,Ty pixels, il faut indiquer (-Tx, -Ty). Pour un zoom grossissant de coefficient H=3,il faut DIVISER les coordonnées par 3 ou les multiplier par 1/3 ! Optimisations possibles Ces transformations étant linéaires, de nombreux auteurs ont proposé des améliorations en termes de rapidité de calcul par exemple, Weisman et coll (1980) ont décomposé la matrice de rotation en trois opérations simples en 1D appliquées séquentiellement sur l'image :
Bref, il est à noter que les possibilités d'améliorer les performances sont grandes et variées et on peut imaginer de précalculer les tables de sinus/cosinus par exemple. Un détour par les complexes Nous avons vu comment effectuer des manipulations sur une image à partir des coordonnées de chaque point de l'image destination. Pour cela, les coordonnées cartésiennes auxquelles nous appliquions une transformation via une matrice étaient utilisées. Voyons maintenant, une autre façon de procéder en utilisant les coordonnées de chaque point sous forme de nombres complexes. Pour ceux qui ont gardé de mauvais souvenirs de leurs cours de maths, pas de panique. Voici justement le moment de comprendre à quoi peut servir ce genre de petites bêtes curieuses. Ceux qui par contre n'en n'ont jamais entendu parlé, voyez comme il est facile de faire des transformations avec ces nombres "imaginaires". Les nombres complexes pas si complexes que ça ! Les coordonnées (x,y) d'un point forment un nombre complexe z tel que z = x i + y (i étant un nombre imaginaire tel que i*i = -1). Cette écriture n'est pas intéressante pour nous. Par contre, z peut aussi s'exprimer ainsi :
srqt est la fonction "Racine carrée" et atan est la fonction "arctangente". r et A correspondent aux coordonnées polaires et nous pouvons revenir aux coordonnées (x,y) par :
Nous venons de voir comment passer de (x,y) à la forme z = r exp(iA) et inversement. Que se passe-t-il maintenant si l'on modifie r ou A ? Les transformations complexes Soit un point (x,y) de l'image destination exprimé sous la forme (r,A). En modifiant r ou A et en allant chercher le point correspondant (x',y') (2) dans l'image source, nous effectuerons toutes sortes de transformations variées et complexes. Figure 4 Rotation de l'image d'un angle B :
Agrandissement de l'image d'un facteur n :
Diminution de l'image d'un facteur n :
Effet de vagues :
avec : L paramètre de la largeur des vagues b) Transformation limitée à un cercle de rayon R Effet loupe grossissante :
Figure 5
Effet Distorsion :
avec N = nombre de tour Figure 6 Figure 7 Figure 8
Figure 9 Remarque : les calculs ne se font que pour r<R. Avec toutes ses petites formules, il vous est ainsi possible de transformer des images grâce à des effets spéciaux très amusants. Ce ne sont que des exemples et la combinaison de ces effets peut donner des résultats impressionnants. Notons aussi, que ces transformations sont plus simples dans l'espace des complexes que dans celui des réels. Les paramètres peuvent être changés à volonté et donner lieu a des animations. Conclusion Nous avons étudié quelques transformations géométriques linéaires. Il en existe beaucoup d'autres, un peu plus complexes mathématiquement, mais qui permettent des déformations élastiques des images, c'est-à-dire que chaque point subit une loi de déformation différente de celle de son voisin. Ces transformations connaissent des applications courantes en CAO/DAO mais aussi dans le cadre des problématiques de recalage d'images. Ces problèmes consistent à faire, par exemple, correspondre deux acquisitions différentes d'un même objet en déformant l'un sur l'autre et de les comparer ensuite. Je tiens à remercier chaleureusement Florent Dolidon dans l'aide qu'il m'a apportée lors de la rédaction de cet article et pour la relecture assidue du manuscript.
|