TNI+VO · Exercice de Programmation

EP02_05 — ➡️ Translation d’image

2.12.5 EP02_05 ➡️ Translation d’image

Dans cette activité, vous devez implémenter le déplacement spatial d’une image. La translation déplace chaque pixel de l’image originale vers une nouvelle position en fonction d’un vecteur de déplacement.

  • Lisez deux entiers L et C, représentant les dimensions de la matrice.
  • Lisez deux entiers \(t_x\) (déplacement horizontal) et \(t_y\) (déplacement vertical).
  • Lisez les valeurs entières de la matrice originale.
  • Calculez la nouvelle position \((x', y')\) pour chaque pixel \((x, y)\) original.
  • Affichez la matrice résultante avec les mêmes dimensions que l’originale.
  • Voir dans Figure 2.16 une simulation de cet EP.

📌 Important :

  • Remplissage : Les pixels qui « entrent » dans l’image en raison du déplacement et qui n’ont pas de correspondant dans l’originale doivent être remplis avec 0 (noir).
  • Suppression : Les pixels qui, après la translation, sortent des limites de la matrice (\(0 \dots L-1\) ou \(0 \dots C-1\)) doivent être ignorés.
  • Coordonnées : Considérez \(x\) comme l’indice de la ligne et \(y\) comme l’indice de la colonne.

2.12.5.1 🧠 Déplacement spatial

Translater une image signifie déplacer tous ses points d’une distance fixe dans des directions spécifiées. Mathématiquement, en utilisant les coordonnées homogènes, l’opération est décrite comme suit :

\[\begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} = \begin{bmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix}\]

Ce qui donne les équations simples :

  • \(x' = x + t_x\)
  • \(y' = y + t_y\)

2.12.5.2 📋 Tâche (spécification pour VPL)

Entrée :

La première ligne contient L.

La deuxième ligne contient C.

La troisième ligne contient les entiers tx et ty.

Les lignes suivantes contiennent les éléments de la matrice \(L \times C\).

Sortie :

La matrice résultante avec les mêmes dimensions \(L \times C\) après le déplacement.

2.12.5.3 📌 Exemples

Entrée Sortie Observation
2
2
1 1
10 20
30 40
0 0
0 10
Déplacement (\(t_x=1, t_y=1\)): Chaque pixel se déplace d’une position vers la droite (horizontal) et d’une vers le bas (vertical). Le pixel \((0,0)=10\) va vers la destination \((1,1)\) (coin inférieur droit). Les positions vides sont remplies avec \(0\).
3
3
-1 0
1 2 3
4 5 6
7 8 9
2 3 0
5 6 0
8 9 0
Déplacement (\(t_x=-1, t_y=0\)): Chaque pixel se déplace d’une position vers la gauche (horizontal). La première colonne originale (1, 4, 7) est supprimée, les autres colonnes se déplacent vers la gauche, et la dernière colonne résultante est remplie de zéros (\(0\)).
📍 Simulateur EP02_05 : Translation géométrique 2D p'(i, j) = p(i − ty, j − tx)

Ajustez les déplacements horizontal (tx) et vertical (ty) pour observer le mappage inverse des coordonnées et le remplissage avec zéro (noir) pour les pixels hors des limites de l'image d'origine.

0
0
Original (4×4)

Translations (tx, ty)

tx = 0, ty = 0 → aucun déplacement (image d'origine conservée)
Figure 2.16: Simulateur EP02_05 : Translation géométrique d’image (Déplacement tx et ty avec remplissage de bordure)
%%writefile EP02_05.cpp
// your solution
Overwriting EP02_05.cpp
TestSuite("EP02_05.cpp").run()
✔️ EP02_05.cases existe déjà dans casos/
📋 5 cas chargé(s) depuis casos/EP02_05.cases

🔍 Test de C++ : EP02_05.cpp
⚠️ EP02_05.cpp : fichier vide (moins de 3 lignes). Tests ignorés.