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.pnget 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.pngdoit se trouver dans le même dossier que le script. Le programme doit la lire directement depuis le disque (ex : en utilisantmm.read("sudoku.png")oucv2.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.warpPerspectiveattendent 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.
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
)
%%writefile EP02_11.py
# Code PythonOverwriting 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.