Site icon Meccanismo Complesso

OpenCV & Python – Image Pyramids

OpenCV & Python - Image Pyramid
OpenCV & Python - Image Pyramid header

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:

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:

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:

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.

Exit mobile version