Lasciatemi iniziare questo tutorial prendendo del gergo teorico. Quando parliamo miglioramento dell'immagine, questo in pratica significa che vogliamo una nuova versione dell'immagine che sia più adatta di quella originale.
Ad esempio, durante la scansione di un documento, l'immagine di output potrebbe avere una qualità inferiore rispetto all'immagine di input originale. Abbiamo quindi bisogno di un modo per migliorare la qualità delle immagini in uscita in modo che possano essere visivamente più espressive per lo spettatore, ed è qui che entra in gioco il miglioramento delle immagini. Quando miglioriamo un'immagine, ciò che stiamo facendo è rendere più nitide le funzioni dell'immagine come il suo contrasto e i suoi bordi.
È importante notare che il miglioramento dell'immagine non aumenta il contenuto di informazioni dell'immagine, ma piuttosto aumenta la gamma dinamica delle funzioni scelte, aumentando infine la qualità dell'immagine. Quindi qui in realtà non sappiamo come sarà l'immagine di output, ma dovremmo essere in grado di dire (soggettivamente) se ci sono stati miglioramenti o meno, come ad esempio osservare più dettagli nell'immagine di output, ad esempio.
Il miglioramento dell'immagine viene in genere utilizzato come fase di pre-elaborazione nei passaggi fondamentali coinvolti nell'elaborazione digitale delle immagini (ad esempio segmentazione, rappresentazione). Esistono molte tecniche per il miglioramento dell'immagine, ma illustrerò due tecniche in questo tutorial: immagine inversa e trasformazione della legge di potenza. Daremo un'occhiata a come possiamo implementarli in Python. Quindi iniziamo!
Come avrete intuito dal titolo di questa sezione (che può anche essere definita come negazione dell'immagine), l'immagine inversa mira a trasformare le intensità scure nell'immagine in ingresso in intensità luminose nell'immagine in uscita e intensità luminose nell'immagine in ingresso a intensità scure nell'immagine in uscita. In altre parole, le aree scure diventano più chiare e le aree chiare diventano più scure.
Dillo I (i, j)
si riferisce al valore di intensità del pixel situato a (I, j)
. Per chiarire un po 'qui, i valori di intensità dell'immagine in scala di grigi rientrano nell'intervallo [0255]
, e (I, j)
si riferisce rispettivamente ai valori di riga e colonna. Quando applichiamo l'operatore di inversione dell'immagine su un'immagine in scala di grigi, il pixel di output O (i, j)
il valore sarà:
O (i, j) = 255 - I (i, j)
Al giorno d'oggi, la maggior parte delle nostre immagini sono immagini a colori. Quelle immagini contengono tre canali, rosso, verde, e blu, denominato RGB
immagini. In questo caso, al contrario della formula sopra, dobbiamo sottrarre l'intensità di ogni canale da 255. Quindi l'immagine di output avrà i seguenti valori in pixel (I, j)
:
O_R (i, j) = 255 - R (i, j) O_G (i, j) = 255 - G (i, j) O-B) i, j) = 255 - B (i, j)
Dopo questa introduzione, vediamo come possiamo implementare l'operatore inverso dell'immagine in Python. Vorrei ricordare che, per motivi di semplicità, eseguirò l'operatore su un'immagine in scala di grigi. Ma ti darò alcuni pensieri sull'applicazione dell'operatore su un'immagine a colori, e lascerò il programma completo per te come esercizio.
La prima cosa che devi fare per un'immagine a colori è estrarre il valore di intensità di ogni canale di pixel (cioè RGB). A tale scopo, è possibile utilizzare Python Imaging Library (PIL). Vai avanti e scarica un'immagine campione di babbuino da baboon.png. La dimensione dell'immagine è 500x500
. Diciamo che vuoi estrarre i valori di intensità rosso, verde e blu che si trovano nella posizione dei pixel (325, 432)
. Questo può essere fatto come segue:
da PIL import Image im = Image.open ('baboon.png') stampa im.getpixel ((325,432))
Basato sulla documentazione, quale metodo getPixel ()
fa è:
Restituisce il valore del pixel in una determinata posizione.
Dopo aver eseguito lo script sopra, noterai che ottieni solo il seguente risultato: 138
! Ma dove sono i valori di intensità dei tre canali (RGB)? Il problema sembra essere con il modalità
dell'immagine che si sta leggendo. Controlla la modalità eseguendo la seguente dichiarazione:
stampa im.mode
Otterrai l'output P
, il che significa che l'immagine è stata letta in una modalità tavolozza. Una cosa che puoi fare è convertire l'immagine in modalità RGB prima di restituire i valori di intensità dei diversi canali. Per farlo, puoi usare il convertire()
metodo, come segue:
rgb_im = im.convert ('RGB')
In questo caso, si otterrà il seguente valore restituito: (180, 168, 178)
. Ciò significa che i valori di intensità per i canali rosso, verde e blu sono rispettivamente 180, 168 e 178.
Per mettere insieme tutto ciò che abbiamo descritto finora, lo script Python che restituisce i valori RGB di un'immagine ha il seguente aspetto:
da PIL import Image im = Image.open ('baboon.png') rgb_im = im.convert ('RGB') stampa rgb_im.getpixel ((325,432))
C'è un punto a sinistra prima di andare avanti all'operatore di inversione dell'immagine. L'esempio sopra mostra come recuperare il valore RGB di uno solo pixel, ma quando si esegue l'operatore inverso, è necessario eseguirlo tutti i pixel.
Per stampare tutti i valori di intensità per i diversi canali di ciascun pixel, puoi fare quanto segue:
da PIL import Image im = Image.open ('baboon.png') rgb_im = im.convert ('RGB') width, height = im.size per w in range (larghezza): per h in range (altezza): stampa rgb_im.getpixel ((w, h))
A questo punto, lascerò che sia un esercizio per voi per capire come applicare l'operatore di immagine inversa su tutti i canali di immagine a colori (cioè RGB) di ciascun pixel.
Diamo un'occhiata a un esempio che applica l'operatore di inversione dell'immagine su un'immagine in scala di grigi. Vai avanti e scarica boat.tiff, che servirà da nostra immagine di prova in questa sezione. Questo è quello che sembra:
Userò il SciPy
libreria per questo compito. Lo script Python per applicare l'operatore inverso dell'immagine sull'immagine sopra dovrebbe apparire come segue:
importare scipy.misc da scipy import misc da scipy.misc.pilutil import Image im = Image.open ('boat.tiff') im_array = scipy.misc.fromimage (im) im_inverse = 255 - im_array im_result = scipy.misc.toimage (im_inverse) misc.imsave ('result.tiff', im_result)
La prima cosa che abbiamo fatto dopo aver letto l'immagine è convertirla in un narray per applicarvi l'operatore inverso dell'immagine. Dopo aver applicato l'operatore, convertiamo semplicemente ndarray nuovamente in un'immagine e salviamo l'immagine come result.tiff
. La figura seguente mostra il risultato dell'applicazione dell'immagine inversa all'immagine sopra (l'immagine originale è sulla sinistra e il risultato dell'applicazione dell'operatore inverso dell'immagine è sulla destra):
Si noti che alcune caratteristiche dell'immagine sono diventate più chiare dopo l'applicazione dell'operatore. Guarda, ad esempio, le nuvole e il faro nell'immagine giusta.
Questo operatore, anche chiamato correzione gamma, è un altro operatore che possiamo usare per migliorare un'immagine. Vediamo l'equazione dell'operatore. Al pixel (I, j)
, l'operatore ha il seguente aspetto:
p (i, j) = kI (i, j) ^ gamma
I (i, j)
è il valore dell'intensità nella posizione dell'immagine (I, j)
; e K
e gamma
sono costanti positive. Non entrerò nei dettagli matematici qui, ma credo che si possano trovare spiegazioni approfondite di questo argomento nei libri di elaborazione delle immagini. Tuttavia, è importante notare che nella maggior parte dei casi, k = 1
, quindi cambieremo principalmente il valore della gamma. L'equazione di cui sopra può quindi essere ridotta a:
p (i, j) = I (i, j) ^ gamma
Userò il OpenCV
e NumPy
librerie qui. Puoi gentilmente controllare il mio tutorial Presentazione di NumPy se dovessi aver bisogno di saperne di più sulla libreria. La nostra immagine di prova sarà ancora boat.tiff (vai avanti e scaricala).
Lo script Python per eseguire l'operatore di trasformazione della Power Law ha il seguente aspetto:
import cv2 import numpy come np im = cv2.imread ('boat.tiff') im = im / 255.0 im_power_law_transformation = cv2.pow (im, 0.6) cv2.imshow ('Immagine originale', im) cv2.imshow ('Power Law Transformation ', im_power_law_transformation) cv2.waitKey (0)
Si noti che il valore gamma che abbiamo scelto è 0.6
. La figura seguente mostra l'immagine originale e il risultato dell'applicazione dell'operatore di trasformazione della legge di alimentazione su quell'immagine (l'immagine a sinistra mostra l'immagine originale e l'immagine a destra mostra il risultato dopo l'applicazione dell'operatore di trasformazione della legge di potenza).
Il risultato sopra è stato quando gamma = 0,6
. Vediamo cosa succede quando aumentiamo la gamma 1.5
, per esempio:
Si noti che mentre aumentiamo il valore di gamma, l'immagine diventa più scura e viceversa.
Ci si potrebbe chiedere che cosa potrebbe essere l'uso della trasformazione della legge di potenza. In effetti, i diversi dispositivi utilizzati per l'acquisizione, la stampa e la visualizzazione delle immagini rispondono in base all'operatore di trasformazione della legge di potenza. Ciò è dovuto al fatto che il cervello umano utilizza la correzione gamma per elaborare un'immagine. Ad esempio, la correzione gamma è considerata importante quando vogliamo che un'immagine sia visualizzata correttamente (il miglior contrasto dell'immagine viene visualizzato in tutte le immagini) sul monitor di un computer o sugli schermi televisivi.
In questo tutorial, hai imparato come migliorare le immagini usando Python. Avete visto come evidenziare le caratteristiche usando l'operatore di inversione dell'immagine e come la trasformazione della legge di potenza è considerata un operatore fondamentale per la visualizzazione corretta delle immagini su monitor di computer e schermi televisivi.
Inoltre, non esitare a vedere ciò che abbiamo a disposizione per la vendita e per studiare nel mercato Envato, e per favore fai tutte le domande e fornisci il tuo prezioso feedback usando il feed qui sotto.