Se stai utilizzando OpenCV in un ambiente Python, scoprirai che la libreria matplotlib è lo strumento perfetto per la visualizzazione delle immagini prodotte durante l’attività di Image Analysis. Infatti questa libreria è molto flessibile e permette di poter effettuare delle personalizzazioni e delle modalità di visualizzazione che gli strumenti interni di OpenCV non possiedono. Vedremo con un paio di esempi come visualizzare le immagini sia singolarmente che in gruppo mediante plot e subplot.
[wpda_org_chart tree_id=37 theme_id=50]
Gli svantaggi di usare cv2.imshow()
OpenCV è una libreria che è stata sviluppata per lavorare con il linguaggio C++. Quindi i suoi sistemi di visualizzazione interni in questo ambito sono molto apprezzati ed utili. Se invece si sta lavorando con Python, l’uso di tali strumenti, come per esempiocv2.imshow()
, per la visualizzazione di immagini con OpenCV ha alcuni svantaggi da considerare:
- Ambiente di sviluppo specifico:
cv2.imshow()
è più comunemente utilizzato in ambienti di sviluppo basati su script, come ad esempio quando si sviluppa e testa codice Python da riga di comando. Non è altrettanto conveniente quando si lavora in ambienti più interattivi come i Jupyter Notebooks, dove Matplotlib potrebbe offrire maggiore flessibilità. - Interazione limitata:
cv2.imshow()
fornisce un’interazione di base con l’utente, come la possibilità di ridimensionare l’immagine, ma non offre lo stesso livello di controllo e flessibilità offerto da Matplotlib. - Problemi con alcuni ambienti di sviluppo: In alcuni ambienti di sviluppo, come alcuni IDE,
cv2.imshow()
potrebbe comportare problemi di visualizzazione o di interazione, specialmente in sistemi operativi basati su Windows. - Dipendenza dal loop degli eventi di OpenCV:
cv2.imshow()
richiede spesso l’uso dicv2.waitKey()
per gestire gli eventi della tastiera. Questo può rendere più complessa la gestione degli eventi e potrebbe portare a problemi in alcune situazioni.
Per mitigare questi svantaggi, spesso gli sviluppatori preferiscono utilizzare Matplotlib, che offre una maggiore flessibilità e un ambiente più adatto a diverse esigenze di visualizzazione, specialmente in scenari di sviluppo più complessi o interattivi.
Utilizzare Matplotlib per visualizzare le immagini di OpenCV
Matplotlib è una libreria di visualizzazione in Python che consente di creare grafici, grafici e, nel nostro caso, di visualizzare immagini. Anche se matplotlib non è l’unico modo di visualizzare immagini con OpenCV, è ormai quasi una prassi comune. Questo soprattutto per la sua flessibilità e la sua facilità d’uso nel contesto di Python. Quindi anche OpenCV ha i suoi metodi di visualizzazione, come ad esempio cv2.imshow()
, l’uso di Matplotlib offre molti vantaggi, tra cui:
- Integrazione con Python: Matplotlib è una libreria Python, il che facilita l’integrazione con il codice Python che potresti già avere.
- Flessibilità: Matplotlib offre un controllo dettagliato sulla visualizzazione delle immagini. Puoi personalizzare l’aspetto della visualizzazione, aggiungere etichette, titoli, legende e altro ancora.
- Interattività: Matplotlib consente una maggiore interattività nella visualizzazione. Ad esempio, puoi ingrandire, spostare e salvare facilmente la visualizzazione in vari formati.
- Supporto per Jupyter Notebooks: Se stai lavorando in un ambiente come i Jupyter Notebooks, Matplotlib è particolarmente comodo, poiché può visualizzare immagini direttamente all’interno del notebook.
Tuttavia, se preferisci utilizzare i metodi di visualizzazione di OpenCV, puoi certamente farlo, soprattutto se stai lavorando in un contesto in cui la visualizzazione dettagliata non è una priorità e preferisci una soluzione più leggera e veloce. La scelta tra Matplotlib e OpenCV dipende spesso dalle tue esigenze specifiche e dalle preferenze personali.
Visualizzare un’immagine di OpenCV con matplotlib
Mostriamo qui un semplicissimo esempio in Python, che ci permette di mostrare il pattern minimo di comandi da utilizzare per visualizzare un’immagine generata come valore restituito da una delle molte funzioni della libreria OpenCV. Questo esempio potrà servire come guida per poter OpenCV e Matplotlib per la visualizzazione di un’immagine.
Ricorda che dovrai installare le librerie necessarie se non le hai già installate. Puoi farlo con il seguente comando:
pip install opencv-python matplotlib
Prendiamo come esempio l’immagine seguente:
Cliccate con il pulsante destro del mouse su di essa e scaricatela sul vostro computer, salvandola semplicemente come leaf.jpg.
import cv2
from matplotlib import pyplot as plt
# Carica un'immagine con OpenCV
image_path = "leaf.jpg"
image = cv2.imread(image_path)
# OpenCV legge l'immagine in formato BGR, ma Matplotlib visualizza le immagini in formato RGB,
# quindi dobbiamo convertire il formato prima di visualizzarlo
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# Visualizza l'immagine con Matplotlib
plt.imshow(image_rgb)
plt.title('Image shown by Matplotlib')
plt.axis('off') # Nasconde gli assi x e y
plt.show()
Eseguendo il codice otterrai la seguente visualizzazione:
Come possiamo vedere abbiamo una perfetta riproduzione dell’immagine originale, con un titolo posto sopra di essa. Questo è un esempio di base, ma ci sono molte cose che puoi fare con OpenCV e Matplotlib per analizzare e visualizzare immagini. Ad esempio, puoi combinare più immagini, disegnare forme o regioni di interesse sull’immagine, applicare filtri e altro ancora.
Visualizzare più immagini contemporaneamente con matplotlib
Uno degli aspetti più utilizzati con Matplotlib è la possibilità di poter visualizzare più immagini contemporaneamente all’interno di una singola visualizzazione. Puoi farlo utilizzando i subplots di Matplotlib, che consentono di organizzare più immagini in una griglia o in un layout personalizzato. Aggiungiamo una seconda immagine:
Scaricala come fatto con l’immagine precedente, salvandola con il nome torino.jpg. Puoi usare anche un’altra immagine a tua scelta.
Una volta scaricata anche la seconda immagine, riformuliamo il codice precedente per poter visualizzare entrambe le immagini attraverso i subplot.
import cv2
from matplotlib import pyplot as plt
# Carica le immagini con OpenCV
image1 = cv2.imread("leaf.jpg")
image2 = cv2.imread("torino.jpg")
# Converti le immagini da BGR a RGB
image1_rgb = cv2.cvtColor(image1, cv2.COLOR_BGR2RGB)
image2_rgb = cv2.cvtColor(image2, cv2.COLOR_BGR2RGB)
# Crea una visualizzazione a due subplots
plt.subplot(1, 2, 1) # 1 riga, 2 colonne, primo subplot
plt.imshow(image1_rgb)
plt.title('Image 1')
plt.axis('off')
plt.subplot(1, 2, 2) # 1 riga, 2 colonne, secondo subplot
plt.imshow(image2_rgb)
plt.title('Image 2')
plt.axis('off')
# Mostra la visualizzazione
plt.show()
In questo esempio, plt.subplot(1, 2, 1)
definisce il primo subplot nella griglia con una singola riga e due colonne, mentre plt.subplot(1, 2, 2)
definisce il secondo subplot. Eseguendo il codice infatti si ottiene il seguente risultato.
Puoi personalizzare il numero di righe e colonne in base al numero di immagini che desideri visualizzare contemporaneamente.
Conclusione
Puoi estendere questa idea per creare layout più complessi con più righe e colonne. Matplotlib fornisce molte opzioni per la personalizzazione dei subplots e delle loro posizioni, offrendo una grande flessibilità nella creazione di visualizzazioni multiple.
Questo è solo un punto di partenza, e puoi approfondire ulteriormente le funzionalità di entrambe le librerie per adattarle alle tue esigenze specifiche.