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).
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 (
nearestobilinear). - 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\). |
%%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.