scuola di calcolo scientifico con matlab (scsm) 2017 · l’elaborazione e il restauro delle...
TRANSCRIPT
Scuola di Calcolo Scientifico con MATLAB (SCSM) 2017Palermo 31 Luglio – 4 Agosto 2017
L.3.1. Elaborazione delle Immagini in MATLAB
www.u4learn.it Francesco Gugliuzza
Da molti anni ormai MATLAB incorpora un toolbox per
l’elaborazione e il restauro delle immagini digitali, corredato da una
serie di strumenti grafici utili per valutare la qualità delle stesse e
tracciare i grafici di alcune caratteristiche, come ad es.
l’istogramma
L‘Image Processing Toolbox
L.3.1. Elaborazione delle Immagini in MATLAB
Obiettivi di questa lezione
L.3.1. Elaborazione delle Immagini in MATLAB
Al termine di questa giornata, i partecipanti saranno in grado di:
1. caricare e salvare immagini in MATLAB
2. effettuare semplici elaborazioni dirette e statistiche sui valori dei
pixel
3. applicare filtri lineari e non lineari alle immagini
4. effettuare il restauro di un’immagine degradata
Alcune nozioni di base sulle immagini digitali
L.3.1. Elaborazione delle Immagini in MATLAB
Le immagini digitali possono essere sostanzialmente di due tipi:
• bitmap (dette anche "raster"), ovvero espresse come matrici di
valori di intensità o pixel – ATTENZIONE: da non confondere
con il formato bitmap BMP
• vettoriali, in cui gli elementi sono basati su primitive geometriche
istanziate con parametri diversi
Le immagini bitmap possono essere a singolo canale, come quelle
in scala di grigi, o multicanale come quelle a colori RGB. Esse
possono essere memorizzate mediante formati compressi o non
compressi utilizzando un certo numero di bit (solitamente 8 per
canale)
Ci occuperemo esclusivamente di immagini bitmap, che da qui in
poi chiameremo semplicemente "immagini"
Alcune nozioni di base sulle immagini digitali
L.3.1. Elaborazione delle Immagini in MATLAB
Le immagini possono essere elaborate per vari scopi, come:
• correggere imperfezioni manifestatesi durante l'acquisizione o la
trasmissione
• migliorarne la resa visiva
• introdurre effetti artistici
Le elaborazioni di cui ci occuperemo saranno quelle del primo e del
secondo tipo, e potranno essere eseguite sia indipendentemente
delle caratteristiche dell'immagine (ad es. filtri a finestra
scorrevole), sia utilizzando le informazioni a disposizione sulle
modalità di acquisizione e sull'origine della degradazione
Le elaborazioni applicate alle immagini sono spesso
computazionalmente molto impegnative e, proprio per questo
motivo, negli ultimi anni si è sviluppato un filone del GPU
computing dedicato specificamente all'image processing
In MATLAB le immagini vengono rappresentate come matrici:
• bidimensionali MxN se in bianco e nero o in scala di grigi
• tridimensionali MxNx3 se a colori
Le 3 sottomatrici delle immagini a colori contengono
rispettivamente i canali rosso, verde e blu
Tipi di dato:
• logico (0 o 1) per immagini in bianco e nero
• uint8 (range discreto 0-255) per immagini in scala di grigi o a
colori
• double (range continuo [0, 1]) in alternativa ad uint8
Rappresentazione delle immagini in MATLAB
L.3.1. Elaborazione delle Immagini in MATLAB
Le funzioni fondamentali dell'Image Processing Toolbox sono 3:
1. per caricare un’immagine di uno qualsiasi dei formati supportati (BMP, PNG, JPEG, TIFF e tanti altri) è sufficiente posizionarsi nella directory corretta e scrivere
L'immagine dal nome nomefile verrà caricata nella matrice im
Alcune immagini di esempio sono integrate in MATLAB e accessibili da qualsiasi directory:• peppers.png• cameraman.tif• pout.tif• moon.tif• mri.tif• …
2. per visualizzare un'immagine precedentemente caricata in memoria nella variabile im, eseguire semplicemente:
Caricamento di un‘immagine
>> im = imread('nomefile');
L.3.1. Elaborazione delle Immagini in MATLAB
>> imshow(im);
3. per salvare l'immagine contenuta nella variabile im, è sufficiente
eseguire il seguente comando:
imwrite accetta anche parametri aggiuntivi, come ad es. il
formato del file da generare (solitamente inferito dall'estensione)
ed il livello di qualità nel caso del formato JPEG
Nella documentazione di MATLAB è disponibile una descrizione
molto estesa di tutti i parametri accettati:
Caricamento di un‘immagine
>> imwrite(im, 'nomefile');
L.3.1. Elaborazione delle Immagini in MATLAB
>> doc imwrite
In questa lezione, per semplicità, lavoreremo esclusivamente su
immagini in scala di grigi. L’elaborazione di immagini a colori è
lasciata come esercizio per lo studente
Carichiamo l’immagine di esempio del cameraman:
Il risultato ottenuto è quello mostrato nella prossima slide
Caricare e visualizzare la prima immagine
>> im = imread('cameraman.tif');
>> imshow(im);
L.3.1. Elaborazione delle Immagini in MATLAB
MATLAB carica le immagini usando il tipo uint8 (range 0-255). È
sconsigliato lavorare in questa modalità in quanto è facile incorrere
in errori numerici e over/underflow
Trasformiamo l’immagine nel tipo double
Supponiamo di voler ora ritagliare solo la parte con il cameraman. Il comando da usare è imcrop
Si aprirà una finestra molto simile a quella della slide precedente, in
cui selezionare con il mouse la parte dell’immagine da ritagliare
Caricare e visualizzare la prima immagine
>> imd = im2double(im);
>> cameraman = imcrop(imd);
L.3.1. Elaborazione delle Immagini in MATLAB
Se invece volessimo ruotare l'immagine, possiamo utilizzare imrotate:
angle va espresso in gradi. L'interpolazione di default è nearest-
neighbor, ma può essere specificata manualmente aggiungendo un terzo
parametro
Infine, se volessimo cambiarne le dimensioni:
scale è il fattore di scala da utilizzare per il ridimensionamento (< 1
rimpicciolimento, > 1 ingrandimento). In alternativa, qualora si volesse
stabilire manualmente le nuove dimensioni:
m è il numero di righe e n il numero di colonne dell'immagine di output.
L'interpolazione di default è bicubica, ma anche qui può essere
specificata manualmente mediante un parametro aggiuntivo
Caricare e visualizzare la prima immagine
>> im_out = imrotate(im_in, angle);
>> im_out = imresize(im_in, scale);
L.3.1. Elaborazione delle Immagini in MATLAB
>> im_out = imresize(im_in, [m n]);
Alcune funzioni utili
* Operazione tra gli elementi corrispondenti delle due immagini (oppure tra gli elementi dell’immagine
ed una costante)
L.3.1. Elaborazione delle Immagini in MATLAB
Funzioni Descrizione
mat2gray(im) trasforma la matrice input in una matrice con valori
compresi in [0,1]
im2bw(im, level) trasforma l’immagine in immagine binaria
im2double(im) effettua il casting della matrice dell’immagine in una
double
imadd(im1, im2) effettua la somma*
imsubtract(im1, im2) effettua la sottrazione*
immultiply(im1, im2) effettua la moltiplicazione*
imdivide(im1, im2) effettua la divisione*
imabsdiff(im1, im2) effettua la differenza tra i valori assoluti*
imcomplement(im) effettua il complemento dell’immagine
Le elaborazioni effettuabili sui valori in scala di grigi sono
sostanzialmente di tre tipi:
• puntuali – dipendono solo dal pixel
• locali – coinvolgono l’intorno di un pixel, ad es. convoluzione e
filtraggio con maschere
• globali – dipendono da tutti i pixel dell’immagine e, spesso, sono
di natura statistica (es. modifica dell’istogramma)
Elaborazioni sui valori di grigio
L.3.1. Elaborazione delle Immagini in MATLAB
Cominciamo con l’analizzare le elaborazioni puntuali
Sia s il valore di output ed r quello di input
La negazione di un'immagine in scala di grigi o a colori genera il suo
esatto negativo; essa può essere utilizzata per ottenere un'immagine
positiva a partire dalla scansione di pellicole negative oppure per
evidenziare dettagli poco visibili nell'immagine di partenza
La formula matematica è:
s = MAXVAL - r
dove MAXVAL è il massimo valore che può assumere il tipo di dato
utilizzato (255 per uint8, 1 per float)
In MATLAB:
oppure:
Elaborazioni puntuali: negazione
>> im_out = MAXVAL – im_in;
L.3.1. Elaborazione delle Immagini in MATLAB
>> im_out = imcomplement(im_in);
La correzione di gamma viene utilizzata per compensare non
linearità nella resa della luminosità di una periferica di
visualizzazione o per migliorare la qualità visiva di immagini
sovraesposte o sottoesposte
È stata inizialmente sviluppata per correggere gli effetti della
relazione non lineare tra tensione e luminosità nei CRT
La formula matematica è:
s=c * rɣ
dove c e g sono delle costanti
in funzione dei valori di ɣ si assumono diversi
tipi di trasformazione (vedere grafico a fianco)
In MATLAB:
Elaborazioni puntuali: correzione di gamma
>> im_out = c * im_in .^ gamma;
L.3.1. Elaborazione delle Immagini in MATLAB
La sogliatura trasforma un'immagine in scala di grigi in
un'immagine binaria composta appunto da due soli livelli. Tutti i
valori al di sopra di una certa soglia vengono convertiti in 1, tutti
quelli al di sotto in 0
La formula matematica è:
In MATLAB:
oppure:
Elaborazioni puntuali: sogliatura
>> im_out = im_in >= thresh;
>> im_out = im2bw(im_in, thresh); La soglia può essere calcolata
automaticamente usando la
funzione graythresh
s = 0, x < thresh1, x ≥ thresh
L.3.1. Elaborazione delle Immagini in MATLAB
La trasformazione logaritmica viene utilizzata per agevolare la
visualizzazione di immagini aventi escursioni di intensità molto
ampie
La formula matematica è:
s=c * log(r + 1)
dove c è una costante
In MATLAB:
Elaborazioni puntuali: trasformazione logaritmica
>> im_out = c * log(im_in + 1);
L.3.1. Elaborazione delle Immagini in MATLAB
Lo stretching di contrasto comprime i livelli di grigio che stanno al di
fuori di un intorno di m in due gruppi di valori molto alti e molto
bassi. Il caso limite di tale funzione è la sogliatura
La formula matematica è:
dove m è la soglia ed E la pendenza
In MATLAB:
Elaborazioni puntuali
>> im_out = 1 ./ (1 + (m ./ im_in) .^ E);
Può essere realizzata anche
in modo lineare a tratti
(piecewise linear) con stretchlim(im_in, tol)
s =1
1 +mr
E
L.3.1. Elaborazione delle Immagini in MATLAB
Le elaborazioni locali si basano su finestre (solitamente quadrate) che scorrono sull’intera immagine e lavorano di volta in volta su un intorno del pixel centrale:1. la finestra viene fatta avanzare pixel per pixel sull'immagine e una
funzione matematica viene applicata ai pixel coperti da essa2. il valore risultante viene posizionato nella nuova immagine alle stesse
coordinate del pixel coperto dal centro della finestra
Esse si suddividono nei seguenti tipi:• lineari – convoluzione con una maschera lineare della stessa
dimensione della finestra• non lineari• smoothing – passa-basso• sharpening – passa-alto
Elaborazioni locali
L.3.1. Elaborazione delle Immagini in MATLAB
In MATLAB l’esecuzione di un filtraggio lineare su un’immagine è
molto semplice:
1. si genera la maschera filtrante, scegliendone il tipo da tra quelli mostrati sotto, con la funzione fspecial
2. si applica la maschera all'immagine con la funzione imfilter
Elaborazioni locali: filtri lineari
Filtro Descrizione
average Filtro di media
disk Filtro circolare di media (pillbox)
gaussianFiltro passa-basso gaussiano
laplacian Approssima l’operatore laplaciano bidimensionale
log Filtro laplaciano del gaussiano
motion Approssima il moto lineare di una fotocamera
prewitt Filtro edge-emphasizing orizzontale di Prewitt
sobel Filtro edge-emphasizing orizzontale di Sobel
L.3.1. Elaborazione delle Immagini in MATLAB
Sintassi di esempio:
Elaborazioni locali: filtri lineari
>> h = fspecial('nome_filtro', parametri);
>> im_out = imfilter(im_in, h);
Filtro
motion
L.3.1. Elaborazione delle Immagini in MATLAB
L’immagine lena_noise.tif è stata corrotta con rumore gaussiano.
Tentare di attenuare il rumore usando uno dei filtri di media messi a disposizione da fspecial
Ignorare (entro ragionevoli limiti) l’effetto di sfocatura generato da
tali filtri
Problema 1: filtraggio di un‘immagine corrotta da rumore
L.3.1. Elaborazione delle Immagini in MATLAB
I filtri non lineari non sono esprimibili mediante una legge lineare, bensì vengono solitamente formulati indicando la funzione non lineare che agisce sui pixel coperti ad ogni passo dalla finestra scorrevole
Uno dei più noti filtri non lineari è sicuramente quello mediano che, ad ogni passo, seleziona il mediano tra i valori presenti nella finestra. Tale filtro è molto indicato per l’attenuazione del rumore "sale e pepe" (pixel bianchi e neri distribuiti casualmente nell’immagine)
I filtri non lineari vengono implementati in MATLAB mediante la funzione nlfilter:
m e n rappresentano le dimensioni della finestra, mentre fun è la funzione anonima che specifica l’azione da eseguire sulla stessa
Elaborazioni locali: filtri non lineari
>> im_out = nlfilter(im_in, [m n], fun);
L.3.1. Elaborazione delle Immagini in MATLAB
Ad esempio, per implementare un filtro mediano 3x3:
Elaborazioni locali: filtri non lineari
>> fun = @(x) median(x(:));
>> im_out = nlfilter(im_in, [3 3], fun);
L.3.1. Elaborazione delle Immagini in MATLAB
Filtro mediano
3x3
L’istogramma di un’immagine rappresenta la distribuzione dei
possibili valori di grigio all’interno dell’immagine
In MATLAB esso viene mostrato con il comando:
Elaborazioni globali: equalizzazione dell'istogramma
>> imhist(im);
L.3.1. Elaborazione delle Immagini in MATLAB
Una delle elaborazioni più semplici per migliorare la qualità
dell’immagine è l’equalizzazione dell’istogramma: in sostanza si
cerca di renderlo il più piatto possibile
In MATLAB l’equalizzazione dell’istogramma è effettuata tramite il comando histeq
Elaborazioni globali: equalizzazione dell'istogramma
histeq
Un’elaborazione
più complessa e
che solitamente
restituisce
risultati migliori
è implementata
nel comando imadjust
L.3.1. Elaborazione delle Immagini in MATLAB
Un’immagine è stata acquisita da una sorgente corretta in gamma,
ma essa è risultata esposta in modo non corretto. Equalizzare
l’immagine e correggerla per la visualizzazione su un monitor CRT
con γ = 2.2. L’esponente di correzione sarà γ′ =1
γ
Trovate l’immagine Unequalized_Hawkes_Bay_NZ.jpg nella
directory di lavoro dei vostri computer
ATTENZIONE: l’immagine viene caricata come RGB, ma in realtà è
in scala di grigi. Trasformarla in matrice bidimensionale usando la funzione rgb2gray
Problema 2: correzione dell'intensità di un‘immagine
L.3.1. Elaborazione delle Immagini in MATLAB
L’obiettivo del restauro di un'immagine è (a differenza del semplice
miglioramento) quello di incrementare la qualità della stessa in
modo “oggettivo”, conoscendo a priori la causa della degradazione.
Si cerca cioè di invertire il processo di degradazione in modo da
attenuarne, per quanto possibile, gli effetti causati sull'immagine
Intendendo nel modo seguente il modello del processo di
degradazione dell’immagine f(x,y):
g x, y = H f x, y + η(x, y)essa è sottoposta all’azione della funzione di degradazione H e
all’azione di rumore additivo η(x,y)
Restauro delle immagini
L.3.1. Elaborazione delle Immagini in MATLAB
Supponiamo, per semplicità, che il rumore sia indipendente e
scorrelato rispetto all’immagine stessa
In questo modo possiamo cercare di modellarlo facendo riferimento
alla PDF (funzione di distribuzione di probabilità) del livello di grigio
del rumore stesso
Restauro delle immagini
Rumore
Gaussiano
Rumore
Rayleigh
Rumore
Erlang
(gamma)
Rumore
esponenziale
Rumore
impulsivo
bipolare
L.3.1. Elaborazione delle Immagini in MATLAB
Poiché il rumore è scorrelato, possiamo ritagliare una piccola area di intensità quasi uniforme con imcrop e inferirne tipo e varianza
con imhist e var
Eseguendo questi passaggi sull’immagine di Lena del Problema 2, i
risultati sono i seguenti:
Restauro delle immagini
>> var(patch(:))
ans =
0.0103
L.3.1. Elaborazione delle Immagini in MATLAB
Una volta inferito il tipo di degradazione (e quindi la maschera
spaziale di fspecial che più lo approssima) e la varianza del
rumore, è possibile stimare l’NSR (noise to signal power ratio), il cui
calcolo esula dagli obiettivi di questa lezione
Ottenuti tutti i dati necessari, la stima f(x, y) dell’immagine originale
può essere calcolata utilizzando la deconvoluzione di Wiener, implementata nella funzione deconvwnr:
Restauro delle immagini
>> im_out = deconvwnr(im_in, h, nsr)
deconvwnr
filtro motion
L.3.1. Elaborazione delle Immagini in MATLAB
La differenza di qualità di un’immagine rispetto alla sua copia di
riferimento non alterata da rumore e degradazione può essere
espressa matematicamente da alcune funzioni, tra le quali MSE
(mean squared error) e PSNR (peak signal to noise ratio)
In MATLAB queste ed altre metriche sono implementate nella funzione measerr:
ATTENZIONE: measerr va usato con variabili di tipo uint8!
Restauro delle immagini: metriche oggettive di qualità
>> [PSNR, MSE, MAXERR, L2RAT] = measerr(im_rif, im_app);
L.3.1. Elaborazione delle Immagini in MATLAB
Utilizzando le metriche mostrate nella slide precedente, calcolare la
perdita di qualità tra l’immagine rumorosa lena_noise.tif e quella di
riferimento lena_std.tif
ATTENZIONE: l’immagine viene caricata come RGB, ma in realtà è
in scala di grigi. Trasformarla in matrice bidimensionale usando la funzione rgb2gray
Problema 3: stimare la perdita di qualità dovuta al rumore
L.3.1. Elaborazione delle Immagini in MATLAB