TNI+VO · Exercice de Programmation

EP02_11 — 🏆 Correction de Perspective (Homographie) sur une Image Réelle

2.12.11 EP02_11 🏆 Correction de Perspective (Homographie) sur une Image Réelle

Dans cette activité, l’objectif est d’appliquer la transformation de perspective (homographie) pour « redresser » un objet incliné sur une photographie réelle. Vous travaillerez avec l’image d’un journal, où la grille d’un jeu de Sudoku est déformée en raison de l’angle sous lequel la photo a été prise.

Votre programme doit lire les paramètres d’entrée depuis le terminal, charger l’image, calculer la matrice d’homographie \(3 \times 3\), appliquer la transformation géométrique et afficher un indicateur global de validation.

  • Lisez deux entiers L et C, représentant les dimensions en lignes et en colonnes (hauteur et largeur) que l’image redressée de sortie doit avoir.
  • Lisez quatre paires de coordonnées \((x, y)\) via le terminal, représentant les quatre coins du quadrilatère d’origine (le Sudoku déformé dans l’image originale).
  • Calculez automatiquement les quatre paires de coordonnées de destination en utilisant les dimensions \(L\) et \(C\) fournies, en mappant les coins vers les extrémités de la nouvelle image : \((0,0)\), \((C-1, 0)\), \((0, L-1)\) et \((C-1, L-1)\).
  • Chargez l’image locale sudoku.png et convertissez-la en niveaux de gris (grayscale).
  • Calculez la matrice d’homographie et appliquez la transformation spatiale sur l’image.
  • Sortie : Calculez et imprimez la somme de tous les pixels de l’image résultante.

📌 Important :

  • Fichier d’entrée : L’image sudoku.png doit se trouver dans le même dossier que le script. Le programme doit la lire directement depuis le disque (ex : en utilisant mm.read("sudoku.png") ou cv2.imread).
  • Ordre des points : Assurez-vous que la lecture des 4 points d’origine et la génération des 4 points de destination suivent rigoureusement le même ordre des coins : Supérieur-Gauche (TL), Supérieur-Droit (TR), Inférieur-Gauche (BL) et Inférieur-Droit (BR).
  • Dimensions dans OpenCV : N’oubliez pas que des fonctions comme cv2.warpPerspective attendent la taille de l’image de sortie au format (largeur, hauteur), ce qui équivaut à (C, L).
  • Interpolation : Pour garantir la cohérence mathématique de la somme des pixels avec le correcteur automatique, utilisez l’interpolation bilinéaire par défaut (flags=cv2.INTER_LINEAR).
  • Crédits : L’image utilisée est « Sudoku en periódico » de Héctor Rodríguez, sous licence CC BY 2.0.

2.12.11.1 🧠 Contexte du Problème

L’homographie possède 8 degrés de liberté, nécessitant au minimum 4 correspondances de points pour être calculée. Contrairement aux transformations affines, elle mappe n’importe quel quadrilatère sur un autre quadrilatère, permettant ainsi aux lignes qui convergent vers des points de fuite de redevenir parallèles :

Opération Caractéristique Application Typique
Homographie Projection entre plans Rectification de documents, numérisation de plaques et de codes QR.
Mappage inverse Balayage de la destination vers l’origine Évite les « trous » ou les pixels vides dans l’image finale redressée.
Warping Rééchantillonnage spatial Correction de la distorsion des lentilles et assemblage de panoramas (stitching).

2.12.11.2 📌 Exemples

Entrée Sortie Observation
500
500
100 120
420 95
80 440
450 460
32982820 Les deux premières entrées sont les dimensions de sortie (\(L\) et \(C\)). Les 4 lignes suivantes sont les coordonnées \((x, y)\) des coins du Sudoku dans l’image originale + PAD. La sortie est la somme totale des pixels de l’image redressée.
200 200
100 120
420 95
80 440
450 460
5277150 Mêmes points d’origine que l’exemple précédent, mais en générant une image de sortie plus petite (\(200 \times 200\)). La somme des pixels diminue proportionnellement en raison de l’échelle.

2.12.11.3 Acquisition de l’image du sudoku et conversion en niveaux de gris

La Figure 2.22 montre la lecture de l’image originale, suivie de la conversion en tons de gris et du redimensionnement en une matrice de \(500 \times 500\) pixels, préparant les données pour l’étape suivante.

La correction de perspective, appliquée via la matrice d’homographie dans Figure 2.23, élimine les déformations causées par l’angle de la caméra et produit une vue frontale et régulière de la grille de Sudoku.

Figure 2.22: Aquisição da imagem de um Sudoku à esquerda. À direita, conversão para tons de cinza e redimensionamento. Crédito: Héctor Rodríguez de Guardamar, Espanha (CC BY 2.0).
import cv2
import numpy as np

# --- 1. Charger l'image enregistrée (sudoku.png) ---
img = mm.read("sudoku.png")                # BGR, 500×500

# --- 2. Padding pour ne pas couper les sommets ---
PAD = 60
img_pad = cv2.copyMakeBorder(
    img, PAD, PAD, PAD, PAD,
    cv2.BORDER_CONSTANT, value=[255, 255, 255]
)

# --- 3. Points d'origine (coins de la grille dans l'image agrandie) ---
pts1 = np.float32([
    [100, 160],    # TL
    [390, 45],    # TR
    [200, 580],   # BL
    [570, 420],   # BR
])
#     W    H

# --- 4. Points de destination (vue frontale 500×500) ---
SIZE = 500
pts2 = np.float32([
    [0,    0],
    [SIZE, 0],
    [0,    SIZE],
    [SIZE, SIZE],
])

# --- 5. Homographie et redressement ---
img_rect = mm.perspective_transform(img_pad, pts1, pts2, size=(SIZE, SIZE))

# --- 6. Affichage ---
mm.show(
    [img_pad, img_rect],
    titles=["Original (avec padding)", "Vue frontale redressée"],
    cols=2, figsize=(10, 6), axis=True
)
Figure 2.23: Correction de perspective : vue originale et vue frontale redressée.
🎮 Simulateur EP02_11 : Perspective du Sudoku Homographie 3×3 · CC BY 2.0
📷 Original (élargie) — Faites glisser les coins Photo : Héctor Rodríguez · CC BY 2.0
✅ Corrigée (400×400) — Vue frontale
Chargement de l'image du Sudoku...
Figure 2.24: Simulateur EP02_11 : Correction de perspective du Sudoku (Homographie 3×3 avec rééchantillonnage bilinéaire)
%%writefile EP02_11.py
# Code Python
Overwriting EP02_11.py
TestSuite("EP02_11.py").run()
✔️ EP02_11.cases existe déjà dans casos/
📋 4 cas chargé(s) depuis casos/EP02_11.cases

🔍 Test de Python : EP02_11.py
⚠️ EP02_11.py : fichier vide (moins de 3 lignes). Tests ignorés.