Chapitre 4 TP Python : Redressement d’images

Dans ce TP, on met en application les techniques de géométrie projective pour redresser des images. On s’appuie sur la Section 2.6 et les notations pour les matrices indiquées ci-dessous sont celles de cette section.

Le fonctionnement de ce TP est identique au précédent :

  • On travaille avec un brouillon et un stylo avant de se lancer dans le code.
  • Le rendu est un fichier Jupyter Notebook (.ipynb) accompagné éventuellement des fichiers image utilisées.
  • Le rendu a lieu sur Moodle au plus tard une semaine après la séance. Un demi-point de bonus est attribué pour chacun des deux TPs.
  • Pour chaque fonction créée, des tests seront effectués, par exemple avec les valeurs traitées en exercice.
  • La mise en forme est faite en Markdown.
  • Après le titre, le fichier commencera par charger les bibliothèques indispensables :
#Chargement des biliothèques utilisées

import numpy as np
import matplotlib.pyplot as plt

4.1 Création des matrices utilisées

Exercice 4.1 Créer une fonction point_vecteur(p) qui prend en entrée un point \(p\) de coordonnées \((x,y)\) et retourne le vecteur \(\begin{bmatrix}x\\ y\\1\end{bmatrix}\).

Exercice 4.2 Créer une fonction repere_projectif(p_1,p_2,p_3,p_4) qui prend en entrée 4 points \(p_i=(x_i,y_i)\) de \(\mathbf{R}^2\) et retourne un booléen selon que les 4 points forment un repère projectif ou non.

On pourra introduire les vecteurs \(v_i=(x_i,y_i,1)\) et utiliser la fonction det de numpy.linalg.

Exercice 4.3 Créer une fonction matrice_A(p_1,p_2,p_3,p_4) qui prend en entrée 4 points \(p_i=(x_i,y_i)\) de \(\mathbf{R}^2\) et retourne la matrice \(A\) de la Section 2.6.

Exercice 4.4 Créer une fonction matrice_B(p_1,p_2,p_3,p_4) qui prend en entrée 4 points \(p_i=(x_i,y_i)\) de \(\mathbf{R}^2\) et retourne la matrice \(B\) de la Section 2.6.

Exercice 4.5 Créer une fonction matrice_C(p_1,p_2,p_3,p_4) qui prend en entrée 4 points \(p_i=(x_i,y_i)\) de \(\mathbf{R}^2\) et retourne la matrice \(C\) de la Section 2.6.

Exercice 4.6 Créer une fonction matrice_passage(p_1,p_2,p_3,p_4,p'_1,p'_2,p'_3,p'_4) qui en prend en entrée 2 quadruplets de points, vérifie qu’ils forment des repères projectifs, si oui retourne la matrice \(P\) de la Section et sinon lève une erreur avec une commande du type

if condition:
    raise ValueError("Message d'erreur")

4.2 Changement de perspective sur des images

Exercice 4.7 Créer une fonction rectification_projective_A4(p_1,p_2,p_3,p_4,image) qui prend en entrée 4 points \((p_1,p_2,p_3,p_4)\) d’une image (préalablement importée avec une commande du type image = plt.imread("image.jpg") et retourne une image au format A4 où le quadrilatère de sommets \(p_1,p_2,p_3,p_4\) a été redressé sur la nouvelle image au format A4. Pour cela on suivra les instructions suivantes :

  1. On créera une nouvelle image noire pour commencer de taille 594*420 pixels (un A4, c’est 29,7 cm par 21 cm, on mutliplie ces nombres par 20) avec une commande du type nouvelle_image=np.zeros((594,420, 3), dtype = np.uint8)
  2. Quelles sont les coordonnées des 4 coins de la nouvelle image ?
  3. Les points \(p_1,p_2,p_3\) et \(p_4\) seront envoyés sur ces 4 coins. Il faudra bien faire attention à l’ordre !
  4. Pour remplir les pixels de la nouvelle image, on fera une boucle qui parcourt tous les pixels de la nouvelle image. On appliquera la fonction \(g^{-1}\) de la Section 2.6 et on récupèrera les niveaux de couleurs de l’image initiale comme on a pu le faire dans le premier TP.
  5. Tester votre code sur le fichier ds.jpg qui se trouve sur Moodle. Les 4 coins sont aux coordonnées suivantes : (539,37),(2718,1285),(120,1428),(1520,2919) si on suit l’ordre hat gauche, bas gauche, haut droit, bas droit.
Un scan d'un énoncé d'évaluation à redresser.

Figure 4.1: Un scan d’un énoncé d’évaluation à redresser.

Exercice 4.8 (anamorphose des ambassadeurs) Observer la photographie du tableau "les ambassadeurs" du peintre Holbein qui se trouve dans le dossier du TP sur Moodle. Que voyez-vous au pied des deux ambassadeurs ? Lorsque l’on regarde le vrai tableau sous un certain angle, on voit clairement apparaitre la nature de cette forme.

Nous allons utiliser nos outils de changement de perspective pour obtenir le même effet. On parle d’anamorphose.

Reprendre votre code de l’Exercice 4.7 pour créer cette anamorphose en suivant les consignes suivantes :

  1. L’image initiale sera ambassadeurs.jpg
  2. La nouvelle image aura pour taille \(1420 \times 350\) (hauteur \(\times\) largeur).
  3. Les sommets de l’image initiale seront envoyés sur les points suivants :
    1. Coin supérieur gauche : (5,5)
    2. Coin inférieur gauche : (947,77)
    3. Coin inférieur droit : (1413,342)
    4. Coin supérieur droit : (469,268)
  4. Quelle est la forme que vous voyez apparaître ?
Les Ambassadeurs par Holbein.

Figure 4.2: Les Ambassadeurs par Holbein.

Exercice 4.9 Pour cet exercise, c’est à vous de prendre en photo un document A4 pour le redresser.

  1. Charger la photo que vous avez prise dans votre dossier courant.
  2. Récupérer les coordonnées des 4 sommets de votre document. Pour cela, il y a plusieurs possibilités :
    1. Lancer la commande magique %matplotlib qt pour afficher l’image dans une nouvelle fenêtre et lire les coordonnées en déplaçant la souris (c.f. l’exemple de code ci-dessous). Il faut faire attention à l’ordre des coordonnées.
    2. Ou tiliser un logiciel de traitement d’images et afficher les règles pour les coordonnées.
  3. Appliquer la fonction rectification_projective_A4(p_1,p_2,p_3,p_4,image)avec les bonnes coordonnées.
# Exemple de code pour récupérer les coordonnées

%matplotlib qt
import matplotlib.pyplot as plt

image = plt.imread('image.jpg')
plt.imshow(image)

Exercice 4.10 Des étudiants de l’IUT, ont fait un joli dessin sur le tableau mais malheureusement, la photo a été prise de côté et on n’arrive pas à lire le nom du personnage. Le tableau est en trois parties. En sachant que la partie du milieu a une taille avec un rapport hauteur/largeur identique à une image de \(850\times 1450\), arriverez-vous à lire le nom du personnage ?

Un joli dessin au tableau.

Figure 4.3: Un joli dessin au tableau.

Exercice 4.11 (bonus) Automatiser les étapes de redressement de la perspective d’un scan en cliquant sur les 4 coins de la feuille souhaités. On réalisera les étapes suivantes :

  1. Ouvrir une fenêtre de visualisation de l’image et demander à l’utilisateur de cliquer successivement sur les 4 coins de la feuille (en précisant l’ordre). Vous pourrez récupérer ces 4 coins (en vous inspirant du début de code ci-dessous), appliquer le changement de perspective et stocker le résultat dans une nouvelle variable d’image.
  2. Ouvir une nouvelle figure avec la commande plt.figure()et afficher le résultat dans la nouvelle figure.
# Exemple de code pour récupérer les coordonnées

# Au clic sur un point de l'image, les variable i et j 
# prennent pour valeurs les coordonnées du pixel 
# sur lequel on clique (Attention à l'ordre !)

%matplotlib qt
import matplotlib.pyplot as plt

image = plt.imread('image.jpg')
plt.imshow(image)

def on_click(event):
    if event.button is MouseButton.LEFT:
        j=event.xdata
        i=event.ydata
        
plt.connect('button_press_event', on_click)
plt.show()