Rapport de TD6
Traitement géométrique

1. Homothétie isotrope

Question 1: Analyse d’un programme existant

Analyser la partie de programme ci-dessous extraite de l'application td9_geometry.c construite sur le modèle de skelet.c  .

Bout de code de td9_geometry.c

Que calcule ce programme?

Ce programme effectue un zoom-out (avec perte) d'une image passée comme argument. La fonction est la suivante (0.5 est un moyen d'avoir un pseudo-arrondi):

Fonction


Voici comment ce zoom-out est fait (pour chaque pixel de chaque ligne de chaque canal):

  • La position du pixel (0,0) reste inchangée (il reste toujours en haut à gauche);
  • pour les autres pixels, ils ne se retrouveront pas tous (fonction non-bijective) dans l'image transformée: par exemple, le pixel de l'image originale (1,1) ne sera pas présent (car 1*1.5 + 0.5 = 2);
  • si un pixel ne rentre pas dans les dimensions de l'image (inférieur à 0 ou supérieur au nombre de lignes/colonnes), il sera remplacé par un pixel de background (0).

Enfin, l'image originale suivie de l'image transformée:

Lena, zoomed-out.

Question 2: Trame de fond (background)

Modifier le programme pour que la couleur du fond soit le gris clair.

Pour cette question, il suffit de procéder à un seul changement, comme le montre ce morceau de code:

Code de la question.

La partie colorée en bleu-vert foncé montre le changement apporté. Il faut changer 0 par la valeur souhaitée (ici 190).
Voici le résultat:

Lena, zoomed-out bis.

Question 3: Changements de repères

On désire réaliser un zoom d’un facteur 8 sur la pupille de l’œil gauche de l’image girl.g  .
Écrire les formules permettant de passer du repère image source vers l'image destination (MDD) ou du repère de l'image destination vers celui de l'image source (MDI).

Tout d'abord, il nous faut la position de la pupille de l'œil gauche; ensuite nous pouvons effectivement appliquer notre zoom.
Voici le tableau des fonctions à appliquer (et fonctions inverses correspondantes).

Source:
(o,x,y) ↔ (O1,x1,y1)
Zoom:
(O1,x1,y1) ↔ (O2,x2,y2)
Destination:
(O2,x2,y2) ↔ (O,X,Y)
MDD x1 = x - 266
y1 = y - 327
x2 = 8 *x1
y2 = 8 * y1
X = x2 + 256
Y = y2 + 256
MDI x = x1 + 266
y = y1 + 327
x1 = x2 / 8
y1 = y2 / 8
x2 = X - 256 y2 = Y - 256

Question 4: Programmation

Modifier le programme pour qu’il réalise ce zoom d’un facteur 8 sur la pupille de l'œil gauche de Léna.

Le code reste assez simple (à noter qu'on utilise le MDI dans le code):

Code pour la question 3.

Enfin, l'image obtenue avec cette transformation:

Lena * 8.

2. Rotation sur l’œil

Question 5: Programmation

On désire réaliser une rotation de +30° (sens trigonométrique) et un zoom d’un facteur 8 centrés sur la pupille de l'œil gauche de l'image girl.g  .
Écrire les formules des transformations directes et inverses.

Les formules sont les mêmes que pour la question 3, à l'exception de la rotation:

Source:
(o,x,y) ↔ (O1,x1,y1)
Zoom:
(O1,x1,y1) ↔ (O2,x2,y2)
Rotation:
(O2,x2,y2) ↔ (O3,x3,y3)
Destination:
(O3,x33,y3) ↔ (O,X,Y)
MDD x1 = x - 266
y1 = y - 327
x2 = 8 *x1
y2 = 8 * y1
x3 = x2 * cos(angle) - y2 * sin(angle)
y3 = y2 * sin(angle) + x2 * cos(angle)
X = x3 + 256
Y = y3 + 256
MDI x = x1 + 266
y = y1 + 327
x1 = x2 / 8
y1 = y2 / 8
x2 = x3 * cos(angle) + y3 * sin(angle)
y2 = -x3 * sin(angle) + y3 * cos(angle)
x3 = X - 256
y3 = Y - 256

Question 6: Programmation

Le code est quasiment inchangé par rapport à la question 4:

Code pour la question 6.

La seule "difficulté" est de bien recopier le calcul de l'angle (et avoir les bonnes formules).
Enfin, voici l'image obtenue avec cette transformation:

Lena * 8, tournée à 30°.

3. Effet fantastique

Question 7:

Inventer une transformation inverse réalisant un "effet fantastique" sur l'image.
Prévoir (ou approximer) la transformation directe associée.

Avant de montrer comment j'ai procédé, je vais d'abord afficher l'image finale à côté de l'originale.
Je l'ai appellée: "The unhappy girl".

My Léna.

Pour la faire, je me suis inspiré de la fonction de Maryline Tran Van Buu (2008) appellée "La Mesquine". Je ne voulais pas donner un air grotesque à Léna, mais rester aussi réaliste que possible, tout en changeant les esquisses du visage (et donner l'impression que Lena nous fait face).

Voici le code qui m'a permis d'obtenir cette transformation:

Code

En terme de fonction, pour x et y:

MDI

Le MDD:

MDD

4. Rapport HTML

Question 8:

Écrire un rapport HTML (ou PDF) illustrant les différentes méthodes d'interpolation:

  • plus proche voisin;
  • bi-linéaire;
  • bi-cubique

Ces trois méthodes seront appliquées à l'œil droit zoomé d'un facteur 5 de l'image de l'image couleur de Léna.

Pour le plus proche voisin, on garde le même code car il implémente déjà le Nearest Neighbor:

Code Nearest Neighbor
Léna, NN


Pour l'interpolation bilinéaire, il suffit de reprendre la formule donnée en cours (voir l'image juste en dessous) et de changer le nom des variables pour obtenir le résultat suivant:

Formule donnée en cours:

Formule BL

Voici l'image et le code permettant de la générer:

Code BL
Léna, BL

Dans le code, les variables xround et yround contiennent les valeurs entières de x et y.

Pour l'interpolation bicubique (w1, w2 et w3), nous pouvons partir d'un code commun aux trois versions de l'interpolation:

Code BC

On peut remarquer plusieurs choses dans ce code:

  • 1. Le calcul de la distance dxk ;
  • 2. le calcul de la distance dyl ;
  • 3. au cas où on a un résultat saturé, il faut donc corriger ce cas.

Voici le code pour les trois fonctions w1, w2 et w3 (telles que décrites dans le cours):

Code BC, WS

Enfin, je vais montrer les images obtenues avec ces trois interpolations (dans l'ordre: w1 puis w2 et enfin w3):

Code BC, w1

On remarque que pour w3, la qualité est nettement supérieure à l'interpolation bilinéaire, ou au 'Plus proche voisin'.

Code BC, w2

On voit un certain effet de flou dans l'image avec w2. Cela peut être vu sur les courbes des fonctions w1 et w2. w1 est plus variante.

Code BC, w3

De même que précédemment, l'effet de flou est beaucoup plus visible ici. On voit beaucoup moins les quelques taches de rousseurs de Lena.
Le blanc des yeux est moins distingable, idem pour ces sourcils (et cils). Le grain de la peau de Lena est, au fur et à mesure qu'on passe de w1 à w2 à w3, de plus en plus difficile à reconnaître.