OpenCV & Python – Caricare, visualizzare e salvare le immagini su Raspberry

meccanismo-complesso-opencv-python-raspberry-load-save-image-ita

Introduzione

In questo articolo cominceremo a fare le prime operazioni con la libreria OpenCV. Vedremo come caricare un’immagine e poterla visualizzare.

Per poter seguire gli esempi presenti in questo articolo è necessario avere installata la libreria opencv per Python. Per chi non l’avesse ancora fatto consiglio vivamente di seguire le istruzioni riportate nel seguente articolo:

Gli esempi seguenti sono stati tutti eseguiti su Raspberry Pi 3 Model B

Test iniziale

Per prima cosa dobbiamo testare se la libreria OpenCV è installata correttamente sul nostro sistema. Per chi avesse seguito l’installazione seguendo le istruzioni dell’articolo segnalato nell’introduzione, può far partire prima l’ambiente virtuale cv.

Se tutto funziona correttamente dovreste importare senza alcun problema la libreria OpenCV all’interno di una sessione Python.

$ source ~/.profile
$ workon cv
(cv) $ sudo python
import cv2

Prime approcci all’elaborazione delle immagini: caricare e visualizzare un’immagine

Per prima cosa, dato principalmente OpenCV lavora sulle immagini, è basilare saperle come caricare all’interno di un programma in Python per poterle manipolare successivamente ed infine visualizzarle per vedere i risultati.

NOTA: Se proverete a lavorare lanciando i comandi da sessione riga per riga, noterete dei comportamenti anomali, alcuni comandi non risponderanno come dovrebbero fare. Per esempio, scoprirete presto che le finestre contenenti le immagini non si chiuderanno, almeno se non ad interruzione della sessione Python. Questi comportamenti invece non si evidenziano se si lavora su script in Python. Quindi vi consiglio di lavorare sul codice degli esempi direttamente su file e poi eseguirli tramite il comando python.

Quindi apriamo un file con un qualsiasi text editor, e salvatelo come opencv01.py. 

$ nano opencv01.py

La prima cosa da fare è quella di far leggere alla libreria OpenCV il file corrispondente ad un’immagine attraverso il metodo imread() . Questo metodo non fa altro che leggere il file in un formato compresso come JPG e tradurlo in una struttura dati fatta di matrici numeriche corrispondenti a gradazioni di colore e posizione.

import cv2 as cv

img = cv.imread('logos.jpg')

Se volete toccare con mano, aprite in parallelo una sessione controllate il valore in uscita di cv.imread (o il contenuto di img). Noterete un array di matrici, ognuna corrispondente ad una determinata posizione dell’immagine, e ognuna caratterizzate da numeri compresi tra 0 e 255.

meccanismo-complesso-data-structure-di-img

Continuando con il codice, adesso utilizzeremo il metodo imshow() per creare una finestra contenente l’immagine caricata nella variabile img. Questo metodo vuole due parametri, il nome della finestra, e la variabile immagine.  Una volta creata la finestra, si potrà visualizzarla utilizzando il comando waitKey().

cv.imshow('Image', img)
cv.waitKey(0)

Il piccolo programmino è finito e quindi salviamo il file e lanciamo l’esecuzione.

$ python opencv01.py

Non appena il programma verrà eseguito, subito comparirà la finestra con l’immagine all’interno. La finestra si chiuderà alla pressione di un tasto qualsiasi o attraverso la chiusura manuale.

meccanismo-complesso-opencv-image-loading

Il metodo waitKey() fa partire la visualizzazione di una finestra ed inoltre permette di controllare il tempo di attesa del programma prima di proseguire con il comando successivo. Nel nostro esempio abbiamo utilizzato come argomento il valore 0. Questo significa che l’attesa sarà infinita finchè non si premerà un tasto qualsiasi della tastiera.

Se invece avessimo voluto tenere aperta la finestra solo per un determinato periodo di tempo, allora avremmo dovuto scrivere il numero di millisecondi come parametro. Provate a sostituire il valore all’interno del programma, per esempio 2000, cioè due secondi ed eseguite il programma.

import cv2 as cv

img = cv.imread('logos.jpg')

cv.imshow('Image', img) 
cv.waitKey(2000)

La finestra con l’immagine dovrebbe comparire e poi scomparire dopo solo due secondi.

Comunque per esempi più complessi è utile avere il controllo diretto sulla chiusura di una finestra, senza utilizzare tempi di attesa. Il metodo destroyWindow() ci permette di chiudere la finestra desiderata (potrebbero essere diverse aperte) specificando come argomento il nome della finestra che nel nostro caso è “Image”.

import cv2 as cv

img = cv.imread('logos.jpg')

cv.imshow('Image', img) 
cv.waitKey(2000)
cv.destroyWindow('Image')

Se ci sono più finestre aperte e desideriamo la chiusura di tutte le finestre contemporaneamente con un solo comando allora potremo usare il comando destroyAllWindows().

Lavorare sulle immagini

Adesso che abbiamo visto come visualizzare le immagini esistenti nel nostro file system, possiamo proseguire con il passo successivo. Elaborare l’immagine effettuando una qualsiasi operazione su di essa e salvare il nostro risultato su di un nuovo file.

Continuiamo con l’esempio precedente, lavorando sulla stessa immagine e quindi sullo stesso codice. Questa volta però effettueremo una semplice manipolazione sull’immagine, per esempio, scomponendo i tre canali RBG dell’immagine e scambiarli tra di loro per formare una nuova immagine. Questa nuova immagine avrà naturalmente tutti i colori alterati.

Una volta caricata l’immagine scomponiamola nei tre canali RGB. Possiamo fare questo facilmente utilizzando il metodo split().

b,r,g = cv.split(img)

adesso ricomponiamo i tre canali, ma scambiando l’ordine, per esempio scambiando il canale dei rossi con quello dei verdi. La ricombinazione si può fare facilmente utilizzando il metodo merge().

img2 = cv.merge((b,g,r))

La nuova immagine è contenuta all’interno della variabile img2. Visualizziamola insieme all’originale in una nuova finestra.

Alla fine il codice dovrebbe essere come il seguente.

import cv2 as cv

img = cv.imread('logos.jpg')
b,r,g = cv.split(img)
img2 = cv.merge((b,g,r))
cv.imshow('Image', img)
cv.imshow('Image2', img2) 
cv.waitKey(0)
cv.destroyAllWindows()

Eseguendo il programma otterremo due finestre con l’immagine originale e quella alterata.

meccanismo-complesso-opencv-image-loading-inverted-colors

Salvare i risultati

Infine non ci resta che salvare la nostra nuova immagine salvandola sul file system.

Aggiungiamo in fondo al programma il metodo imwrite() con il nome del nuovo file che vogliamo salvare, che può essere anche di un altro formato, per esempio PNG.

cv.imwrite('newlogos.png',img2)

Eseguite nuovamente il programma e noterete sul file system il nuovo file immagine.

Conclusioni

In questo articolo molto semplice, non costituisce altro che i primi approcci alle tantissime funzionalità che OpenCV ci può offrire per quanto riguarda l’analisi e l’elaborazione delle immagini. Abbiamo visto come caricare un’immagine, modificarla, visualizzarla ed infine salvare il nostro lavoro.

Negli articoli successivi andremo molto più in dettaglio analizzando ulteriori funzionalità che la libreria OpenCV ci può offrire.

Lascia un commento