OpenCV & Python – Operazioni aritmetiche sulle immagini e Image Blending

opencv-python-image-blending-ita

Introduzione

In questo articolo cominceremo a lavorare con le immagini, effettuando delle operazioni aritmetiche su di esse.

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

Prima di cominciare

Apriamo una sessione di terminale e facciamo partire l’ambiente virtuale su cui è installato openCV 3.0 per Python.

$ source ~/.profile
$ workon cv
(cv) $

Creiamo un file draw03.py con un editor di testo.

$ nano draw03.py

ed inseriamo il codice seguente

import numpy as np
import cv2 as cv

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

cv.imshow('Draw03',img1)
cv.waitKey(0)

Questo sarà il codice di partenza degli esempi a seguire. Prima di eseguirlo scaricate, se non lo avete già fatto il file di immagine della figura seguente. Salvatelo come logos.jpg.

logos

Inoltre per svolgere gli esempi in questo articolo sarà necessario utilizzare un’altro file immagine. Scaricate l’immagine seguente e salvatela come arduino.jpg.

arduino

Se eseguite il codice otterrete una finestra con l’immagine logos.jpg all’interno.

$ python draw03.py

Operazioni elementari sulle immagini

L’operazione base da utilizzare con due immagini è l’addizione. E’ possibile fare l’addizione di due immagini con la funzione cv2.add(). Il risultato ottenuto sarà la combinazione delle due immagini. Importante aggiungere che le due immagini devono corrispondere perfettamente in dimensioni.

img2 = cv.imread('arduino.jpg')
img = cv.add(img1,img2)

cv.imshow('Draw03',img)

Eseguendo il programma otterremo la combinazione delle due immagini. Purtroppo l’effetto non è molto accattivante.

meccanismo-complesso-images-addition

Il risultato non è proprio quello che ci aspettavamo. La prevalenza dei bianchi è infatti il risultato aritmetico della semplice somma dei tre valori RGB per ogni singolo pixel. Infatti sappiamo che ognuna delle tre componenti RGB assume valori da 0 a 255, quindi se la somma dei valori di un determinato pixel è maggiore di 255 (cosa alquanto probabile) il valore sarà comunque 255. Quindi la semplice operazione di sommare delle immagini non porta ad una immagine che è la via di mezzo tra le due, bensì allo schiarimento progressivo via via sempre di più verso il bianco.

In seguito vedremo come il concetto di addizione di due immagini sia quello di creare una nuova immagine che sia la metà delle due (non è la somma aritmetica).

Stesso ragionamento lo possiamo fare sottraendo due immagini. Questa operazione si può effettuare con la funzione cv2.subtract(). Questa volta ci aspetteremo un’immagine che tenderà sempre più verso il nero. Sostituiamo la riga con cv2.add() con questa.

img = cv.subtract(img1, img2)

Eseguendo il programma si troverà un’immagine tendente all’oscurità…(anche se non si vede molto).

meccanismo-complesso-images-subtraction-2

Attenzione si potra vedere meglio scrivendo

img = cv.subtract(img2, img1)

e si otterrà un’immagine più chiaramente tendente al nero. Questo comunque è utile per sapere che l’ordine degli operatori è importante per il risultato.

meccanismo-complesso-images-subtraction

Più concretamente, abbiamo già visto che un oggetto img creato seguendo la libreria OpenCV non è altro che un array di matrici numeriche che rispondono perfettamente ai canoni di NumPy. Quindi sarà possibile utilizzare le operazioni tra matrici messe a disposizione da NumPy, come per esempio l’addizione tra matrici. Però attenzione, il risultato non sarà certamente lo stesso…

img = img1 + img2
meccanismo-complesso-images-numpy-addition

Le funzioni cv2.add() e cv2.subtract() infatti si occupano di mantenere i valori compresi tra 0 e 255, indipendentemente dal valore degli operatori. Se la somma superasse 255 il risultato sarebbe comunque 255. La stessa cosa se la sottrazione producesse valori negativi, il risultato sarebbe comunque 0. Invece utilizzando le operazioni aritmetiche di NumPy non hanno questa accortezza.

Image Blending

Nell’esempio precedente abbiamo visto che la somma o la sottrazione di due immagini non produce un’immagine intermedia tra le due, bensì il tendere della colorazione verso i bianchi o verso i neri.

L’operazione corretta, viene chiamata blending. Cioè si può considerare l’operazione di sovrapporre le due immagini una sopra l’altra, rendendo quella messa sopra via via sempre più trasparente. Regolando la trasparenza gradualmente otterremo via via una miscela delle due immagini, creandone una nuova che ne è l’intermedia.

L’operazione di blending non risponde alla sola addizione, ma la formula segue la seguente equazione.

img = α ⋅ img1 + (1 – α ) ⋅ img2                       con  0 ≥ α ≥ 1

Come potete ben vedere le due immagini hanno due coefficienti numerici che assumono valori compresi tra 0 e 1. Al crescere del valore α si avrà una transizione graduale dall’immagine 1 all’immagine 2.

La libreria OpenCV consente l’operazione di blending e mette a disposizione la funzione cv2.addWeighted() a tale proposito.

Mettiamo il caso di voler l’immagine intermedia tra le due precedenti scriveremo

img = cv.addWeighted(img1, 0.5, img2, 0.5, 0)

Il risultato sarà il seguente

meccanismo-complesso-image-blending

Conclusioni

In questo articolo abbiamo visto come addizionare due immagini in modo corretto attraverso l’image blending.

Altri articoli sulla libreria OpenCV vi mostreranno moltissime altre operazioni da applicare alle immagini, scoprendo gradualmente il meraviglioso mondo dell’analisi delle immagini.

2 commenti su “OpenCV & Python – Operazioni aritmetiche sulle immagini e Image Blending

Lascia un commento