EDI+VA · Esercizio di Programmazione

EP01_10 — 📄 Metadati: Lettura di File PGM

1.17.10 EP01_10 📄 Metadati: Lettura di File PGM

In questa attività, devi leggere un file immagine nel formato PGM (Portable Gray Map) ed estrarne le dimensioni dall’intestazione.

  • Il formato PGM (P2) è un file di testo semplice (ASCII) che memorizza immagini in scala di grigi.
  • Il file possiede un’intestazione strutturata nel seguente modo:
  1. Versione: L’identificatore P2.
  2. Commenti: Righe opzionali che iniziano con # (devono essere ignorate).
  3. Dimensioni: Due interi che rappresentano Larghezza e Altezza.
  4. Massimo: Un intero che rappresenta l’intensità massima (generalmente 255).
  • Dopo l’intestazione, seguono i dati dei pixel.

📌 Importante:

  • Lettura del File: Devi aprire il file indicato nell’esempio utilizzando la funzione open() di Python.
  • Ordine di Uscita: Contrariamente all’ordine presente nel file, l’output atteso deve essere nel formato di tupla: (Altezza, Larghezza, Canali).
  • Poiché i file PGM sono in scala di grigi, il numero di Canali è sempre 1.
  • Vedi un simulatore interattivo per questa domanda alla Figura 1.20 (regola le dimensioni per vedere come viene generata l’intestazione ASCII).

1.17.10.1 🧠 Comprendere il formato PGM

Il formato PGM è uno dei più semplici per l’elaborazione delle immagini. Essendo in testo puro, consente di visualizzare i metadati e persino i valori dei pixel aprendo il file in un blocco note:

Componente Esempio Significato
Numero Magico P2 Identifica che è un PGM in formato testo (ASCII).
Commento # CREATOR... Riga informativa ignorata dal processore.
Dimensioni 397 343 397 colonne (Larghezza) e 343 righe (Altezza).
Intensità 255 Definisce il valore del bianco puro (scala da 0 a 255).

1.17.10.2 📋 Compito (specifica per VPL)

Input:

Nessun input da tastiera. Il programma deve leggere il file "aula01fig03b.pgm" presente nella directory di esecuzione.

Output:

Una tupla contenente (Altezza, Larghezza, 1).

1.17.10.3 📌 Esempi

Nome del File Output Atteso Osservazione
“aula01fig03b.pgm” (343, 397, 1) Nota l’inversione dell’ordine: Altezza prima
📄 Simulatore EP01_10: Struttura del File PGM ASCII P2 & Formato (H, W, C)

Modifica le dimensioni di larghezza (W) e altezza (H) per osservare l'assemblaggio dinamico dell'intestazione PGM e il formato della tupla dell'array risultante in Python (Righe × Colonne × Canali).

DEFINIZIONI DELL'IMMAGINE
💡 Attenzione alla convenzione: L'intestazione PGM dichiara prima W H (Larghezza × Altezza), mentre l'array in Python/NumPy riporta la tupla come (H, W, C) (Righe × Colonne × Canali).
CONTENUTO DEL FILE (.PGM)
P2
# CREATOR: UFABC PDI / EP01_10
397 343
255
120 134 210 0 85 255 ...
Uscita della Funzione mm.readImg (Formato dell'Array):
(343, 397, 1)
Figura 1.20: Simulatore EP01_10: Struttura del file PGM (Intestazione ASCII P2 e mappatura a tupla Python)
NotaNota

Il file necessario per questo EP verrà scaricato automaticamente dal repository tramite il seguente codice:

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"✅ File scaricato: {f}")
        except urllib.error.HTTPError as e:
            print(f"❌ Erro {e.code}: Non trovato in {url}")
%%writefile EP01_10.py
# la tua soluzione
Overwriting EP01_10.py
TestSuite("EP01_10.py").run()
✔️ EP01_10.cases esiste già in casos/
📋 1 caso/i caricato/i da casos/EP01_10.cases

🔍 Test di Python: EP01_10.py
⚠️ EP01_10.py: file vuoto (meno di 3 righe). Test saltati.