TNI+VO · Exercice de Programmation

EP01_10 — 📄 Métadonnées : Lecture de fichier PGM

1.19.10 EP01_10 📄 Métadonnées : Lecture de fichier PGM

Dans cette activité, vous devez lire un fichier image au format PGM (Portable Gray Map) et extraire ses dimensions à partir de l’en-tête.

  • Le format PGM (P2) est un fichier texte simple (ASCII) qui stocke des images en niveaux de gris.
  • Le fichier possède un en-tête structuré de la manière suivante :
  1. Version : L’identifiant P2.
  2. Commentaires : Lignes optionnelles commençant par # (à ignorer).
  3. Dimensions : Deux entiers représentant la Largeur et la Hauteur.
  4. Maximum : Un entier représentant l’intensité maximale (généralement 255).
  • Après l’en-tête, suivent les données des pixels.

📌 Important :

  • Lecture du fichier : Vous devez ouvrir le fichier indiqué dans l’exemple en utilisant la fonction open() de Python.
  • Ordre de sortie : Contrairement à l’ordre présent dans le fichier, la sortie attendue doit être au format de tuple : (Hauteur, Largeur, Canaux).
  • Comme les fichiers PGM sont en niveaux de gris, le nombre de Canaux est toujours 1.
  • Consultez un simulateur interactif pour cette question sur Figure 1.20 (ajustez les dimensions pour voir comment l’en-tête ASCII est généré).

1.19.10.1 🧠 Comprendre le format PGM

Le format PGM est l’un des plus simples pour le traitement d’images. Étant en texte pur, il permet de visualiser les métadonnées et même les valeurs des pixels en ouvrant le fichier dans un bloc-notes :

Composant Exemple Signification
Nombre magique P2 Identifie qu’il s’agit d’un PGM au format texte (ASCII).
Commentaire # CREATOR... Ligne informative ignorée par le processeur.
Dimensions 397 343 397 colonnes (Largeur) et 343 lignes (Hauteur).
Intensité 255 Définit la valeur du blanc pur (échelle de 0 à 255).

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

Entrée :

Aucune entrée via le clavier. Le programme doit lire le fichier "aula01fig03b.pgm" présent dans le répertoire d’exécution.

Sortie :

Un tuple contenant (Hauteur, Largeur, 1).

1.19.10.3 📌 Exemples

Nom du fichier Sortie attendue Remarque
“aula01fig03b.pgm” (343, 397, 1) Notez l’inversion de l’ordre : la Hauteur en premier
📄 Simulateur EP01_10: Structure du fichier PGM ASCII P2 & Format (H, W, C)

Modifiez les dimensions de largeur (W) et de hauteur (H) pour observer le montage dynamique de l'en-tête PGM et le format du tuple du tableau résultant en Python (Lignes × Colonnes × Canaux).

DÉFINITIONS DE L'IMAGE
💡 Attention à la convention : L'en-tête PGM déclare d'abord W H (Largeur × Hauteur), tandis que le tableau en Python/NumPy rapporte le tuple comme (H, W, C) (Lignes × Colonnes × Canaux).
CONTENU DU FICHIER (.PGM)
P2
# CRÉATEUR : UFABC PDI / EP01_10
397 343
255
120 134 210 0 85 255 ...
Sortie de la fonction mm.readImg (Format du tableau) :
(343, 397, 1)
Figure 1.20: Simulateur EP01_10 : Structure du fichier PGM (En-tête ASCII P2 et mappage vers un tuple Python)
NoteNote

Le fichier nécessaire pour ce TP sera téléchargé automatiquement depuis le dépôt via le code suivant :

import os, urllib.request

BASE_URL = "https://raw.githubusercontent.com/fzampirolli/pdi-vc/master/all/cap01/imagens"
file = "aula01fig03b.pgm"

opener = urllib.request.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
urllib.request.install_opener(opener)

for f in [file]:
    if not os.path.exists(f):
        url = f"{BASE_URL}/{f}"
        try:
            urllib.request.urlretrieve(url, f)
            print(f"✅ Fichier téléchargé : {f}")
        except urllib.error.HTTPError as e:
            print(f"❌ Erreur {e.code} : Introuvable dans {url}")
%%writefile EP01_10.py
# votre solution
Overwriting EP01_10.py
TestSuite("EP01_10.py").run()
✔️ EP01_10.cases existe déjà dans casos/
📋 1 cas chargé(s) depuis casos/EP01_10.cases

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