scuola di calcolo scientifico con matlab (scsm) 2017 · l’elaborazione e il restauro delle...

37
Scuola di Calcolo Scientifico con MATLAB (SCSM) 2017 Palermo 31 Luglio 4 Agosto 2017 L.3.1. Elaborazione delle Immagini in MATLAB www.u4learn.it Francesco Gugliuzza

Upload: lenhan

Post on 15-Feb-2019

217 views

Category:

Documents


0 download

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

Caricare e visualizzare la prima immagine

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

Caricare e visualizzare la prima immagine

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);

Elaborazioni puntuali: negazione

L.3.1. Elaborazione delle Immagini in MATLAB

Negazione

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

Elaborazioni puntuali: negazione

L.3.1. Elaborazione delle Immagini in MATLAB

Correzione

gamma

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