Nell’Image Analysis si opera spesso sempre sulla stessa immagine mantenendola costante nella sua dimensione. Esistono però alcune elaborazioni particolari che richiedono la generazione della stessa immagine in una serie di versioni a risoluzioni diverse. Spesso si possono notare riscontrare differenze di comportamento delle tecniche usate, come per esempio riconoscimento di oggetti, a diverse risoluzioni. Questa tecnica viene chiamata Image Pyramid.
La tecnica di Image Pyramid
Questa tecnica prende questo nome a causa della serie di immagini generate con diversa risoluzione (e anche diversa dimensione) che impilate una sopra l’altra vanno a formare proprio una piramide. Esistono due tipi di tecniche di Image Pyramids:
- Gaussian Pyramid
- Laplacian Pyramid
Al livello più alto della piramide abbiamo l’immagine a minore risoluzione, con pochi pixel e di dimensioni più piccola di quella sottostante, e via via scendendo avremo immagini a risoluzione sempre maggiore, con maggiori dimensioni fino ad arrivare alla base della piramide che è proprio l’immagine di partenza (quella a risoluzione massima). Ma vediamo in dettaglio come funzionano queste due tecniche e come si differenziano tra di loro.
Gaussian Pyramid
Per l’elaborazione di una Gaussian Pyramid, le fasi di lavoro sono due:
- sfocatura (blurring)
- decimazione (downsampling)
La creazione di una Gaussian Pyramid inizia applicando un filtro di sfocatura all’immagine originale, cioè la fase di Blurring. Questo filtro è generalmente un kernel gaussiano che riduce l’informazione ad alta frequenza nell’immagine. La formula per la sfocatura gaussiana è:
Dove è l’intensità dell’immagine originale e rappresenta l’operazione di convoluzione.
Dopo la sfocatura, l’immagine viene ridotta di dimensione attraverso l’operazione di downsampling. Questo passo riduce la risoluzione dell’immagine.
La formula per il downsampling è:
Dove è l’immagine risultante dopo il downsampling e è l’intensità dell’immagine originale negli indici dimezzati.
Laplacian Pyramid
La Laplacian Pyramid è un’elaborazione ulteriore rispetto a quella gaussiana, ed è basata invece sulla differenza tra i livelli successivi della Gaussian Pyramid.
Dove è il livello corrispondente nella Laplacian Pyramid, è il livello corrispondente nella Gaussian Pyramid, e è l’operazione di upsampling.
L’operazione di upsampling è il processo inverso del downsampling. Nel caso della Gaussian Pyramid, l’upsampling coinvolge la ripetizione delle righe e delle colonne, seguito da un’applicazione di filtro di sfocatura.
La formula per l’upsampling è:
Dove è l’operazione di convoluzione.
In sintesi, la Gaussian Pyramid è ottenuta applicando sfocatura e downsampling iterativamente, mentre la Laplacian Pyramid è ottenuta sottraendo le versioni espansed della Gaussian Pyramid dai livelli stessi. Questo processo consente di rappresentare l’immagine a diverse scale di risoluzione.
Implementiamo con Python la tecnica del Gaussian Pyramid
Per comprendere al meglio questa tecnica non c’è niente di meglio che applicare tali concetti direttamente attraverso il codice Python e la libreria OpenCV. Per prima cosa, scegliamo un’immagine che utilizzeremo come base per questa tecnica. Prendiamo per esempio questa immagine Torino.jpg che raffigura la Mole Antonelliana di Torino. Puoi fare il download dell’immagine seguente da usare per gli esempi.
A questo punto cominciamo con una parte del codice che caricherà l’immagine in memoria e la preparerà per l’elaborazione della Gaussian Pyramid.
import cv2
import numpy as np
import matplotlib.pyplot as plt
# Funzione per visualizzare le immagini
def display_images(images, titles):
plt.figure(figsize=(12, 6))
for i in range(len(images)):
plt.subplot(2, 3, i+1)
plt.imshow(cv2.cvtColor(images[i], cv2.COLOR_BGR2RGB))
plt.title(titles[i])
plt.xticks([]), plt.yticks([])
plt.show()
# Leggi l'immagine
img = cv2.imread('Torino.jpg')
Nel codice sopra abbiamo definito una funzione che ci tornerà utile per mostrare 6 versioni a diversa risoluzione della nostra immagine di esempio che saranno il risultato dell’Image Pyramid con il metodo gaussiano.
# Creare una Gaussian Pyramid
gaussian_pyramid = [img]
for i in range(5):
img = cv2.pyrDown(img)
gaussian_pyramid.append(img)
# Visualizza la Gaussian Pyramid
titles = ['Original Image'] + [f'Level {i}' for i in range(1, 7)]
display_images(gaussian_pyramid, titles)
Il codice per implementare la Gaussian Pyramid è molto semplice con un ciclo for a 5 iterazioni per produrre in totale 6 immagini (una è quella a risoluzione originale). Il tutto è abbastanza semplice, perchè il calcolo viene effettuato tutto con una singola funzione cv2.pyrDown()
che accetta come argomento l’immagine a più alta risoluzione e poi fa un downsamplig. Al termine del ciclo facciamo la visualizzazione di tutte e 6 le immagini.
Implementiamo con Python la tecnica del Laplacian Pyramid
Adesso possiamo continuare sfruttando il codice precedente per applicare ai risultati ottenuti l’elaborazione successiva per ottenere una Laplacian Pyramid.
# Creare una Laplacian Pyramid
laplacian_pyramid = [gaussian_pyramid[5]]
for i in range(5, 0, -1):
gaussian_expanded = cv2.pyrUp(gaussian_pyramid[i])
# Ridimensiona l'immagine espansa per farla corrispondere alle dimensioni di gaussian_pyramid[i-1]
rows, cols, _ = gaussian_pyramid[i-1].shape
gaussian_expanded = cv2.resize(gaussian_expanded, (cols, rows))
laplacian = cv2.subtract(gaussian_pyramid[i-1], gaussian_expanded)
laplacian_pyramid.append(laplacian)
# Visualizza la Laplacian Pyramid
titles = [f'Level {i}' for i in range(6)]
display_images(laplacian_pyramid, titles)
Applichiamo quindi il metodo sottrattivo con il metodo cv2.subtract()
sempre attraverso un ciclo for
che per prima cosa renderà identiche le dimensioni delle immagini ai diversi livelli della piramide e poi effettuerà l’upsampling.
Applicazioni del metodo dell’Image Pyramid
Adesso che abbiamo visto di che cosa si tratta l’Image Pyramid, e come attuarla mediante il codice in Python, vediamo come si può applicare questa metodica in alcune applicazioni di computer vision e elaborazione delle immagini. Le principali finalità includono:
- Rilevamento di Oggetti a Diverse Scale:
Le Image Pyramid sono spesso impiegate per il rilevamento di oggetti a diverse scale all’interno di un’immagine. Ad esempio, quando si utilizzano algoritmi di rilevamento di oggetti come il rilevamento di caratteristiche chiave (keypoint detection) o il rilevamento di contorni, lavorare su diverse scale può aumentare la robustezza del rilevamento. - Tracciamento di Movimenti:
Nell’analisi di sequenze video, le Image Pyramid possono essere usate per tracciare oggetti in movimento su diverse scale di risoluzione. Questo può migliorare l’affidabilità del tracciamento, specialmente quando gli oggetti si avvicinano o si allontanano dalla telecamera. - Compressione d’Immagine:
Le Image Pyramid possono essere utilizzate per la compressione d’immagine. Ad esempio, la JPEG2000 utilizza un approccio piramidale per rappresentare diverse risoluzioni dell’immagine, consentendo una maggiore compressione con la possibilità di decodificare e visualizzare porzioni dell’immagine a diverse risoluzioni. - Ricostruzione d’Immagine:
Le Laplacian Pyramid in particolare è utilizzata per la decomposizione e la ricostruzione d’immagine. Questo può essere utile in applicazioni come la compressione senza perdita e l’editing delle immagini. - Ottimizzazione e Filtri Multirisoluzione:
Le Image Pyramid sono coinvolte anche in algoritmi di ottimizzazione e filtri multirisoluzione, dove le informazioni a diverse scale sono sfruttate per migliorare la qualità dei risultati.
In generale, l’utilizzo di Image Pyramid consente di gestire efficacemente le informazioni a diverse scale di risoluzione, contribuendo a migliorare la performance di vari algoritmi di elaborazione delle immagini e computer vision.