EDI+VA · Esercizio di Programmazione

EP02_07 — 🔍 Ridimensionamento (Scala)

2.12.7 EP02_07 🔍 Ridimensionamento (Scala)

In questa attività, devi implementare il ridimensionamento di un’immagine utilizzando fattori di scala. Diversamente dal semplice sottocampionamento, qui useremo tecniche di interpolazione per consentire sia l’ingrandimento che la riduzione dell’immagine.

  • Leggi due interi L e C, che rappresentano le dimensioni della matrice originale.
  • Leggi due valori reali \(s_x\) (scala sulle righe) e \(s_y\) (scala sulle colonne).
  • Leggi una stringa che rappresenta il metodo di interpolazione (nearest o bilinear).
  • Leggi i valori interi della matrice originale.
  • Calcola le nuove dimensioni: \(L' = \text{round}(L \times s_x)\) e \(C' = \text{round}(C \times s_y)\).
  • Stampa la matrice risultante con le nuove dimensioni.
  • Vedi in Figura 2.18 una simulazione di questo EP.

📌 Importante:

  • Mappatura inversa: Per ogni pixel \((x', y')\) dell’immagine di destinazione, trova la posizione corrispondente nell’origine usando \((x, y) = (x'/s_x, y'/s_y)\).

  • Interpolazione:

  • nearest: Seleziona il valore del pixel più vicino (arrotondamento delle coordinate).

  • bilinear: Esegue un’interpolazione lineare doppia tra i quattro pixel vicini più prossimi nell’immagine originale.

  • Bordi: Assicurati che la mappatura non tenti di accedere a indici al di fuori dell’intervallo \([0, L-1]\) e \([0, C-1]\).

2.12.7.1 🧠 Interpolazione per Ingrandimento/Riduzione

Ridimensionare un’immagine mediante fattori \((s_x, s_y)\) richiede il riempimento dei vuoti (nell’ingrandimento) o la fusione delle informazioni (nella riduzione). Il metodo di interpolazione definisce la qualità visiva del risultato:

Metodo Funzionamento Effetto Visivo
Nearest Prende il valore del vicino più prossimo. Veloce, ma genera un effetto “pixelato” o a blocchi.
Bilineare Media ponderata dei 4 vicini (\(2 \times 2\)). Ammorbidisce l’immagine, riducendo l’effetto scalettato (aliasing).

2.12.7.2 📋 Compito (specifica per VPL)

Input:

La prima riga contiene L.

La seconda riga contiene C.

La terza riga contiene i fattori sx e sy.

La quarta riga contiene il metodo interp (nearest o bilinear).

Le righe successive contengono gli elementi della matrice \(L \times C\).

Output:

La matrice ridimensionata con dimensioni \(L' \times C'\).

2.12.7.3 📌 Esempi

Input Output Osservazione
2
2
2.0 2.0
nearest
1 2
3 4
1 1 2 2
1 1 2 2
3 3 4 4
3 3 4 4
Ingrandimento 2×: ogni pixel originale viene replicato in un blocco 2×2. L’immagine \(2\times2\) diventa \(4\times4\).
2
2
0.5 0.5
nearest
10 20
30 40
10 Riduzione 0.5×: l’immagine \(2\times2\) diventa \(1\times1\). Con nearest, l’unico pixel di output campiona la posizione \((0,0)=10\).
🔍 Simulatore EP02_07: Ridimensionamento e Interpolazione (sx = sy) Nearest vs Bilineare

Regola il fattore di scala (s) per confrontare l'interpolazione del vicino più prossimo (replica discreta) con l'interpolazione bilineare (media ponderata dei 4 vicini).

1.0
Fattore = 1.0 → Dimensioni Originali (3×3)  |  Fattore = 2.0 → 6×6  |  Fattore = 4.0 → 12×12
Originale (3×3)
🔲 Nearest Neighbor
🌀 Interpolazione Bilineare
Fattore = 1.00 → dimensione 3×3 (nessuna modifica)
Figura 2.18: Simulatore EP02_07: Ridimensionamento Spaziale e Interpolazione (Nearest Neighbor vs Bilineare)
%%writefile EP02_07.py
# Codice Python
import numpy as np
from morph import mm

# 1. Lettura delle dimensioni, dei fattori e del metodo
l = int(input())
c = int(input())
sx, sy = map(float, input().split())
interp = input().strip()

# 2. Lettura dell'immagine originale
img = mm.readImg(l, c)

# 3. Nuove dimensioni
l_new = round(l * sx)
c_new = round(c * sy)

# 4. Ridimensionamento usando mm.resize
# cv2.resize usa (larghezza, altezza) = (colonne, righe)
resultado = mm.resize(img, (c_new, l_new), method=interp)

# 5. Visualizzazione
print(mm.drawImg(resultado))
Overwriting EP02_07.py
TestSuite("EP02_07.py").run()
✔️ EP02_07.cases esiste già in casos/
📋 5 caso/i caricato/i da casos/EP02_07.cases

🔍 Test di Python: EP02_07.py
✔️ Caso1_Ampliacao_2x_Nearest: OK
✔️ Caso2_Reducao_05x_Nearest: OK
✔️ Caso3_Sem_Escala: OK
✔️ Caso4_Ampliacao_Bilinear: OK
✔️ Caso5_Escala_Assimetrica: OK

📊 Risultato: 5/5 (100.0%)
🎉 Complimenti! Tutti i test sono stati superati.