Sei sulla pagina 1di 22

Laboratorio di Elaborazione e Trasmissione delle Immagini

(F. De Natale – N. Conci – N. Piotto – M.Daldoss)

Utilizzo di MatLab per l’Elaborazione di Immagini

Multimedia Signal Processing and Understanding Lab.


DISI - Dipartimento di Ingegneria e Scienze Informatiche

Universita’ degli Studi di Trento

Prof. F. G. B. De Natale

Autori:
Cristina Costa, Nicola Conci, Nicola Piotto

Revisioni:
02-05-2006 Nicola Conci (conci@dit.unitn.it)
07-05-2007 Nicola Conci (conci@dit.unitn.it)
01-04-2008 Nicola Piotto (piotto@disi.unitn.it)
15-03-2010 Mattia Daldoss(daldoss@disi.unitn.it)

DISI – Universita’ degli Studi di Trento 1


Laboratorio di Elaborazione e Trasmissione delle Immagini
(F. De Natale – N. Conci – N. Piotto – M.Daldoss)

Sommario

1. Introduzione .................................................................................................................. 3
Ambiente di lavoro ......................................................................................................... 3
Nota:................................................................................................................................. 4
2. Le variabili in Matllab: ................................................................................................... 4
Creazione di variabili: scalari ........................................................................................ 5
Creazione di variabili: vettori ........................................................................................ 5
Creazione di variabili: matrici ....................................................................................... 6
3. Ancora sulla matrici ...................................................................................................... 7
Generazione di matrici ................................................................................................... 8
4 Proprietà delle matrici ................................................................................................... 9
5 Operazioni e funzioni elementari ................................................................................ 11
6 Operazioni di controllo ................................................................................................ 16
If then else .................................................................................................................... 16
for .................................................................................................................................. 16
while .............................................................................................................................. 17
switch ............................................................................................................................ 17
7 m file ........................................................................................................................... 17
Script ............................................................................................................................. 18
Funzioni ........................................................................................................................ 18
8 Image processing toolbox ........................................................................................... 19
Lettura di un’immagine ................................................................................................ 19
Visualizzazione di un’immagine .................................................................................. 19
Salvataggio di un’immagine ........................................................................................ 20
Generazione di un’immagine ...................................................................................... 20
9 Esercitazione riepilogativa .......................................................................................... 21

2 DISI – Universita’ degli Studi di Trento


Laboratorio di Elaborazione e Trasmissione delle Immagini
(F. De Natale – N. Conci – N. Piotto – M.Daldoss)

1. Introduzione

Il nome MATLAB deriva da MATrix LABoratory, ed è stato sviluppato per essere utilizzato
nell’ambito della teoria delle matrici e dell’algebra lineare.
Matlab è un linguaggio di programmazione potente, così come un ambiente
computazionale interattivo. Comandi e programmi vengono interpretati e non compilati.
Ambiente di lavoro
Lanciando il programma si ottiene la seguente schermata:

Variabili in
memoria

Browser Finestra
directory di dei comandi
lavoro (File .m)

L’ambiente di lavoro è suddiviso in diverse finestre:


- Command Window: finestra di comandi
- Workspace: visualizza le variabili in memoria (dimensioni, tipo ecc.)
- Current Directory: visualizza la directory di lavoro corrente ed i file in essa contenuti
- Command History: visualizza i comandi eseguiti.

DISI – Universita’ degli Studi di Trento 3


Laboratorio di Elaborazione e Trasmissione delle Immagini
(F. De Natale – N. Conci – N. Piotto – M.Daldoss)
Help
Per ottenere aiuto sulle funzioni si può utilizzare, oltre che all’help in linea (completo e
utile), il comando help:
>> help function_name
Esempio: se voglio conoscere l’utilizzo della funzione ones digitero’ dal prompt dei
comandi
>> help ones
In questo modo verranno visualizzate le possibili chiamate alla funzione. In fondo, invece
viene riportato un link che rimanda alla documentazione completa sull’help:
Reference page in Help browser
doc ones

Nota:
Per cancellare la schermata nella Command Window usare il comando:
>> clc

2. Le variabili in Matllab:
In Matlab, tutte le variabili sono espresse come matrici:
• matrici 1 x 1 cioè SCALARI
• matrici 1 x n cioè VETTORI RIGA
• matrici n x 1 cioè VETTORI COLONNA
• matrici n x m nel senso classico della parola

NB: In MatLab gli indici delle matrici e dei vettori partono da 1, non da 0 come in C/C++.

A differenza dei comuni linguaggi di programmazione, Matlab non richiede all’utente di


dichiarare esplicitamente il tipo di variabile (intero, reale, complesso, stringa) e la
dimensione delle variabili utilizzate.
Ciò comporta una sostanziale semplificazione nella stesura dei programmi, ma richiede
una certa cautela in fase di programmazione.
I Nomi delle variabili possono essere costituiti da lettere e cifre (e non dai caratteri
speciali), con il vincolo che il primo carattere deve essere una lettera e che la lunghezza
del nome della variabile non superi i 19 caratteri. Matlab è case sensitive.
Dopo esser state create, le variabili vengono mantenute in memoria e possono essere
controllate dal Workspace. I comandi who e whos elencano tutte le variabili definite
durante la sessione di lavoro (whos fornisce anche un'indicazione sulla quantità di
memoria allocata).
Attenzione! Matlab memorizza tutte le variabili definite nel corso della sessione di lavoro
e si rischia di saturare la memoria disponibile. In tal caso può comparire un messaggio

4 DISI – Universita’ degli Studi di Trento


Laboratorio di Elaborazione e Trasmissione delle Immagini
(F. De Natale – N. Conci – N. Piotto – M.Daldoss)
d’errore del tipo out of memory, accompagnato talvolta da una brusca interruzione del
programma (con conseguente perdita del lavoro svolto).
Nota:
Per liberare l’occupazione di memoria si puo’ utilizzare il comando clear
>> clear : svuota Workspace.
>> clear a b : si calcellano le variabili a e b.

In Matlab esistono alcune variabili predefinite:


eps zero macchina
Pi π
i,j −1
NaN "Not-a-Number"

Creazione di variabili: scalari


Una variabile scalare si definisce nel seguente modo:
>>a =1
Aggiungendo il carattere ‘;’ in fondo alla riga di comando permette di omettere messaggio
di ritorno (utile quando si lavora con matrici di grandi dimensioni).
>>a = 1.5;
La virgola decimale deve essere introdotta come punto; inoltre nelle cifre del tipo 0.7 non è
necessario riportare lo zero iniziale, ma e’ sufficiente digitare
>>a =.7;
Per visualizzare il valore della variabile basta digitare il suo nome e premere invio:
>>a
E’ previsto il completamento automatico delle variabili con il tasto TAB.

NOTA: Notazione esponenziale


Matlab utilizza la notazione esponenziale nella forma 2e3 (= 2·103 = 2.000). Per esempio:
1.41e8 corrisponde a 1,41·108
4.56e-5 corrisponde a 4,56·10-5

Creazione di variabili: vettori


Gli elementi del vettore devono essere racchiusi tra parentesi quadre, utilizzando uno
spazio bianco o una virgola come separatore delle colonne e un ‘;’ come separatore di
riga. Ecco alcuni esempi:
- Vettore riga (equivalenti):

DISI – Universita’ degli Studi di Trento 5


Laboratorio di Elaborazione e Trasmissione delle Immagini
(F. De Natale – N. Conci – N. Piotto – M.Daldoss)
>> a = [1 2 3 4 5 6 7];
>> b = [1, 2, 3, 4, 5, 6, 7];

- Vettore colonna:
>> c = [1; 2; 3; 4; 5; 6; 7];

Per quanto riguarda l’introduzione di vettori di grandi dimensioni, può essere utile
osservare che per continuare un’istruzione su una linea successiva dello schermo si
usano tre punti:
>> d=[2 3 8 9 ...
7 8 2 1];
equivalente a:
>> d=[2 3 8 9 7 8 2 1];

Nota: il vettore trasposto si ottiene con:


>> f = c';

Utilizzo dell’operatore ‘:’ per definire vettori


Questo tipo di istruzione consente di creare un vettore i cui valori sono una sequenza di
numeri, compresi tra due limiti. La sintassi è la seguente:
<limite inferiore> : <incremento> : <limite superiore>
Provare :
>> a = 1:10
>> b = -5:5
>> c = 1:2:10
>> d = 10:-1:1

Creazione di variabili: matrici


Esempio:
>> B=[1 2 4; 2 3 1]
definisce la matrice:
1 2 4
B= 
2 3 1 
Si possono anche utilizzare espressioni con l’operatore ‘:’, come ad esempio
>> B=[1:4;5:8]
Equivalente a:
>> B=[1 2 3 4;5 6 7 8]

6 DISI – Universita’ degli Studi di Trento


Laboratorio di Elaborazione e Trasmissione delle Immagini
(F. De Natale – N. Conci – N. Piotto – M.Daldoss)

3. Ancora sulla matrici


Le matrici sono la base per la gestione di immagini. Nelle pagine seguenti saranno
illustrati alcuni esempi per la creazione e la manipolazione di matrici bi/tri-dimensionali
Notazione
Si definisce matrice A di dimensioni nxm una tabella di numeri disposti su n righe e m
colonne:

 a11 a12 L a1m 


a a 22 L a 2 m 
A =  21
L L L L
 
 a n1 an 2 L a nm 

Se n=1, la matrice A corrisponde ad un vettore riga. Se m=1, la matrice A corrisponde ad


un vettore colonna. Se m=n=1, A corrisponde ad uno scalare.
La notazione A(i,j) denota l’elemento della matrice posizionato nella riga i e nella
colonna j di A:

E’ possibile avere anche strutture dati a 3 dimensioni o più.


♦ Estrazione di una colonna di una matrice:
>> A=[1 2 4; 2 3 1; 2 5 6; 8 5 3]
>> c3=A(:,3)
c3 =
4
1
6
3

♦ Estrazione di una riga di una matrice:


>> r3=A(3,:)
r3 =
2 5 6

DISI – Universita’ degli Studi di Trento 7


Laboratorio di Elaborazione e Trasmissione delle Immagini
(F. De Natale – N. Conci – N. Piotto – M.Daldoss)

♦ Estrazione dell’ultima riga e dell’ultima colonna:


>> r=A(end,:)
>> c=A(:,end)

♦ Estrazione di una sottomatrice:


>> S=A(2:end,1:2)
S =

2 3
2 5
8 5

♦ Estrazione della prima e terza riga di una matrice:


>> r13=A([1 3],:)
r13 =

1 2 4
2 5 6

Generazione di matrici
Matlab fornisce quattro funzioni per generare le matrici base:
♦ zeros(N,M), genera una matrice NxM con tutti i coeff a 0
♦ ones(N,M), genera una matrice NxM con tutti i coeff a 1
♦ rand(N,M), genera una matrice NxM i cui valori sono numeri casuali distribuiti
uniformenente nell’intervallo [0.0,1.0]
♦ randn(N,M), genera una matrice NxM i cui valori sono numeri casuali con
distribuzione normale (gaussiana) con media 0 e varianza 1.
♦ per altre distribuzioni utilizzare la funzione random.

Esempi:
>> A = ones(2,3)
>> B = rand(3,3)

Concatenazione di matrici
E’ possibile concatenare matrici e/o vettori. Infatti, il comando
>> A=[1 2 3; 4 5 6; 7 8 9]

8 DISI – Universita’ degli Studi di Trento


Laboratorio di Elaborazione e Trasmissione delle Immagini
(F. De Natale – N. Conci – N. Piotto – M.Daldoss)
è analogo a concatenare tre vettori riga nel modo seguente;
>> a1=[1 2 3]
>> a2=[4 5 6]
>> a3=[7 8 9]
>> A=[a1; a2; a3]

Nota: concatenazione di sottomatrici


>> B=[1 2; 3 4]
>> C=[B B; B+4 B-1]
 B B 
C= 
 B + 4 B − 1

Cancellazione di righe e colonne


E’ possibile cancellare righe/colonne utilizzando l’operatore di concatenazione ‘[ ]’. Per
esempio, per cancellare la seconda colonna:
>> C(:,2)=[]
Provare:
>> C=[B B; B+4 B-1]
>> C(1:3:4,:)=[]
>> C(:,1:3:4)=[]

4 Proprietà delle matrici


Supponiamo di avere una matrice B di dimensioni NxM, con N=3 e M=4, e un vettore v
1xm, con m=5:
5 1 2 14
B = 3 9 4 19, v = [4 8 1 0 9]
7 6 8 10

>> B=[5 1 2 14; 3 9 4 19; 7 6 8 10];


>> v=[4 8 1 0 9]

Funzioni max e min:


max(v) ritorna l’elemento del vettore con il valore più alto, e min(v) quello con il valore
più basso:
>> max(v)
ans =
9
>> min(v)
ans =

DISI – Universita’ degli Studi di Trento 9


Laboratorio di Elaborazione e Trasmissione delle Immagini
(F. De Natale – N. Conci – N. Piotto – M.Daldoss)
0

Se B è una matrice NxM, max(B) restituisce un vettore riga 1xM che riporta i valori
massimi di ogni colonna di B, e min(B) restituisce un vettore riga 1xM che riporta i valori
più bassi.
>> max(B)
ans =
7 9 8 19
>> max(max(B))
ans =
19
>> min(B)
ans =
3 1 2 10
>> min(min(B))
ans =
1

Nota:
>> [v r]= min(B)
v =
3 1 2 10
r =
2 1 1 3
Con questa notazione la funzione min ritorna nel vettore v i valori minimi delle colonne, e
nel vettore r gli indici di riga corrispondenti ai valori trovati. Lo stesso vale per la funzione
max.

Funzioni size e length:


size(B) restituisce un vettore riga i cui componenti sono le dimensioni della matrice [N
M].
>> size(B)
ans =
3 4
>> size(v)
ans =
1 5

Se A è un vettore colonna o riga, length(v) ritorna il numero di elementi del vettore (è


analogo a scrivere max(size(v)) oppure size(v,1) o size(v,2) a seconda si
tratti di un vettore riga o colonna):
>> length(v)
ans =
5
>> max(size(v))
ans =
5
10 DISI – Universita’ degli Studi di Trento
Laboratorio di Elaborazione e Trasmissione delle Immagini
(F. De Natale – N. Conci – N. Piotto – M.Daldoss)
>> size(v,1)
ans =
1
>> size(v,2)
ans =
5

Matrice trasposta
La matrice trasposta si ottiene con l’operatore ‘'’, per esempio:
>> C=B'
C =
5 3 7
1 9 6
2 4 8
14 19 10

5 Operazioni e funzioni elementari

♦ Operatori: somma (+), sottrazione (-), divisione (/), moltiplicazione (*), potenza (^),
ecc… (per una lista completa degli operatori in Matlab digitare: help +)
♦ Funzioni: seno (sin), esponenziale (exp), radice quadra (sqrt), ecc.

Nota: le operazioni +, -, /, *, ^, non possono essere usate con variabili di tipo intero (uint,
uint16, ecc.) nelle versioni piu’ vecchie di Matlab.

Datatypes
I datatypes più comuni sono:
Intero ad 8 bit: uint8 (1byte)
Intero ad 16 bit: uint16 (2byte)
Doppia precisione: double (8byte)
Carattere: char (1byte)
Per convertire da un tipo all’altro utilizzare le funzioni:
uint8()
uint16()
double()

Per una descrizione dettagliata:


>> help datatypes
>> help uint8
>> help double

DISI – Universita’ degli Studi di Trento 11


Laboratorio di Elaborazione e Trasmissione delle Immagini
(F. De Natale – N. Conci – N. Piotto – M.Daldoss)
Somma e sottrazione
Se due matrici hanno le stesse dimensioni, che nel caso di vettori significa avere lo stesso
numero di elementi, e’ possibile effettuare la somma o la differenza mediante gli operatori
+ e -. Mediante gli stessi operatori è possibile sommare uno scalare a ad una matrice o ad
un vettore, ottenendo come risultato una matrice o un vettore in cui ciascun elemento è
pari al corrispondente elemento della matrice o vettore più la quantità a. Per esempio si ha
>> a=3;
>> v=[1 2];
>> v2=a+v
v2 =
4 5

L’operatore ‘ * ’ ha il significato di moltiplicazione tra matrici.


Da quanto detto sull’argomento, è chiaro che due vettori di uguali dimensioni non possono
essere moltiplicati tra di loro, e che tra due matrici A e B, è definita l’operazione di prodotto
A·B solo se il numero di colonne di A è uguale al numero di righe di B (per esempio A è 3
× 2 e B è 2 × 4). Si tenga presente il messaggio di errore che Matlab restituisce se si tenta
di moltiplicare tra loro due matrici le cui dimensioni non lo consentono:
Inner matrix dimensions must agree.
Da quanto detto sul prodotto tra matrici, deriva che una matrice può essere moltiplicata
per se stessa una o più volte solo se essa è quadrata. Si tenga presente il messaggio di
errore che MATLAB restituisce se si tenta di elevare a potenza una matrice non quadrata:
Matrix must be square.
E quindi se ho:
>> A=[1 2 3; 4 5 6]
>> B=[2 2; 4 2; 1 1]
>> A*B
ans =
13 9
34 24
Nel caso di vettori:
>> v1=[1 2 3];
>> v2=[1 3 4];
>> v1*v2'
ans =
19

E’ possibile, mediante l’operatore .*, eseguire una moltiplicazione puntuale tra elementi
corrispondenti di due vettori o matrici di uguali dimensioni:

12 DISI – Universita’ degli Studi di Trento


Laboratorio di Elaborazione e Trasmissione delle Immagini
(F. De Natale – N. Conci – N. Piotto – M.Daldoss)

 a11 a12 L a1m   b11 b12 L b1m 


a a22 
L a2 m  b b L b2 m 
A =  21 , B =  21 22
L L L L L L L L
   
 an1 an 2 L anm  bn1 bn 2 L bnm 

il risultato della moltiplicazione puntuale C=A.*B è:

 a11 ⋅ b11 a12 ⋅ b12 L a1m ⋅ b1m 


a ⋅ b a22 ⋅ b22 L a2 m ⋅ b2 m 
C =  21 21
 L L L L 
 
 an1 ⋅ bn1 an 2 ⋅ bn 2 L anm ⋅ bnm 

Nota: l’utilizzo di operazioni puntuali è utile per evitare l’utilizzo di loop. Per esempio:
>> v1=[1 2 3];
>> v2=[1 3 4];
>> v1.*v2
ans =
1 6 12

Quando invece si moltiplica un vettore v per uno scalare a, la distinzione tra gli operatori
* e .* decade: in entrambi i casi ciascun elemento del vettore risultante è pari al
corrispondente elemento del vettore v moltiplicato per a:
>> v=[1 2 3];
>> a=2;
a*v = a.*v

Divisione
L’operatore / ha il significato di divisione tra matrici. Due vettori v1 e v2 di uguale
dimensione possono essere divisi tra loro, ma il risultato è uno scalare e non un vettore in
cui ciascun elemento è pari alla divisione tra i corrispondenti elementi di v1 e v2. Tra due
matrici A e B è definita l’operazione di divisione A/B solo se A e B hanno lo stesso
numero di colonne. Si tenga presente il messaggio di errore che MATLAB restituisce se si
tenta di eseguire la divisione tra matrici le cui dimensioni non lo consentono:
Matrix dimensions must agree.
Quando A è invertibile, l’espressioni B/A corrisponde formalmente alla moltiplicazione a
destra di B per l'inversa di A, cioé B*inv(A), evitando però il calcolo esplicito dell'inversa.
In generale X = A/B è una soluzione del sistema X*A=B.

DISI – Universita’ degli Studi di Trento 13


Laboratorio di Elaborazione e Trasmissione delle Immagini
(F. De Natale – N. Conci – N. Piotto – M.Daldoss)
Per maggiori dettagli:
>> help slash

Analogamente alla moltiplicazione, è possibile, mediante l’operatore ./, eseguire una


divisione puntuale tra elementi corrispondenti di due vettori o matrici di uguali dimensioni:
>> v1=[1 2 3];
>> v2=[1 3 4];
>> v1./v2
ans =
1.0000 0.6667 0.7500
Dati un vettore v e uno scalare a, nella divisione di v per a non c’è differenza tra l’uso
degli operatori / e ./, come accadeva nella moltiplicazione:
>> v=[1 2 3];
>> a=2;
v/a = v./a

Diversamente, dividendo a per v si ottengono diversi risultati utilizzando gli operatori / e


./; nel primo caso MATLAB restituisce un messaggio di errore, in quanto interpreta
l’operazione come divisione tra matrici, nel secondo caso il risultato è un vettore in cui
ciascun elemento è pari ad a diviso il corrispondente elemento di v:
>> v=[1 2 3];
>> a=2;
>> a/v
??? Error using ==> /
Matrix dimensions must agree.
>> a./v
ans =
2.0000 1.0000 0.6667

Elevazione a potenza
L’operatore ^ seguito da un numero ha la funzione di elevazione a potenza. Per esempio
digitando A^2 si ottiene il quadrato della matrice A, nel senso che la matrice viene
moltiplicata per sé stessa con l’operazione di prodotto tra matrici.
Per maggiori informazioni: help mpower
Un vettore v non può essere elevato a potenza.
E’ possibile però, mediante l’operatore .^, ottenere un vettore in cui ciascun elemento sia
pari al corrispondente elemento di v elevato alla potenza indicata:
>> v=[1 2 3];

14 DISI – Universita’ degli Studi di Trento


Laboratorio di Elaborazione e Trasmissione delle Immagini
(F. De Natale – N. Conci – N. Piotto – M.Daldoss)
>> v.^3
ans =
1 8 27

Funzioni elementari
Quella che segue è una lista delle più comuni funzioni elementari utilizzabili in Matlab. Si
intende che ciascuno degli operatori elencati, se applicato ad una matrice, un vettore o
uno scalare, applica la funzione considerata a ciascuno degli elementi dell’operando.
L’operando deve sempre essere racchiuso tra parentesi tonde, come per esempio:
>> sqrt(3)
Utilizza il comando help per avere una descrizione completa delle funzioni:
>> help sqrt

Ecco un breve elenco:


sqrt radice quadrata
sin seno
asin arcoseno
cos coseno
acos arcocoseno
tan tangente
atan arcotangente
Si applica nella forma atan2(x,y) a due operandi reali o complessi x
atan2 e y, e restituisce l’arcotangente su quattro quadranti della parte reale
degli elementi di x e y
exp esponenziale
log logaritmo naturale (base e)
log10 logaritmo decimale (base 10)
log2 logaritmo in base 2
abs valore assoluto
angle angolo di fase (argomento)
imag coefficiente dell’immaginario
real parte reale

DISI – Universita’ degli Studi di Trento 15


Laboratorio di Elaborazione e Trasmissione delle Immagini
(F. De Natale – N. Conci – N. Piotto – M.Daldoss)
6 Operazioni di controllo
In Matlab si possono utilizzare cicli ed espressioni di controllo come in C:
♦ if … then … else
♦ for
♦ while
♦ switch
E’ possibile utilizzare le seguenti operazioni logiche:
♦ Uguale a: ==
♦ Diverso da: ~=
♦ Minore, maggiore, minore uguale, maggiore uguale: <, >, <=, >=

Per maggiori informazioni sugli operatori relazionali e logici in Matlab: help relop

If then else
k=1; l=3;
if k==l
A(k,l)= 2;
elseif abs(k-l) == 1
A(k,l) = -1;
else
A(k,l) = 0;
end

for
N=5;
for k = 1:N
for l = 1:N
A(k,l) = 1/(k+l-1);
end
end

altre espressioni possibili;


♦ ciclo for decrescente
>> for i = 1.0: -0.1: 0.0

♦ vettore
16 DISI – Universita’ degli Studi di Trento
Laboratorio di Elaborazione e Trasmissione delle Immagini
(F. De Natale – N. Conci – N. Piotto – M.Daldoss)
>> a = [1 3 6 8]
>> for i = a

while
a=2;
while a < 100,
a = a^2;
end

Nota: Il comando break può essere utilizzato per terminare prematuramente il ciclo.

switch
Esempio:
colore = 'Rosso';
switch lower(colore)
case {'rosso','rosa'}
disp('Toni rossi')
case {'blu', 'azzurro'}
disp('Toni freddi')
otherwise
disp('Colore sconosciuto.')
end

ans= Toni rossi

7 m file
I file che contengono codice Matlab sono chiamati m-file. Essi hanno estensione .m e
possono essere usati come un comando o una funzione Matlab. Sono normali file di testo
e possono essere creati usando un qualsiasi editor di testo, o l’editor interno di Matlab (dal
menù di Matlab: FileNewM-file).
Ci sono due generi di M-file:
1- Script che non accettano argomenti d'entrata o argomenti di uscita e operano su
dati nel workspace.
2- Funzioni che possono accettare argomenti d'entrata e argomenti di uscita. Le
variabili interne sono locali.

DISI – Universita’ degli Studi di Trento 17


Laboratorio di Elaborazione e Trasmissione delle Immagini
(F. De Natale – N. Conci – N. Piotto – M.Daldoss)
Sia negli script che nei file contenenti funzioni, è possibile inserire delle righe commentate
utilizzando il carattere ‘%’ all’inizio della riga:
% %%%%%
% Questo è un commento
% %%%%%%

Script
Gli script possono contenere qualunque comando, così come digitati nella finestra
Command Window.
♦ Per creare un m-file, scegliere New dal menu File e selezionare M-file; questa
procedura apre una finestra di un editor di testo nella quale è possibile immettere i
comandi del Matlab.
♦ Salvare l’m-file con estensione .m.
Il file, che verra’ salvato all’interno della directory corrente potra’ essere richiamato dalla
riga di comando o da qualsiasi altro file .m digitando semplicemente il nome del file (senza
estensione).

Funzioni
Le Funzioni sono M-file che possono accettare argomenti in ingresso e forniscono risultati
di uscita.
Il nome dell'M-file e della funzione deve essere lo stesso.
Le variabili usate all'interno della funzione sono locali. Infatti, le funzioni operano su
variabili definite nel proprio Workspace, che è separato dal Workspace a cui si accede
all'ingresso di Matlab:.
Alla nuova funzione deve essere assegnato un nome ed un'estensione '.m'.
La prima riga della funzione riporta la parola chiave function seguita dalle variabili di
uscita, il nome della funzione e le variabili in ingresso, con la seguente sintassi:
function [out1,out2] = function_name(in1,in2,in3)

Le righe di commento immediatamente dopo la dichiarazione della funzione formano l’help


della funzione stessa, e viene visualizzato digitando:
>> help function_name
Con il comando type è possibile visualizzare il codice di una funzione:
>> type function_name

Esempio:
Un esempio di funzione è la funzione di Matlab mean, che effettua la media dei valori di un
vettore.
Visualizza l’help:
>> help mean
Visualizza la funzione:

18 DISI – Universita’ degli Studi di Trento


Laboratorio di Elaborazione e Trasmissione delle Immagini
(F. De Natale – N. Conci – N. Piotto – M.Daldoss)
>> type mean
In questo caso la dichiarazione della funzione è:
function y = mean(x,dim)

Nota: molti dei comandi di Matlab rappresentano delle funzioni: quando un comando
come roots, plot, step viene immesso in Matlab, in realtà viene fatto eseguire
tipicamente un m-file. Questi tipi di file sono simili ad un sottoprogramma di un linguaggio
di programmazione, in quanto essi hanno degli ingressi (parametri che sono passati all'm-
file), delle uscite (valori che ritornano dall'm-file), e un corpo di comandi che possono
contenere variabili locali.

8 Image processing toolbox


E’ una libreria di funzioni di Matlab per l’elaborazione immagini.
Sono disponibili alcune demo digitando il comando demo e selezionando ‘Image
Processing’ dalla voce ‘Toolboxes’ del menù.
Per ottenere l’elenco completo delle funzioni disponibili nel toolbox digitare:
>> help images

Lettura di un’immagine
Il Toolbox fornisce alcune immagini di test.
Per leggere un’immagine, si utilizza il commando imread:
>> I=imread('pout.tif');

L’immagine è stata salvata in una matrice 291x240 di interi ad 8bit (uint8):


>> whos
Name Size Bytes Class
I 291x240 69840 uint8 array
Grand total is 69840 elements using 69840 bytes

L’immagine ‘pout’ è infatti un’immagine a livelli di grigio a 8bit per pixel, per cui viene
salvata automaticamente in un array di tipo uint8, ed i livelli di grigio vengono espressi in
valori da 0 a 255.
Matlab è in grado di salvare immagini in memoria in matrici di tipo uint8, uint16 o
double.

Nota: Nel caso di una immagine salvata in una matrice di tipo double, si assume che i
valori siano normalizzati, ovvero compresi tra 0 ed 1.

Visualizzazione di un’immagine
L’immagine salvata in I può essere visualizzata utilizzando il comando imshow
>> imshow(I)
DISI – Universita’ degli Studi di Trento 19
Laboratorio di Elaborazione e Trasmissione delle Immagini
(F. De Natale – N. Conci – N. Piotto – M.Daldoss)
Nota: è anche possibile visualizzare l’immagine contenuta in un file, senza utilizzare la
matrice I:
>> imshow ('pout.tif');

Attenzione!
L’immagine in input può essere di tipo:
uint8, uint16, o double.
Se erroneamente un’immagine rappresentata da valori interi compresi tra 0 e 255 viene
salvata in un array di tipo double, imshow visualizzerà un’immagine bianca. Questo
perché quando imshow riceve come ingresso una matrice di tipo double, si aspetta una
matrice normalizzata, con valori compresi tra 0 e1, ponendo a 1 tutti i valori superiori a 1,
ed a 0 tutti i valori inferiori a 0.
Per verificare quanto detto, convertiamo la matrice I da uint8 in double con la funzione
di Matlab double():
>> I1=double(I)
>> imshow(I1)

Per visualizzare correttamente l’immagine è necessario trasformare la matrice in interi a


8bit con la funzione uint8():
>> imshow(uint8(I1))

In alternativa è possibile normalizzare l’immagine:


>> I2=I1/255;
>> imshow(I2)

Salvataggio di un’immagine
E’ possibile salvare un’immagine in diversi formati, utilizzando il comando imwrite:
>> imwrite(I1,’pippo.jpg’)

Per una descrizione dettagliata dei formati possibili:


help imwrite

Generazione di un’immagine
– Quadrato bianco (100x100 pix)

>> image = ones([100 100]);


>> imshow(image);
Nota: 0 -> nero, 1 -> bianco.

– Immagine Random

>> image = rand([100 100]);


>> imshow(image);

20 DISI – Universita’ degli Studi di Trento


Laboratorio di Elaborazione e Trasmissione delle Immagini
(F. De Natale – N. Conci – N. Piotto – M.Daldoss)

– Seno

>> image = 0.5 * sin([1:100]')*ones(1,100) + 0.5*ones([100


100]);
>> imshow(image);

– Circonferenza

>> X = ones(100,1)*[-50:49]; Y = [-50:49]'*ones(1,100);


>> Z = X.^2 + Y.^2;
>> mesh(Z);
>> image = zeros([100 100]);
>> image(find(Z <= 50^2)) = 1;
>> imshow(image); title('circle');

9 Esercitazione riepilogativa
Obiettivo: creare una funzione in grado di generare una matrice di dimensioni MxN con
distribuzione random. La funzione restituira’ la matrice di ingresso sottocampionata di un
fattore fac scelto arbitrariamente.
La funzione provvedera’ a suddividere l’immagine in blocchi di dimensione quadrata pari al
fattore di sottocampionamento.
Per ogni blocco verra’ calcolato il valor medio per mezzo di una seconda funzione
dichiarata internamente allo stesso file .m
La funzione originale provvedera’ a restituire due variabili contenenti il tempo di
elaborazione e la matrice sottocampionata.

function [newm, t]= sottocampiona (M, N, fac)


% Funzione sottocampiona
% creata da Nicola Conci il 04/05/2005
% utilizzo:
% sottocampiona(M, N, fac)
% M e N sono le dimensioni della matrice su cui lavorare
% fac e' il fattore di sottocampionamento
% la funzione sottocampiona restituisce una matrice di dimensioni M/fac,
% N/fac

%verifico che il fattore di sottocampionamento scelto sia compatibile con


%la dimensione dell’immagine
if rem(M,fac)~=0 | rem(N,fac)~=0
disp('il fattore di sottocampionamento non e'' multiplo
intero');

DISI – Universita’ degli Studi di Trento 21


Laboratorio di Elaborazione e Trasmissione delle Immagini
(F. De Natale – N. Conci – N. Piotto – M.Daldoss)
return;
end

%voglio conoscere il tempo di elaborazione. Posso utilizzare tic/toc


%oppure clock/etime
tic; % faccio partire il contatore

matrix= 20*rand(M,N); %dichiaro una matrice random MxN


newm=[]; %dichiaro una nuova matrice in cui memorizzo i risultati

%elaboro l’immagine a blocchi di quadrati fac x fac


for h=1:fac:M
for k=1:fac:N
newm(ceil(h/fac),ceil(k/fac))=
calcola_media(matrix(h:h+fac-1, k:k+fac-1));
end
end
t=toc*1000; % memorizzo in t il tempo globale di esecuzione

function [val]=calcola_media(m)
% calcola la media di una matrice
val=mean2(m);

22 DISI – Universita’ degli Studi di Trento