INTRODUZIONE AL MATLAB · 2019-11-05 · G. Petrucci “Laboratorio di elaborazione delle...

25
G. Petrucci “Laboratorio di elaborazione delle immagini” 1 1. INTRODUZIONE AL MATLAB La schermata Sulla schermata iniziale del Matlab, definita desktop, sono disponibili 4 finestre (windows) principali: la command window dove si possono eseguire direttamente i comandi e dove appaiono i risultati e le segnalazioni del programma (errori di esecuzione, avvisi ecc..); il workspace dove sono riportate le caratteristiche di tutte le variabili memorizzate dal Matlab a seguito delle elaborazioni, cioè nomi, tipo, dimensioni, spazio di memoria occupato, ecc…; la current directory dove sono riportati tutti i file matlab presenti nella directory utilizzata dal Matlab in quel momento; la command history che contiene tutti i comandi che sono stati eseguiti durante la sessione. Queste finestre possono essere richiamate dal menù desktop. In caso di problemi di visualizzazione delle 4 finestre, accedere al menù desktop, selezionare il sottomenù desktop layout, selezionare l’opzione default. Uso diretto Sulla command window appare il prompt del matlab, cioè il simbolo >>. Nell’uso diretto si digitano i comandi accanto al prompt separati da “,” (virgola) o “;” (punto e virgola) [es: >>x=3.14;sin(x)]. Per eseguire il comando si preme il tasto invio. Se si pone “;” alla fine del comando, il risultato non viene visualizzato. È possibile usare il tasto “” per visualizzare accanto al prompt le istruzioni già eseguite, modificarle ed eseguirle nuovamente. Uso mediante programmi, script e funzioni I programmi sono sequenze di istruzioni aventi lo scopo di eseguire elaborazioni matematiche complesse. In programmi matlab vengono scritti come file di testo e salvati assegnando un nome e l’estensione “.m”: i “file m”. Il nome del file deve iniziare con una lettera, non deve contenere spazi, non deve contenere vocali accentate !!!!!!. È opportuno assegnare un nome che ricordi la funzione svolta dal programma. Per scrivere i programmi è opportuno utilizzare l’apposito editor che consente anche di eseguire l’intero programma (dal menù debug mediante il comando run) o singole righe di istruzioni (selezionandole con il mouse e premendo F9 oppure tasto destro, evaluate selection). Durante e al termine della scrittura i programmi devono essere salvati in una directory creata dall’utente. Per eseguire il programma di solito è necessario che la current directory del Matlab sia quella nella quale il programma è salvato. Per settare la current directory si può utizzare la finestra current directory window. In alternativa si può forzare il Matlab a cercare comunque in alcune directory scelte dall’utente utilizzando il sottomenù Set Path del menù File. I file m sono di 2 tipi: script e functions. Gli script possono essere eseguiti mediante il comando run dell’editor, oppure digitando il nome dello script sulla command window e premendo il tasto invio (se il programma è presente nella current directory), oppure scrivendone il nome in un altro script, cosa utile per separare un programma in più script. Le functions servono ad aggiungere nuovi comandi al matlab e possono essere eseguite dal prompt o richiamate da uno script esattamente come si usano i comandi già disponibili del matlab (vedi sezione Le funzioni del matlab). Variabili Nei problemi matematici vengono elaborati dati numerici “contenuti” nelle variabili. Nel matlab i nomi delle variabili: sono costituiti da lettere e numeri, [es: x, y, xy, x1, x2, alfa, A, B, pippo, pluto, cicciolina], devono iniziare con delle lettere, le lettere maiuscole e minuscole sono considerate differenti, [es: A ed a sono di variabili differenti], i nomi non devono essere uguali a funzioni del matlab (in tal caso la funzione diviene inutilizzabile nella sessione), è opportuno assegnare alle variabili dei nomi brevi, che richiamino la grandezza che rappresentano, ad esempio x o x1 ad una ascissa, y o Y ad una ordinata, tau ad una tensione tangenziale, sx alla σx, ecc… . Prima di essere utilizzate, le variabili devono essere inizializzate, cioè deve essere fatto assumere loro un valore numerico. L’inizializzazione viene effettuata mediante l’operatore di assegnazione “=”. Es: >>a=1; x=2.7;y=a*x; oppure mediante funzioni che creano variabili (ad esempio zeros che crea matrici di 0, ones che crea matrici di 1, linspace e meshgrid, che creano matrici con numeri equispaziati, rand che crea matrici con numeri random). Nel Matlab si utilizzano diverse classi di variabili, le principali sono 4: 3 di tipo numerico e una di tipo stringa. Le variabili numeriche più utilizzate appartengono alle classi double, uint8 e logical. I double sono i numeri in doppia precisione, utili a rappresentare i numeri reali, sui quali è possibile eseguire tutte le operazioni matematiche. Gli uint8 sono numeri interi ad 8 bit unsigned (senza segno), utili a rappresentare numeri interi compresi tra 0 e 255, sui quali non è possibile compiere operazioni matematiche, adatti alla memorizzazione di numerose immagini. I logical sono numeri che assumono il valore 0 o il valore 1. Il Matlab considera le variabili introdotte dall’utente come double, carica le immagini come uint8. Le logical sono utilizzate per il trattamento delle immagini binarie. Esistono apposite funzioni per convertire le variabili nei tre formati.

Transcript of INTRODUZIONE AL MATLAB · 2019-11-05 · G. Petrucci “Laboratorio di elaborazione delle...

Page 1: INTRODUZIONE AL MATLAB · 2019-11-05 · G. Petrucci “Laboratorio di elaborazione delle immagini” 2 Le variabili stringa servono a memorizzare parole e caratteri e sono utili

G. Petrucci “Laboratorio di elaborazione delle immagini”

1

1. INTRODUZIONE AL MATLAB

La schermata Sulla schermata iniziale del Matlab, definita desktop, sono disponibili 4 finestre (windows) principali: • la command window dove si possono eseguire direttamente i comandi e dove appaiono i risultati e le segnalazioni del

programma (errori di esecuzione, avvisi ecc..); • il workspace dove sono riportate le caratteristiche di tutte le variabili memorizzate dal Matlab a seguito delle elaborazioni,

cioè nomi, tipo, dimensioni, spazio di memoria occupato, ecc…; • la current directory dove sono riportati tutti i file matlab presenti nella directory utilizzata dal Matlab in quel momento; • la command history che contiene tutti i comandi che sono stati eseguiti durante la sessione. Queste finestre possono essere richiamate dal menù desktop. In caso di problemi di visualizzazione delle 4 finestre, accedere al menù desktop, selezionare il sottomenù desktop layout, selezionare l’opzione default.

Uso diretto • Sulla command window appare il prompt del matlab, cioè il simbolo >>. • Nell’uso diretto si digitano i comandi accanto al prompt separati da “,” (virgola) o “;” (punto e virgola)

[es: >>x=3.14;sin(x)]. • Per eseguire il comando si preme il tasto invio. • Se si pone “;” alla fine del comando, il risultato non viene visualizzato. • È possibile usare il tasto “↑” per visualizzare accanto al prompt le istruzioni già eseguite, modificarle ed eseguirle

nuovamente.

Uso mediante programmi, script e funzioni • I programmi sono sequenze di istruzioni aventi lo scopo di eseguire elaborazioni matematiche complesse. • In programmi matlab vengono scritti come file di testo e salvati assegnando un nome e l’estensione “.m”: i “file m”. • Il nome del file deve iniziare con una lettera, non deve contenere spazi, non deve contenere vocali accentate !!!!!!. • È opportuno assegnare un nome che ricordi la funzione svolta dal programma. • Per scrivere i programmi è opportuno utilizzare l’apposito editor che consente anche di eseguire l’intero programma (dal

menù debug mediante il comando run) o singole righe di istruzioni (selezionandole con il mouse e premendo F9 oppure tasto destro, evaluate selection).

• Durante e al termine della scrittura i programmi devono essere salvati in una directory creata dall’utente. • Per eseguire il programma di solito è necessario che la current directory del Matlab sia quella nella quale il programma è

salvato. Per settare la current directory si può utizzare la finestra current directory window. • In alternativa si può forzare il Matlab a cercare comunque in alcune directory scelte dall’utente utilizzando il sottomenù Set

Path del menù File. • I file m sono di 2 tipi: script e functions.

• Gli script possono essere eseguiti mediante il comando run dell’editor, oppure digitando il nome dello script sulla command window e premendo il tasto invio (se il programma è presente nella current directory), oppure scrivendone il nome in un altro script, cosa utile per separare un programma in più script.

• Le functions servono ad aggiungere nuovi comandi al matlab e possono essere eseguite dal prompt o richiamate da uno script esattamente come si usano i comandi già disponibili del matlab (vedi sezione Le funzioni del matlab).

Variabili Nei problemi matematici vengono elaborati dati numerici “contenuti” nelle variabili. • Nel matlab i nomi delle variabili:

sono costituiti da lettere e numeri, [es: x, y, xy, x1, x2, alfa, A, B, pippo, pluto, cicciolina], devono iniziare con delle lettere, le lettere maiuscole e minuscole sono considerate differenti, [es: A ed a sono di variabili differenti], i nomi non devono essere uguali a funzioni del matlab (in tal caso la funzione diviene inutilizzabile nella sessione), è opportuno assegnare alle variabili dei nomi brevi, che richiamino la grandezza che rappresentano, ad esempio x o

x1 ad una ascissa, y o Y ad una ordinata, tau ad una tensione tangenziale, sx alla σx, ecc… . • Prima di essere utilizzate, le variabili devono essere inizializzate, cioè deve essere fatto assumere loro un valore numerico.

L’inizializzazione viene effettuata mediante l’operatore di assegnazione “=”. Es: >>a=1; x=2.7;y=a*x;

oppure mediante funzioni che creano variabili (ad esempio zeros che crea matrici di 0, ones che crea matrici di 1, linspace e meshgrid, che creano matrici con numeri equispaziati, rand che crea matrici con numeri random).

• Nel Matlab si utilizzano diverse classi di variabili, le principali sono 4: 3 di tipo numerico e una di tipo stringa. Le variabili numeriche più utilizzate appartengono alle classi double, uint8 e logical. I double sono i numeri in doppia precisione, utili a rappresentare i numeri reali, sui quali è possibile eseguire tutte le

operazioni matematiche. Gli uint8 sono numeri interi ad 8 bit unsigned (senza segno), utili a rappresentare numeri interi compresi tra 0 e 255, sui

quali non è possibile compiere operazioni matematiche, adatti alla memorizzazione di numerose immagini. I logical sono numeri che assumono il valore 0 o il valore 1.

Il Matlab considera le variabili introdotte dall’utente come double, carica le immagini come uint8. Le logical sono utilizzate per il trattamento delle immagini binarie. Esistono apposite funzioni per convertire le variabili nei tre formati.

Page 2: INTRODUZIONE AL MATLAB · 2019-11-05 · G. Petrucci “Laboratorio di elaborazione delle immagini” 2 Le variabili stringa servono a memorizzare parole e caratteri e sono utili

G. Petrucci “Laboratorio di elaborazione delle immagini”

2

Le variabili stringa servono a memorizzare parole e caratteri e sono utili per la gestione dei nomi dei file di dati ed immagini da caricare e/o salvare, per scrivere messaggi sullo schermo, per scegliere le opzioni in alcune funzioni matlab che lo prevedono. Si introducono ponendo la parola tra apici ‘’ - es: >>n=’nome.bmp’;

Vettori, matrici, cell arrays • Le variabili generalmente sono in forma di vettori e matrici, ovvero arrays. • I vettori sono arrays ad una sola dimensione, cioè una riga o una colonna. • Le matrici possono avere più di 2 dimensioni. [es: il tensore σ è una matrice 3x3, se si vuole valutare in 10x10x10 punti

nello spazio xyz si può utilizzare una matrice a 5 dimensioni 3x3x10x10x10]. • Gli elementi di una matrice vengono introdotti ponendoli entro parentesi quadre separati da spazi o virgole, mentre le righe

vanno separate con il punto e virgola - es: >>a=[1 2 3; 4 5 6]. • Per richiamare i singoli elementi di una matrice si possono utilizzare gli usuali indici riga-colonna, detti anche indici

multipli, posti entro parentesi tonde separati da virgole - es: >>a(2,2), s(1,2,5,7,1) • Per richiamare i singoli elementi di una matrice possono essere utilizzati anche gli indici lineari, che permettono di

identificare gli elementi della matrice con un unico numero - es: >>[a(1), a (2), a(3), a(4), a(5), a(6)]. Gli indici lineari sono gli indici che identificano gli elementi di un vettore colonna ottenuto disponendo consecutivamente le colonne della matrice originaria.

• Si possono creare matrici di matrici, cioè matrici ciascun elemento delle quali è, a sua volta, una matrice: i cosiddetti cell

array. Per esempio: il tensore σ è una matrice 3x3, se si vuole valutare in 10x10x10 punti nello spazio xyz si può utilizzare un cell array costituito da 10x10x10 matrici 3x3. Gli indici multipli per individuare il singolo array devono essere posti tra parentesi graffe, gli indici necessari ad identificare il singolo elemento vanno posti tra le consuete parentesi tonde - es.: >>s{2,2,5}(1,1); identifica l’elemento (1,1) del tensore relativo al punto cui sono stati attribuiti gli indici {2,2,5}. I cell array sono utili, ad esempio, per elaborare più immagini, considerando ciascuna immagine come uno degli array che costituisce il cell array – es: >>IM{i}(y,x) permette di accedere al pixel di coordinate x,y nell’immagine contenuta nell’elemento i del cell array IM. Una caratteristica importante del cell array è che le matrici che lo costituiscono possono avere dimensioni diverse tra loro.

• Gli indici delle matrici e dei vettori devono essere numeri interi. Se i valori degli indici vengono determinati con operazioni di calcolo, come accade per le coordinate degli elementi di una immagine, devono essere trasformati in interi, ad esempio mediante l’istruzione round, prima di essere utilizzati per accedere all’elemento della matrice.

• In molti calcoli sugli arrays, il prodotto *, la divisione / e l’elevazione a potenza ^, devono essere eseguite elemento per elemento e non con le regole del calcolo matriciale. Ad esempio, per calcolare la funzione y=x^2 nel campo 0<x<10, si deve creare un array x che contiene i valori dell’ascissa ed applicare l’elevazione a potenza a ciascun elemento. Questa operazione è differente dall’elevazione al quadrato matriciale, che consiste nella moltiplicazione della matrice per se stessa. Per specificare che l’operazione deve essere eseguita elemento per elemento, l’operatore matematico deve essere preceduto dal punto, cioè .*, ./, .^. La regola non è necessaria per somma e sottrazione in quanto le operazioni matriciali stesse sono eseguite elemento per elemento.

Le funzioni del matlab • Il Matlab comprende centinaia di funzioni che eseguono operazioni di vario tipo sulle variabili. • Ciascuna funzione ha un nome ben preciso [es: sin esegue l’istruzione seno, max determina il massimo in un array]. • La funzione riceve uno o più dati di ingresso posti tra parentesi tonde alla fine del nome e separati da una virgola; • i dati di ingresso di una funzione possono essere costanti o arrays di costanti, Es: >>sin(3.14); >>sin([0 1.57 3.14]) oppure variabili, Es: >>sin(x) • La funzione restituisce uno o più dati in uscita che possono essere visualizzati o memorizzati in variabili Es: >>y=sin(3.14), z=cos(x) • Se le variabili in uscita sono più di una devono essere poste tra parentesi quadre e separate da virgola Es: >> [dx,dy]=gradient(I); • Per utilizzare una funzione in matlab bisogna prestare attenzione a: 1. quali operazioni effettua, 2. il nome esatto, 3. quante variabili vuole in ingresso e di che tipo, 4. quante variabili restituisce e di che tipo.

Il matlab opera per colonne • Quando una funzione del Matlab elabora l’insieme di dati contenuto un array:

se l’array possiede più di una dimensione, l’elaborazione viene eseguita su ciascuna colonna e viene restituito un vettore ciascun elemento del quale è il risultato dell’operazione effettuata su ciascuna colonna;

se l’array possiede una sola dimensione, cioè è una riga o una colonna, l’elaborazione viene eseguita su tutti gli elementi e viene restituito un solo valore.

Ad esempio, se l’array di ingresso è monodimensionale la funzione max() restituisce il massimo assoluto dell’array, se l’array di ingresso è bidimensionale, restituisce un array riga i cui elementi sono i massimi relativi a ciascuna colonna. Ad esempio: >>a=[1 5; 7 2];m=max(a); restituisce [5 7].

• Se si desidera che una funzione operi su tutti gli elementi dell’array si può utilizzare l’operatore “:”, che fa scorrere gli

indici. Ad esempio >>a=[1 5; 7 2];m=max(a(:)); restituisce 7.

Page 3: INTRODUZIONE AL MATLAB · 2019-11-05 · G. Petrucci “Laboratorio di elaborazione delle immagini” 2 Le variabili stringa servono a memorizzare parole e caratteri e sono utili

G. Petrucci “Laboratorio di elaborazione delle immagini”

3

2. LE IMMAGINI DIGITALI

Immagini digitali - matrici Le immagini digitali sono rappresentazioni mediante elementi discreti delle immagini bidimensionali. Per ottenere un’immagine digitale si effettua una operazione detta digitalizzazione:

• l’immagine originale di forma rettangolare viene suddivisa in un numero nxm di elementi quadrati o rettangolari detti pixel (picture element),

• a ciascun pixel è attribuito un valore numerico intero legato all’intensità luminosa o al colore presente nell’immagine originale in corrispondenza del pixel stesso.

I pixel sono caratterizzati da due informazioni: • il valore numerico rappresentativo dell’intensità luminosa o del colore, • la posizione all’interno dell’immagine, definita da 2 coordinate in un sistema di assi cartesiano.

L’insieme dei valori numerici può essere considerato a tutti gli effetti una matrice di numeri, per cui all’immagine originale viene associata una matrice I. Coordinate - indici Gli indici riga i e colonna j che identificano gli elementi della matrice I sono legati alle coordinate cartesiane dei pixel. Per ottenere una equivalenza numerica tra indici della matrice e coordinate cartesiane dei pixel, l’origine, l’orientamento e la scala degli assi cartesiani deve rispettare una serie di regole. Ricordando che:

• l’elemento di una matrice è identificato da un primo indice i che identifica la riga e un secondo indice j che identifica la colonna,

• le righe di una matrice sono numerate dall’alto in basso e le colonne da sinistra a destra, • gli indici sono rappresentati da numeri interi maggiori di 0 (i,j≥1)

discende che, volendo utilizzare gli indici riga e colonna come coordinate cartesiane dei baricentri

dei pixel, gli assi x e y devono avere le caratteristiche mostrate in fig.1: • l’indice riga i corrisponde all’ordinata y, e l’indice colonna j corrisponde all’ascissa x; • l’asse y deve essere rivolto verso il basso e l’asse x verso destra; • affinché le coordinate del baricentro del pixel in alto a sinistra risultino x=1, y=1, l’origine degli assi deve essere posta ad

un pixel di distanza verso l’alto e verso sinistra rispetto al baricentro del pixel in alto a sinistra stesso.

In conseguenza di quanto detto, per selezionare il valore numerico del pixel di coordinate x, y di una immagine cui è associata la matrice I, in Matlab si deve scrivere I(y,x). Se le coordinate x e y provengono da una elaborazione e sono rappresentate da numeri reali, esse devono essere arrotondate all’intero più vicino (in Matlab tipicamente mediante l’istruzione round: x=round(x); y=round(y);). La relazione tra le coordinate cartesiane sull’immagine digitale x, y e quelle sull’immagine bidimensionale originale X, Y può essere ottenuta moltiplicando le coordinate sull’immagine per la dimensione l dei lati dell’area quadrata corrispondente al pixel sull’immagine originaria. Tale dimensione può essere ottenuta essendo nota la distanza reale D esistente tra 2 punti rappresentati nell’immagine e le coordinate dei pixel corrispondenti a tali punti mediante la seguente relazione:

( ) ( )2 2

2 1 2 1l D x x y y= − + − (1)

Nota la dimensione l è possibile valutare la distanza tra i punti dell’immagine reale corrispondenti ai baricentri dei pixel moltiplicando la distanza espressa in numero di pixel per l. Valori numerici – tipi di immagine I valori numerici contenuti nella matrice I associata ad una immagine digitale sono costituiti da numeri interi legati al contenuto cromatico dell’immagine originale, in un modo che dipende dal tipo di immagine digitale. Le immagini digitali più importanti possono essere suddivise in

• monocromatiche (o a toni di grigio, o a livelli di grigio), • a colori (o RGB - R=Red, G=Green, B=Blue), • binarie.

Nelle immagini monocromatiche il dato numerico relativo ad un pixel è proporzionale all’intensità luminosa media presente nell’area dell’immagine originale corrispondente al pixel stesso. Nel Matlab le immagini monocromatiche possono essere rappresentate come matrici di classe uint8 (numeri interi 0≤I≤255) o come matrici di classe double (numeri reali 0≤I≤1). Nelle immagini a colori il dato numerico relativo ad un pixel è ottenuto come combinazione di 3 numeri proporzionali all’intensità luminosa media delle componenti di rosso, verde e blu del colore presente nell’area dell’immagine originale corrispondente al pixel stesso. Nel Matlab le immagini a colori possono essere rappresentate in modo analogo alle immagini monocromatiche, ma utilizzando matrici di dimensioni nxmx3. Nelle immagini binarie il dato numerico è costituito dai valori 0=nero e 1=bianco. Nel Matlab le immagini binarie sono rappresentate da matrici di classe logical. Per effettuare operazioni matematiche su matrici uint8 e logical è necessario effettuare una conversione alla classe double.

1,1 1,2 1,3 1,4 1,5

2,1 2,2 2,3 2,4

3,1 3,2 3,3

4,1 4,2

5,1

Fig.2.1 - Assi xy ed indici.

x

y

0,0 1 2 3 4 5 6

1 2 3 4 5 6

Page 4: INTRODUZIONE AL MATLAB · 2019-11-05 · G. Petrucci “Laboratorio di elaborazione delle immagini” 2 Le variabili stringa servono a memorizzare parole e caratteri e sono utili

G. Petrucci “Laboratorio di elaborazione delle immagini”

4

Caratteristiche dell’immagine Caratteristiche fondamentali di una immagine digitale sono:

• la risoluzione, data dal numero di pixel disposti in orizzontale Nx (ovvero il numero di colonne della matrice) per il numero di pixel disposti in verticale Ny (ovvero il numero di righe della matrice) che costituiscono l’immagine stessa;

• la quantizzazione, data dal numero totale Z di livelli nei quali può essere suddivisa l’intensità massima o dal numero B di bit necessari per codificare il numero di livelli, essendo Z=2B.

Valori tipici di risoluzione sono 640 x 480 (640 pixel orizzontali x 480 verticali), 1024 x 768 eccetera. Valori tipici della quantizzazione per le immagini monocromatiche sono B=8 bit (Z=28=256 livelli), 10 bit (Z=210=1024 livelli), 16 bit (Z=216=65536). Nel caso delle immagini RGB, la quantizzazione può essere espressa in bit o livelli relativi a ciascuna delle tre componenti RGB, oppure in bit o livelli relativi a tutte le combinazioni delle tre componenti, ottenibile come prodotto delle quantizzazioni delle 3 componenti. Ad esempio, una immagine RGB con quantizzazione a B=8 bit per ciascuna componente RGB, ha una quantizzazione totale B=3*8=24 bit essendo tutte le combinazioni delle tre componenti pari a Z=256*256*256=224. Valori tipici sono B=16 bit (in realtà B=3*5=15 bit) e B=24 bit. La quantizzazione delle immagini binarie è 2. Da notare che nei sistemi Windows possono essere visualizzati soltanto Z=256 livelli per ciascuna componente; ovviamente è possibile elaborare matrici di immagini con quantizzazioni superiori, ma per la successiva visualizzazione è necessario creare matrici con quantizzazione non superiore a 256, mediante una semplice operazione di divisione. Il formato dell’immagine I dati numerici di un’immagine digitale, cioè la matrice associata ad essa, vengono memorizzati sotto forma di file. In generale non è sufficiente memorizzare la sola matrice associata all’immagine in quanto, potendo variare la risoluzione e la quantizzazione con cui l’immagine è stata creata, non è possibile in generale identificare il tipo di immagine a partire soltanto da essa. Per questo motivo, prima dei dati relativi alla matrice, i file contengono opportune intestazioni per permettere ai programmi l’identificazione del tipo di immagine e la sua corretta visualizzazione. Al fine di limitare l’occupazione di memoria, inoltre, il file costituito dall’intestazione e dalla matrice può essere sottoposto ad una compressione mediante diversi algoritmi standardizzati. In molti casi la compressione comporta una certa perdita di informazioni rispetto ai dati originali. Le immagini di tipo Bmp (BitMap) non sono compresse, le immagini Tiff (Tagged Image File Format) sono compresse, ma senza perdita di dati (quindi l’effetto della compressone varia in dipendenza delle caratteristiche dell’immagine), mentre le immagini Gif (Graphics Interchange Format) e Jpeg sono compresse, con perdita di parte delle informazioni e non dovrebbero essere utilizzate nel campo dell’elaborazione delle immagini. Strumenti per l’acquisizione delle immagini Le immagini digitali possono essere ottenute mediante strumenti che effettuano la digitalizzazione delle immagini reali. Le principali caratteristiche di interesse degli strumenti di acquisizione riguardano:

• la qualità dell’immagine digitalizzata, • le caratteristiche operative.

La qualità dell’immagine è relativa alla fedeltà con la quale le caratteristiche dell’immagine originale vengono preservate nella digitalizzazione. Essa è rappresentata dalle seguenti caratteristiche:

• La quantizzazione, già definita in precedenza. • La risoluzione che, nel caso dello strumento di acquisizione, è legata sia al numero di elementi che costituiscono

l’immagine N=NxxNy, che all’area dell’immagine originale che può essere acquisita dallo strumento A. Per questo motivo essa può essere espressa dal rapporto R=N/A.

• La capacità di non introdurre disturbi nell’immagine, cioè distorsioni geometriche e variazioni indesiderate nell’intensità, come quelle prodotte dal rumore elettronico o dall’apertura del diaframma di un obiettivo.

Le caratteristiche operative riguardano il tipo e le dimensioni delle immagini reali che possono essere acquisite e il numero di immagini n che possono essere acquisite nell’unità di tempo t, caratterizzabile con la frequenza di acquisizione f=n/t o il tempo di acquisizione di una immagine T. I principali strumenti sono scanner, fotocamere e telecamere.

• Gli scanner forniscono immagini di ottima qualità, operano su immagini stampate o su oggetti bidimensionali, consentono di acquisire una immagine alla volta, l’area dell’immagine reale che può essere acquisita è fissa. Nel caso degli scanner la risoluzione viene espressa in numero di Pixel Per Pollice quadrato, cioè in PPI.

• Le fotocamere hanno buona risoluzione e buona qualità, permettono di acquisire immagini da oggetti tridimensionali, l’area dell’immagine reale acquisita può essere variata mediante dispositivi ottici come zoom e obiettivi, consentono di acquisire una immagine alla volta. Potendo variare l’area dell’immagine acquisita, la risoluzione propria della fotocamera si esprime in numeri di pixel NxxNy, mentre la risoluzione effettiva dipende dall’area dell’immagine acquisita. Regolando l’ingrandimento ottico è possibile diminuire l’area acquisita A aumentando la risoluzione R a parità di risoluzione NxxNy.

• Le telecamere hanno risoluzione e qualità inferiori a scanner e fotocamere e possiedono caratteristiche analoghe alle fotocamere con in più la possibilità di acquisire diverse immagini nell’unità di tempo.

Page 5: INTRODUZIONE AL MATLAB · 2019-11-05 · G. Petrucci “Laboratorio di elaborazione delle immagini” 2 Le variabili stringa servono a memorizzare parole e caratteri e sono utili

G. Petrucci “Laboratorio di elaborazione delle immagini”

5

3. INDICI E FINESTRE DI ELABORAZIONE Indici riga-colonna ed indici lineari In Matlab gli elementi di una matrice possono essere individuati mediante la coppia di indici riga-colonna y, x, oppure mediante un indice lineare i (intero) che cresce nel verso delle colonne, legato ad y ed x mediante la seguente relazione

i=y+Ny (x−1) (3.1)

nella quale Ny è il numero di righe della matrice. Per passare da indici riga-colonna ad indici interi è quindi necessario conoscere o imporre il numero di righe della matrice. Ad esempio (fig.1): x=3; y=6; Ny=10 i=6+10*(3−1)=26 In numerosi casi l’uso di indici lineari risulta più efficace di quello degli indici riga-colonna, in particolare nell’uso delle finestre di elaborazione descritto nel seguito.

y/x 1 2 3 4 5 6 7 8 y/x 1 2 3 4 5 6 7 8

1 1 11 21 31 41 51 61 71 1 1 11 21 31 41 51 61 71

2 2 12 22 32 42 52 62 72 2 2 12 22 32 42 52 62 72

3 3 13 23 33 43 53 63 73 3 3 13 23 33 43 53 63 73

4 4 14 24 34 44 54 64 74 4 4 14 24 34 44 54 64 74

5 5 15 25 35 45 55 65 75 5 5 15 25 35 45 55 65 75

6 6 16 26 36 46 56 66 76 6 6 16 26 36 46 56 66 76

7 7 17 27 37 47 57 67 77 7 7 17 27 37 47 57 67 77

8 8 18 28 38 48 58 68 78 8 8 18 28 38 48 58 68 78

9 9 19 29 39 49 59 69 79 9 9 19 29 39 49 59 69 79

10 10 20 30 40 50 60 70 80 10 10 20 30 40 50 60 70 80

Fig.3.1 –Elemento y=6, x=3 o i=26 in una matrice a 10 righe. Fig.3.2 - Finestre quadrate N=3 centrate nei pixel i=12 ed i=55

di una matrice a 10 righe.

Contorni di un pixel Un generico pixel di coordinate (x,y) ha 4 pixel limitrofi nelle direzioni orizzontale e verticale, di coordinate (x−1,y), (x+1,y), (x,y−1) e (x,y+1) e 4 pixel limitrofi nelle 2 direzioni diagonali, di coordinate (x−1,y−1), (x−1,y+1), (x+1,y−1) e (x+1,y+1). L’insieme dei primi 4 pixel costituisce il contorno a 4 del pixel centrale, mentre tutti gli 8 pixel limitrofi costituiscono il contorno a 8. I centri dei pixel nelle direzioni verticale e orizzontale hanno una distanza dal centro del pixel centrale pari al lato del pixel, mentre i centri dei pixel diagonali hanno una distanza 2 volte maggiore. Finestre di elaborazione Nell’elaborazione delle immagini numerose operazioni vengono effettuate punto per punto sottoponendo i pixel limitrofi al punto considerato ad opportune operazioni. L’insieme dei pixel limitrofi al pixel su cui si opera costituiscono quella che viene definita una finestra centrata nel pixel. Tale finestra può comprendere o meno il pixel stesso. Le finestre che si utilizzano possono avere varia forma, in dipendenza del tipo di elaborazione da effettuare, ma le più importanti sono la finestra quadrata, la finestra circolare e la finestra direzionale. Finestre quadrate Le finestre quadrate (fig.2) sono il tipo di finestra più semplice. Hanno lo svantaggio che i pixel nella zona degli spigoli della finestra hanno distanze dal pixel centrale maggiori rispetto agli altri pixel sui lati della finestra. Le finestre quadrate si caratterizzano mediante la lunghezza del lato N espressa in numero di pixel. È opportuno che N sia un valore dispari, in modo che il pixel centrale coincida con il centro della finestra. Gli indici delle finestre quadrate possono essere memorizzati in sottomatrici NxN, come in fig.2, oppure in vettori di lunghezza N2 come sarà meglio illustrato nel seguito. Finestre circolari Le finestre circolari (fig.3) hanno il vantaggio che i pixel esterni hanno tutti la stessa distanza dal pixel centrale. Si caratterizzano mediante il diametro D o il raggio R espresso in numero di pixel e misurato in direzione orizzontale o verticale. È opportuno che D sia un valore dispari, in modo che il pixel centrale coincida con il centro della finestra. Al di sotto del diametro 5 le finestre circolari non presentano vantaggi rispetto a quelle rettangolari. Gli indici delle finestre circolari possono essere memorizzati in vettori di lunghezza opportuna come sarà meglio illustrato nel seguito.

Page 6: INTRODUZIONE AL MATLAB · 2019-11-05 · G. Petrucci “Laboratorio di elaborazione delle immagini” 2 Le variabili stringa servono a memorizzare parole e caratteri e sono utili

G. Petrucci “Laboratorio di elaborazione delle immagini”

6

y/x 1 2 3 4 5 6 7 8 y/x 1 2 3 4 5 6 7 8

1 1 11 21 31 41 51 61 71 1 1 11 21 31 41 51 61 71

2 2 12 22 32 42 52 62 72 2 2 12 22 32 42 52 62 72

3 3 13 23 33 43 53 63 73 3 3 13 23 33 43 53 63 73

4 4 14 24 34 44 54 64 74 4 4 14 24 34 44 54 64 74

5 5 15 25 35 45 55 65 75 5 5 15 25 35 45 55 65 75

6 6 16 26 36 46 56 66 76 6 6 16 26 36 46 56 66 76

7 7 17 27 37 47 57 67 77 7 7 17 27 37 47 57 67 77

8 8 18 28 38 48 58 68 78 8 8 18 28 38 48 58 68 78

9 9 19 29 39 49 59 69 79 9 9 19 29 39 49 59 69 79

10 10 20 30 40 50 60 70 80 10 10 20 30 40 50 60 70 80

Fig.3.3 – A sinistra finestra circolare D=5, centrata nel pixel i=23; a destra finestra D=7, centrata nel pixel i=34. Indici validi per matrici con Ny=10.

Indici relativi È possibile notare che gli indici lineari dei pixel appartenenti ad una finestra possono essere sempre ottenuti sommando il valore dell’indice centrale a degli indici relativi costanti, come mostrato in fig.4 relativamente alla finestra quadrata di fig.2.

1 11 21 -11 -1 9

2 12 22 = -10 0 10 + 12

3 13 23 -9 1 11 -11 -1 9

-10 0 10

44 54 64 -11 -1 9 -9 1 11

45 55 65 = -10 0 10 + 55

46 56 66 -9 1 11

Fig.3.4 – Finestre quadrate N=3 centrate nei pixel i=12 ed i=55 della matrice di fig.1 e finestre contenenti gli indici relativi. Utilizzando finestre con indici relativi è possibile ottenere i valori degli indici di finestre centrate in qualunque pixel sommando semplicemente l’indice del pixel stesso. Matrici e vettori di indici Come precedentemente accennato, gli indici delle finestre quadrate possono essere memorizzati in sottomatrici NxN, come in figg.1,4, oppure in vettori di lunghezza N2 come in fig.5. Nel caso delle finestre circolari conviene utilizzare direttamente i vettori (fig.6), in quanto le finestre circolari non danno luogo ad insiemi ordinabili come una matrice.

1 2 3 11 12 13 21 22 23

-11 -10 -9 -1 0 1 9 10 11

Fig.3.5 – In alto vettore contenente gli indici dei pixel della finestra quadrata N=5 centrata nel pixel i=12; in basso vettore contenente gli indici relativi.

2 3 4 11 12 13 14 15 21 22 23 24 25 31 32 33 34 35 42 43 44

-21 -20 -19 -12 -11 -10 -9 -8 -2 -1 0 1 2 8 9 10 11 12 19 20 21

Fig.3.6 – In alto vettore contenente gli indici dei pixel della finestra circolare D=5 centrata nel pixel i=23; in basso vettore contenente gli indici relativi.

Se I è la matrice di un’immagine avente numero di righe Ny e k è un vettore o una matrice contenente gli indici relativi di una qualunque finestra, i pixel contenuti in una finestra centrata nel pixel di coordinate x, y possono essere posti in un vettore W semplicemente scrivendo:

W=I([k+y+Ny (x−1)]) (2)

oppure

W=I(k+i) (3)

con i=y+Ny(x−1) secondo la relazione (1).

Page 7: INTRODUZIONE AL MATLAB · 2019-11-05 · G. Petrucci “Laboratorio di elaborazione delle immagini” 2 Le variabili stringa servono a memorizzare parole e caratteri e sono utili

G. Petrucci “Laboratorio di elaborazione delle immagini”

7

4. LETTURA SU RETTA E INTERPOLAZIONE DELLE INTENSITÀ La selezione dei punti dell'immagine appartenenti ad una retta si effettua selezionando i punti estremi della retta come i centri di due pixel di coordinate x1, y1 ed x2 y2; la retta passa per il centro esatto dei pixel punti iniziale e finale (2,2 e 12,4 in fig.1) e solo in qualche pixel interno (7,3 in fig.1). Tipicamente la lettura delle intensità è effettuata per un numero di punti pari al massimo tra i valori i due valori ottenuti come nx=x2−x1+1 ed ny=y2−y1+1 (nx=12−2+1=11 ed ny=4−2+1=3 in fig.1); se nx>ny, come in fig.1, le coordinate x dei centri dei pixel vengono utilizzate come variabile indipendente (x=x1: x2) e le coordinate y vengono calcolate come y=ky(x−x1)+y1, con ky=(y2−y1)/(x2−x1), viceversa le coordinate y dei centri dei pixel vengono utilizzate come variabile indipendente (y=y1: y2) e le coordinate x vengono calcolate come x=kx(y−y1)+y1, con kx=(x2−x1)/(y2−y1). Nei casi in cui il punto si trova al centro del pixel (cosa che si verifica se x ed y sono numeri interi) l'intensità letta coincide con quella del pixel, mentre negli altri punti è possibile determinarla o come l'intensità del pixel il cui centro è più vicino, oppure effettuando un interpolazione tra le intensità presenti nei pixel limitrofi. L'opportunità di questa operazione risulta evidente nei casi dei punti corrispondenti alle colonne 4, 5, 9 e 10 nei quali il punto della retta si trova al confine tra due pixel.

1 2 3 4 5 6 7 8 9 10 11 12 13

1

2

3

4

5

Page 8: INTRODUZIONE AL MATLAB · 2019-11-05 · G. Petrucci “Laboratorio di elaborazione delle immagini” 2 Le variabili stringa servono a memorizzare parole e caratteri e sono utili

G. Petrucci “Laboratorio di elaborazione delle immagini”

8

COMANDI DI TIPO GENERALE HELP Aiuto in linea help images CLEAR Cancella variabili e funzioni dalla memoria clear a b c CLC Cancella la finestra dei comandi clc SAVE Salva le variabili in memoria sul disco save prova a b c LOAD Carica le variabili dal disco. load prova WHOS Lista le variabili whos

OPERAZIONI ELEMENTARI SU MATRICI ONES Array di uno u=ones(n,m) ZEROS Array di zero z=zeros(n,m) REPMAT Arrays di arrays ripetuti y=repmat(a,[m n]) y=repmat(a,[1 1 n]) LINSPACE Vettori di elementi spaziati linearmente V=linspace(x1,x2,N) MESHGRID Arrays di coordinate X e Y per grafici 3-D [x,y]=meshgrid(n1:n2,m1:m2) RAND Array di numeri aleatori (random) R=rand(r,c) SIZE Dimensione di una matrice s=size(a) LENGTH Lunghezza di un vettore L=length(a) IND2SUB Da indici lineari a indici multipli [y,x]=ind2sub(size(a),i) [y,x]=ind2sub(s,i) SUB2IND Da indici multipli ad indici lineari i=sub2ind(size(a),y,x) i=sub2ind(s,y,x) FIND Trova gli indici di elementi nonzero i=find(a<100) [y,x]=find(a<100) MAX Elemento più grande [M,iM]=max(a) [M,iM]=max(a(:)) MIN Elemento più piccolo [m,im]=min(a) [m,im]=min(a(:)) MEAN Valore medio mn=mean(a) mn=mean(a(:)) SORT Ordina in ordine ascendente [YS,ks]=sort(a) YS=sort(a) FLIPUD Inverte la posizione delle righe di una matrice f=flipud(a) FLIPLR Inverte la posizione delle colonne di una matrice f=fliplr(a) RESHAPE Cambia la forma di un array y=reshape(a,[m n]) DIAG Matrici diagonali e diagonale di una matrice d=diag(a) INV Matrice inversa I=inv(a) GRAFICI FIGURE Crea una finestra grafica figure(n) PLOT Traccia grafici cartesiani plot(x1,y1,x2,y2) AXIS Controlla la scala e il formato degli assi axis([x1 x2 y1 y2]) SUBPLOT Suddivide una figura in più grafici subplot(2,2,1) GRID Crea una griglia di linee di riferimento grid on grid off MESH Traccia una superficie 3-D a reticolo mesh(a) mesh(x,y,a) VIEW Specifica il punto di vista in grafici 3-D view(al,be) COLORMAP Setta la tabella dei colori nei grafici colormap('gray')

XLABEL Nomina l’asse X xlabel(‘pixel’) YLABEL Nomina l’asse Y ylabel(‘Intensità’) TITLE Scrive un titolo su una figura title(‘red’) LEGEND Crea la “legenda” del grafico

BAR Grafico a barre bar(n,I) LOGLOG Grafico in coordinate Logaritmiche loglog(x,y) POLAR Grafico in coordinate polari polar(al,ro) CLOSE Chiude la figura close(n) close all STRINGHE DI CARATTERI NUM2STR Trasforma numeri in stringhe num=num2str(k) STRCAT Concatena stringhe di caratteri nome=strcat(‘c:\’,’disco’,num) STRCMP Confronta stringhe di caratteri b=strcmp(nome,’pippo’) OPERATORI RELAZIONALI E LOGICI <, <= Minore, minore o uguale c=a<b find(a<=b) >, >= Maggiore, maggiore o uguale c=a>=b find(a>b) ==, ~= Uguale, diverso c=a==b find(a==b) & AND Logico c=and(a,b) find(a & b) c=a&b | OR Logico c=or(a,b) find(a==1 | a<2) find(xor(a==1,a<2)) ~ NOT Complemento logico c=not(a) find(~a) xor OR esclusivo c=xor (a,b) find(xor(a==1,b==2)) any Vero se almeno un elemento è non zero u=any(y) all Vero se tutti gli elementi sono non zero u=all(y)

Page 9: INTRODUZIONE AL MATLAB · 2019-11-05 · G. Petrucci “Laboratorio di elaborazione delle immagini” 2 Le variabili stringa servono a memorizzare parole e caratteri e sono utili

G. Petrucci “Laboratorio di elaborazione delle immagini”

9

ISTRUZIONI DI CONTROLLO IF Istruzione condizionale IF if a==0;…. elseif a>5;…....else……;end SWITCH/CASE Sceglie tra vari casi in base ad una espressione switch (a); case(b);….. ;case(c);….otherwise…..; end FOR Ripete istruzioni un numero di volte specificato for i=1:3;………end WHILE Ripete istruzioni un numero di volte indefinito while (x<100)……end BREAK Termina l’esecuzione di un ciclo WHILE o FOR for i=1:3;………if k==1;break;end; …end FUNCTION Aggiunge una nuova funzione function y=senoquad(x) …. y=sin(x).^2

CONVERSIONE DI VARIABILI, VARIABILI SPECIALI E COSTANTI DOUBLE Converte doppia precisione ad=double(a) UINT8 Converte in interi a 8-bit senza segno au=uint8(a) LOGICAL Converte in variabile logica al=logical(a) NaN Not-a-Number Inf Infinito pi 3.1415926535897 i,j Unità immaginaria ISNAN Vero per Not-a-Number (NaN) Na=isnan(y) ISINF Vero per Infinito (Inf) In=isinf(y) ISEMPTY Vero per array vuoto Is=isempty(y)

FUNZIONI MATEMATICHE E CALCOLO DIFF Differenza e derivata approssimata d=diff(y) SUM Somma di elementi s=sum(a) ABS Valore assoluto e modulo y=abs(x) SIGN Funzione segno s=sign(x) ROUND Arrotonda all’intero più vicino r=round(y) GRADIENT Valuta il gradiente di una matrice [gx,gy]=gradient(I,n) TRAPZ Integrazione numerica trapezoidale in=trapz(a) CUMSUM Somma cumulativa di elementi cs=cumsum(a) CUMTRAPZ Integrazione numerica trapezoidale cumulativa inc=cumtrapz(a) DET Determinante d=det(a) EIG Autovalori ed autovettori [va,ve]=eig(a) ATAN2 Tangente inversa a 4 quadranti a=atan2(num,den) CART2POL Da coordinate cartesiane a polari [t,r]=cart2pol(x,y) DOT Prodotto scalare di 2 vettori sc=dot(v1,v2) CROSS Prodotto vettoriale di 2 vettori vp=cross(v1,v2)

INTERPOLAZIONE E APPROSSIMAZIONE DI DATI POLYFIT Approssima dei dati con un polinomio [c,s]=polyfit(y,x,n) POLYVAL Valuta il polinomio yp=polyval(s,xp) INTERP1 Interpolazione monodimensionale yi=interp1(x,y,xi,’linear’)

FUNZIONI PER L’ELABORAZIONE DI IMMAGINI IMREAD Carica una immagine imread(‘nome’) IMSHOW Visualizza una immagine imshow(img) IMPIXELINFO Visualizza le coordinate e le intensità dei pixel impixelinfo IMPROFILE Memorizza intensità e coordinate in punti di una im [x,y,I,xp,yp]=improfile(img, x, y) IMCROP Ritaglia un rettangolo di pixel da una immagine a1=imcrop(img, [x1 y1 Lx Ly]) IMROTATE Ruota l’immagine IR=imrotate(I,alfa,’bicubic’) IMRESIZE Ridimensiona l’immagine IS=imresize(I,k,’bicubic’) IS=imresize(I,[r c]) IMHIST Crea l’istogramma dell’immagine n=imhist(img) IMADJUST Corregge i valori di intensità dell’imagine IA=imadjust(I,[ai bi],[af bf],g) HISTEQ Aumenta il contrasto usando l’istogramma IH=histeq(I) MEDFILT2 Esegue il filtro mediano su una immagine af=medfilt2(a,[m n]) af=medfilt2(a,s) EDGE Determina i contorni di oggetti nell’immagine E=edge(I) RGB2GRAY Trasforma l’immagine a colori in immagine a toni di grigio IG=rgb2gray(I) IM2DOUBLE Trasforma l'immagine in classe double scalando i valori Id=im2double(Iu) IMBINARIZE Rende l’immagine binaria (o logica) BW=imbinarize(I,s) BWPERIM Determina il perimetro di oggetti in immagini binarie BP=bwperim(BW) BWMORPH Esegue operazioni morfologiche su immagini binarie BP=bwmorph(BW,’erode’,n) IMFILL Riempie di bianco zone nere di immagini binarie BF=imfill(BW,[y x])

Page 10: INTRODUZIONE AL MATLAB · 2019-11-05 · G. Petrucci “Laboratorio di elaborazione delle immagini” 2 Le variabili stringa servono a memorizzare parole e caratteri e sono utili

G. Petrucci “Laboratorio di elaborazione delle immagini”

10

COMANDI DI TIPO GENERALE HELP Aiuto in-linea, visualizza il testo di aiuto HELP, da sola, lista tutti gli argomenti principali di aiuto. Ciascun argomento pricipale corrisponde al nome di una directory nel MATLABPATH. matlab\general - Comandi per scopi Generali.

matlab\ops - Operatori e caratteri speciali.

matlab\lang - Costrutti del languaggio di Programmazione.

matlab\elmat - Matrici elementari e manipulazione di matrici.

matlab\elfun - Funzioni matematiche Elementari.

matlab\specfun - Funzioni matematiche Specializzate.

matlab\matfun - Funzioni di matrici - algebra lineare numerica.

matlab\datafun - Analisi dei data e trasformate di Fourier.

matlab\polyfun - Interpolazione e polinomi.

matlab\graphics - Handle Graphics.

matlab\graph2d - Grafica bidimensionale.

matlab\graph3d - Grafica tridimensional.

matlab\iofun - File input/output.

matlab\strfun - Stringhe di caratteri.

matlab\datatipi - Tipi di dati e strutture.

matlab\funfun - Funzioni di funzioni e solutori ODE.

matlab\sparfun - Matrici sparse.

HELP ARGOMENTO fornisce aiuto sull’argomento specificato. L’argomento può essere il nome di un istruzione, un nome di directory, o un nome di percorso parziale MATLABPATH (vedi HELP PARTIALPATH). Se l’argomento è il nome di una istruzione, AIUTO visualizza informazioni sull’istruzione. Se ARGOMENTO è un nome di directory, AIUTO visualizza la Table-Of-Contents per la directory specificata. Ad esempio, HELP GENERAL e HELP MATLAB/GENERAL listano la Table-Of-Contents per le directory toolbox/matlab/general. HELP FUN visualizza l’aiuto per la funzione FUN. CLEAR Cancella variabili e funzioni da memoria. CLEAR rimuove tutte le variabili dalla memoria. CLEAR VAR1 VAR2 ... rimuove le variabili specificate. CLC Cancella la finestra dei comandi CLC cancella la finestra dei comandi e posiziona il cursore in alto a sinistra. SAVE Salva le variabili in memoria sul disco. SAVE FILENAME salva tutte le variabili in memoria in un "MAT-file" binario nominato FILENAME.mat. I dati possono essere ricaricati con LOAD. Se FILENAME non ha estensioni, è assunta l’estensione “.mat”. SAVE, da sola, crea il "MAT-file" binario nominato 'matlab.mat'. SAVE FILENAME X salva solo X. SAVE FILENAME X Y Z salva X, Y, e Z. Può essere utilizzata la wildcard '*' per salvare tutte le variabili che hanno in comune alcune lettere (es. save prova a* b*). LOAD Carica le variabili dal disco. LOAD FILENAME ricarica tutte le variabili da un file dato l’intero percorso o un percorso parziale relativo MATLABPATH (vedere PARTIALPATH). Se FILENAME non ha estensione, LOAD cerca FILENAME e FILENAME.mat e lo tratta come un "MAT-file" binario. Se FILENAME ha un’estensione diversa da .mat, è trattato come ASCII. LOAD, da sola, carica il "MAT-file" binario nominato 'matlab.mat'. Dà un errore 'matlab.mat' non viene trovato. LOAD FILENOME X carica solamente X. LOAD FILENOME X Y Z ... carica solo le variabili specificate. La wildcard '*' loads variabili che match a pattern (MAT-file solamente). LOAD -ASCII FILENAME o LOAD -MAT FILENAME forza LOAD a trattare il file come either un file ASCII o un file MAT senza tenere conto dell’estensione. Con -ASCII, LOAD darà errore se il file non è numerico text. Con -MAT, LOAD darà errore se il file non è un file MAT generato da SAVE -MAT. WHOS Lista le variabili WHOS lista tutte le variabili nella memoria, insieme con informazioni circa la loro dimensione, bytes, classe, etc.

Page 11: INTRODUZIONE AL MATLAB · 2019-11-05 · G. Petrucci “Laboratorio di elaborazione delle immagini” 2 Le variabili stringa servono a memorizzare parole e caratteri e sono utili

G. Petrucci “Laboratorio di elaborazione delle immagini”

11

OPERAZIONI ELEMENTARI SU MATRICI ONES Array di uno. ONES(N) è una matrice N-per-N di uno. ONES(M,N) o UNOS([M,N]) è una matrice M-per-N di uno. ONES(M,N,P,...) o UNOS([M N P ...]) è un array M-per-N- per -P- per -... di uno. ZEROS Array di zeri. ZEROS(N) è una matrice N-per-N di zeri. ZEROS(M,N) o ZEROS([M,N]) è una matrice M-per-N di zeri. ZEROS(M,N,P,...) o ZEROS([M N P ...]) è un array M-per-N-per-P-per-.... di zeri. REPMAT Replica un array. B=REPMAT(A,M,N) crea una grande matrice B costituita da M-per-N copie di A. Può essere scritta come B = REPMAT(A,[M N]). REPMAT(A,M,N) è comunemente utilizzata per produrre una matrice M-per-N riempita con il valore A, se A è uno scalare. Questo istruzione può essere molto più veloce di A*UNOS(M,N) quando M e/o N sono grandi. LINSPACE vettori spaziati linearmente. LINSPACE(X1, X2) genera un vettore riga di 100 punti egualmente spaziati tra X1 and X2. LINSPACE(X1, X2, N) genera N punti tra X1 e X2. For N<2, LINSPACE restituisce X2. MESHGRID X e Y arrays per grafici 3-D. [X,Y]=MESHGRID(x,y) trasforma il dominio specificato dai vettori x e y negli arrays X e Y che possono essere utilizzati per la valutazione di funzioni di due variabili e il tracciamento di superfici 3-D. Le righe dell’array di uscita X sono copie del vettore x e le colonne dell’array di uscita Y sono copie del vettore y. [X,Y] = MESHGRID(x) è un abbreviazione per [X,Y] = MESHGRID(x,x). [X,Y,Z] = MESHGRID(x,y,z) produce arrays 3-D che possono essere utilizzati per valutare funzioni di tre variabili e grafici volumetrici 3-D. Ad esempio, per valutare la funzione z=x*exp(-x2-y2) nell’intervallo -5<x<5, -5<y<5, [X,Y] = meshgrid(-5:.1:5, -5:.1:5); Z = X .* exp(-X.^2 - Y.^2); mesh(Z) RAND Numeri aleatori (random) uniformemente distribuiti RAND(N) è una matrice N-per-N con valori aleatori scelti da una distribuzione uniforme nell’intervallo 0.0÷1.0. RAND(M,N) e RAND([M,N]) sono matrici M-per-N con valori aleatori. Esempio: r=rand(5)*20-10 fornisce una matrice 5 per 5 di numeri reali compresi tra –10 e 10; r=round(rand(4,6)*5)+5 fornisce una matrice 4 per 6 di numeri interi compresi tra 5 e 10. SIZE Dimensione di una matrice. D=SIZE(X), per matrici X M-per-N, restituisce il vettore riga D=[M, N] contenente il numero di righe e colonne nella matrice. Per arrays N-Dimensionali, SIZE(X) restituisce un vettore 1-per-N contenente le lunghezze delle dimensioni. [M,N]=SIZE(X) restituisce il numero di righe e colonne di X in variabili di uscita separate. [M1,M2,M3,...,MN]=SIZE(X) restituisce la lunghezza delle prime N dimensioni di X. LENGTH Lunghezza di un vettore. LENGTH(X) restituisce la lunghezza del vettore X, ovvero la più grande delle dimensioni. È equivalente a MAX(SIZE(X)) per arrays non-vuoti e 0 per quelli vuoti. IND2SUB da indici lineari a indici multipli. IND2SUB è utilizzato per determinare il set di indici multipli equivalenti ai corrispondenti indici singoli di un array. [I,J] = IND2SUB(SIZ,IND) restituisce gli arrays I e J contenenti i indici riga e colonna corrispondenti agli indici IND per una matrice di dimensione SIZ. SUB2IND da indici multipli ad indici lineari. SUB2IND è utilizzato per determinare l’indice singolo corrispondente ad un set di indici multipli di un array. IND = SUB2IND(SIZ,I,J) restituisce l’indice lineare equivalente agli indici riga I e colonna J nell’array per una matrice di dimensione SIZ. FIND Trova gli indici di elementi diversi da zero. I = FIND(X) restituisce gli indici degli elementi del vettore X che sono non-zero. Ad esempio, I = FIND(A>100), restituisce gli indici degli elementi di A maggiori di 100. [I,J] = FIND(X) restituisce gli indici della riga e della colonna degli elementi non nulli nella matrice X.

Page 12: INTRODUZIONE AL MATLAB · 2019-11-05 · G. Petrucci “Laboratorio di elaborazione delle immagini” 2 Le variabili stringa servono a memorizzare parole e caratteri e sono utili

G. Petrucci “Laboratorio di elaborazione delle immagini”

12

MAX Elemento più grande. Per i vettori, MAX(X) è l’elemento più grande in X. Per le matrici, MAX(X) è un vettore riga contenente il massimo elemento da ciascun colonna. Per ottenere il massimo assoluto si deve scrivere M=MAX(X(:)). [Y,I]=MAX(X) restituisce nel vettore I gli indici dei massimi valori. Se ci sono più valori pari al massimo viene restituito l’indice del primo. Quando l’array è complesso, è utilizzata la grandezza MAX(ABS(X)). Nel calcolo del massimo i valori NaN's vengono ignorati. MIN Elemento più piccolo. Per i vettori, MIN(X) è il più piccolo elemento in X. Per le matrici, MIN(X) è un vettore riga contenente the minimo elemento da ciascun colonna. Per ottenere il minimo assoluto si deve scrivere m=MIN(X(:)) [Y,I]=MIN(X) restituisce nel vettore I gli indici del minimi valori. Se ci sono più valori pari al minimo viene restituito l’indice del primo. Quando l’array è complesso, è utilizzata la grandezza MIN(ABS(X)). Nel calcolo del minimo i valori NaN's vengono ignorati. MEAN Valore medio. Per i vettori MEAN(X) è la media degli elementi in X. Per le matrici, MEAN(X) restituisce un vettore riga contenente la media di ciascuna colonna. MEAN(X,DIM) esegue la media lungo la dimensione DIM di X. Eempio: se X=[0 1 2; 3 4 5] allora mean(X,1) è [1.5 2.5 3.5] e mean(X,2) è [1 4] SORT Ordina in ordine crescente. Per i vettori, SORT(X) ordina gli elementi di X in ordine crescente. Per matrici, SORT(X) ordina ciascuna colonna di X in ordine crescente. SORT(X,DIM) ordina lungo la dimensione DIM. [Y,I]=SORT(X) restituisce anche una matrice di indici I. Se X è un vettore, Y=X(I). Se X è una matrice m-per-n, allora for j=1:n, Y(:,j)=X(I(:,j),j); end Quando X è complesso, gli elementi sono ordinati mediante ABS(X). I complessi sono ulteriormente ordinati in base ad ANGLE(X). Quando più di un elemento ha lo stesso valore, l’ordine degli elementi nel risultato ordinato è preservato e gli indici di elementi uguali sarà crescente in qualsiasi matrice di indici. Esempio: If X=[3 7 5; 0 4 2] allora sort(X,1) è [0 4 2; 3 7 5] e sort(X,2) è [3 5 7; 0 2 4]; FLIPUD Inverte la posizione delle righe di una matrice (sposta gli elementi dall’alto in basso). Ad esempio X = 1 4 diventa 3 6 2 5 2 5 3 6 1 4 FLIPLR Inverte la posizione delle colonne di una matrice (sposta gli elementi da destra a sinistra). Ad esempio X = 1 2 3 diventa 3 2 1 4 5 6 6 5 4 RESHAPE Cambia le dimensioni. RESHAPE(X,M,N) restituisce una matrice M-per-N i cui elementi sono presi per colonne da X. Se X non ha M*N elementi si verifica un errore. RESHAPE(X,[M N]) oppure SIZ=[M N];RESHAPE(X,SIZ) è la stessa cosa. In generale, RESHAPE(X,SIZ) restituisce un array con gli stessi elementi di X, ma riarrangiati alla dimensione descritta dal vettore SIZ. Il prodotto delle dimensioni di X deve essere pari MxN o al prodotto degli elementi di SIZ. DIAG Matrici Diagonali e diagonale di una matrice. DIAG(V) se V è un vettore con N componenti, restituisce una matrice quadrata di ordine N con gli elementi di V nella diagonale, se V è una matrice quadrata non diagonale, restituisce una matrice diagonale dello stesso ordine con gli elementi della diagonale di V sulla diagonale. INV Matrice inversa. INV(X) è l’inversa della matrice quadrata X. Se X è malamente scalato o quasi singolare viene scritto un messaggio di avvertimento.

Page 13: INTRODUZIONE AL MATLAB · 2019-11-05 · G. Petrucci “Laboratorio di elaborazione delle immagini” 2 Le variabili stringa servono a memorizzare parole e caratteri e sono utili

G. Petrucci “Laboratorio di elaborazione delle immagini”

13

GRAFICI FIGURE Crea la finestra della figura. FIGURE, da sola, crea una nuova finestra per i grafici e restituisce il suo handle. FIGURE(H) rende “corrente” la figura H, la forza a diventare visibile e la pone in primo piano rispetto a tutte le altre figure sullo schermo. Se la figure H non esiste ed H è un intero, viene creata una nuova figura con handle H. PLOT Grafico cartesiano. PLOT(X,Y) realizza un grafico cartesiano tracciando il vettore delle odinate Y rispetto al vettore delle ascisse X. In paricolare vengono tracciati dei segmenti che unicono i punti le cui coordinate sono specificate nei vettori X ed Y. Se Y è una matrice, vengono tracciate tutte le colonne rispetto a X. Se X è una matrice, viene tracciato Y rispetto a le colonne di X. PLOT(Y) traccia le colonne di Y rispetto al loro indice. Se Y è complesso, PLOT(Y) è equivalente a PLOT(real(Y),imag(Y)). In tutti gli altri usi di PLOT, la parte immaginaria è ignorata.

Con PLOT(X,Y,S) possono essere ottenuti vari tipi di linea, simboli e colori di tracciamento; S è una stringa di caratteri scelti tra quelli mostrati nella tabella:

COLORE TRATTO b blue . point - solid g green o circle : dotted r red x x-mark -. dashdot c cyan + plus -- dashed m magenta * star v triangle (down) y yellow s quadrata ^ triangle (up) k black d diamond < triangle (left)

p pentagram > triangle (right) h hexagram

Ad esempio, PLOT(X,Y,'r:') traccia una linea di colore rosso (r) punteggiata (:) ; PLOT(X,Y,'bd') disegna un diamante blu per ciascun punto appartente ai dati ma non esegue il tracciamento della linea.

PLOT(X1,Y1,X2,Y2,X3,Y3…) disegna una linea per ciascuna coppia di vettori X-Y.

PLOT(X,Y,'LineWidth',n) utilizza l’opzione LineWidth, che deve essere posta alla fine dell’istruzione e assegna alle linee tracciate lo spessore specificato dal numero n (n intero≥1). AXIS Controlla la scala e il formato degli assi. AXIS([XMIN XMAX YMIN YMAX]) configura le scale degli assi x ed y sul grafico corrente. AXIS([XMIN XMAX YMIN YMAX ZMIN ZMAX]) configura le scale degli assi x, y e z sul corrente grafico 3D. AXIS EQUAL setta il rapporto di scala degli assi x ed y in modo che in un grafico gli incrementi sugli assi x ed y siano uguali. Questo fa in modo che SPHERE(25) abbia l’aspetto di una sfera, invece che un ellissoide. SUBPLOT Crea diversi assi in una figura. SUBPLOT(mnp), divide la finestra Figure in una matrice di m-per-n grafici, seleziona il grafico piesimo per il tracciamento. Il valore di p si assegna contando i grafici a partire dall’alto a sinistra e aumentando prima in base alla colonna e poi alla riga. Ad esempio, SUBPLOT(2,3,1), PLOT(income) divide la figura in 2*3=6 grafici disposti su 2 righe e 3 colonne e traccia il primo della prima riga SUBPLOT(2,3,5), PLOT(outgo) divide la figura in 2*3=6 grafici disposti su 2 righe e 3 colonne e traccia il secondo della seconda riga GRID Griglia di linee. GRID ON aggiunge una griglia di linee di riferimento agli assi correnti. GRID OFF rimuove la griglia. CLOSE Chiude le figure. CLOSE(H) Chiude la finestra con la figura numero H. CLOSE, da sola, chiude la finestra con la figura corrente (l’ultima figura selezionata o creata). CLOSE ALL chiude tutte le figure.

Page 14: INTRODUZIONE AL MATLAB · 2019-11-05 · G. Petrucci “Laboratorio di elaborazione delle immagini” 2 Le variabili stringa servono a memorizzare parole e caratteri e sono utili

G. Petrucci “Laboratorio di elaborazione delle immagini”

14

MESH Traccia una superficie 3-D a reticolo. MESH(X,Y,Z) traccia una superficie tridimensionale a reticolo di coordinate X, Y, Z, colorata con colori proporzionali al valore Z. Il punto di vista è specificato da VIEW. Gli assi sono determinate dagli intervalli di X, Y and Z, o dalla funzione AXIS. MESH(Z) usa x=1:n e y=1:m. In questo caso, l’altezza, Z, è una funzione ad un solo valore definita su una griglia rettangolare. MESH(X,Y,Z,C) traccia una superficie tridimensionale a reticolo colorata in modo parametrico definito da 4 matrici. La scala dei colori è determinata dall’intervallo di C, o dalla funzione CAXIS. VIEW specifica il punto di vista in grafici 3-D. VIEW(AZ,EL) e VIEW([AZ,EL]) determinano l’angolo di vista dal quale un osservatore vede il grafico 3-D corrente. AZ è l’azimuth o rotazione orizzontale e EL è l’elevazione verticale (entrambe in gradi). Azimuth ruota attorno all’asse z, con valori positivi indicanti rotazioni antiorarie del punto di vista. Valori positivi di elevazione corrispondono a muoversi sopra l’oggetto, valori negativi a muoversi sotto. VIEW([X Y Z]) setta l’angolo di vista in coordinate Cartesiane. L’ampiezza del vettore X,Y,Z viene ignorata. COLORMAP Setta la tabella dei colori nei grafici. COLORMAP (MAP) setta la tabella dei colori nella figura corrente a MAP. COLORMAP('gray') setta la tabella dei colori nella figura corrente a MAP alla tabella in toni di grigio. COLORMAP('default') setta la tabella dei colori nella figura corrente a MAP alla tabella di default denominata ‘jet’). XLABEL nomina l’asse X. XLABEL('text') aggiunge un testo accanto all’asse X negli assi currenti. YLABEL nomina l’asse Y. YLABEL('text') aggiunge un testo accanto all’asse Y negli assi currenti. LEGEND Crea la “legenda” del grafico. LEGEND(string1,string2,string3, ...) sovrappone una legenda sul grafico corrente usando le stringhe specificate come etichette. LEGEND lavora su grafici a linea, barre etc. LEGEND(...,Pos) posiziona la legenda in una posizione specificata: 0=miglior posizionamento automatico (least conflict con data) 1=Angolo superiore destro (default) 2=Angolo superiore sinistro 3=Angolo inferiore sinistro 4=Angolo inferiore destro -1 = Alla destra del grafico BAR Grafico a barre. BAR(X,Y) disegna le colonne della matrice Y M-per-N come M gruppi di N barre verticali. Il vettore X deve essere crescente o decrescente in modo monotono. BAR(Y) usa il valore X=1:M. Per vettori di ingresso, BAR(X,Y) o BAR(Y) traccia LENGTH(Y) barre. LOGLOG Grafico in coordinate Logaritmiche. LOGLOG(...) è lo stesso di PLOT(...), eccetto che vengono utilizzate scale logaritmiche per entrambi gli assi X ed Y. POLAR Grafico in coordinate polari. POLAR(THETA, RHO) esegue un grafico usando coordinate polari con l’angolo THETA, in radianti, rispetto al raggio RHO. POLAR(THETA,RHO,S) usa lo stile di linea specificato nella stringa S.

Page 15: INTRODUZIONE AL MATLAB · 2019-11-05 · G. Petrucci “Laboratorio di elaborazione delle immagini” 2 Le variabili stringa servono a memorizzare parole e caratteri e sono utili

G. Petrucci “Laboratorio di elaborazione delle immagini”

15

OPERATORI RELAZIONALI E LOGICI Operatori relazionali. Gli operatori relazionali servono a confrontare tra loro numeri o arrays. I sei operatori relazionali sono < minore, <= minore o uguale, > maggiore, >= maggiore o uguale, == uguale ~= non uguale. Ad esempio, A < B esegue elemento per elemento un confronto tra A e B e restituisce una matrice della stessa dimensione con elementi posti a 1 dove la relazione è vera ed elementi posti a 0 dove non lo è. A e B devono avere le stesse dimensioni, oppure uno dei due deve essere uno scalare. & Logico AND. A & B oppure and(A,B) è una matrice i cui elementi sono 1 dove A e B hanno entrambi elementi non-zero, e 0 dove almeno uno dei due ha un elemento nullo. A e B devono avere le stesse dimensioni (o uno può essere un scalare). | Logico O. A | B oppure or(A,B) è una matrice i cui elementi sono 1 dove o A, o B hanno un elemento non-zero, e 0 dove entrambi hanno elementi nulli. A e B devono avere le stesse dimensioni (o uno può essere uno scalare). ~ Complemento logico (NOT). ~A oppure not(a) è un matrice i cui elementi sono 1 dove A ha elementi zero, e 0 dove A ha elementi non-zero. xor O esclusivo. xor(A,B) è 1 dove A e B non sono entrambi uguali o diversi da zero, e 0 dove uno di due è zero e l’altro non-zero. ANY Vero se un elemento qualsiasi di un vettore è nonzero. ANY(V) Per vettori, restituisce 1 se uno qualsiasi degli elementi del vettore è non-zero, viceversa restituisce 0. Per matrici, ANY(X) opera sulle colonne di X, restituendo un vettore riga di 1 e 0. ANY(X,DIM) lavora sulla dimensione DIM. Per esempio ANY(X,1) lavora sulla prima dimensione di X, cioè le righe. ALL Vero se tutti gli elementi di un vettore sono nonzero. ALL(V) Per vettori, restituisce 1 se tutti gli elementi del vettore sono non-zero, viceversa restituisce 0. Per matrici, ANY(X) opera sulle colonne di X, restituendo un vettore riga di 1 e 0. ALL(X,DIM) lavora sulla dimensione DIM. Per esempio ANY(X,1) lavora sulla prima dimensione di X, cioè le righe. ISEMPTY Vero per array vuoto ISEMPTY(X) restituisce 1 se X è un array vuoto e 0 in caso contrario. Un array vuoto non ha nessun elemento, cioè size(X)=0, ovvero X=[]. Utile per verificare se la funzione FIND ha trovato o meno elementi… Esempio risultato a=[1 2 3 4]; b=[1 0 0 5]; c=a>b c=[0 1 1 0] c=a>=b c=[1 1 1 0] c=a==b c=[1 0 0 0] c=a&b c=[1 0 0 1] c=a|b c=[1 1 1 1] c=xor (a,b) c=[0 1 1 0] i=find(a) i=[1 2 3 4] i=find(b) i=[1 4] i=find(a>b) i=[2 3] i=find(a>=b) i=[1 2 3] i=find(a==b) i=[1] i=find(a&b) i=[1 4] i=find(a|b) i=[1 2 3 4] i=find(xor(a,b)) i=[2 3] any(b) 1 any(a) 1 all(b) 0 all(a) 1

Page 16: INTRODUZIONE AL MATLAB · 2019-11-05 · G. Petrucci “Laboratorio di elaborazione delle immagini” 2 Le variabili stringa servono a memorizzare parole e caratteri e sono utili

G. Petrucci “Laboratorio di elaborazione delle immagini”

16

ISTRUZIONI DI CONTROLLO IF/ELSEIF/ELSE Istruzione condizionale se/altrimenti se/altrimenti Permette che siano eseguite alcune istruzioni nei casi in cui (cioè se) vengono verificate certe condizioni, tipicamente costituite da relazioni tra variabili. La forma generale dell’istruzione IF è IF espressione Istruzioni ELSEIF espressione Istruzioni ELSE Istruzioni END

Le istruzioni vengono eseguite se la parte reale dell’espressione ha tutti elementi non-zero. L’espressione è usualmente una espressione relazionale della forma expr rop expr dove rop è un operatore relazionale del tipo ==, <, >, <=, >=, o ~=. Le parti ELSE ed ELSEIF sono opzionali. Esempio if I = = J A(I,J) = 2; elseif abs(I-J) == 1 A(I,J) = -1; else A(I,J) = 0; end Ricordarsi che I= =J coincide con il numero 1 se I=J e 0 se I≠J. L’esempio potrebbe anche essere scritto come: K=(I= =J); if K A(I,J)= 2. SWITCH/CASE/OTHERWISE Sceglie tra diversi casi in base ad una espressione . Permette che siano eseguite alcune istruzioni nei casi in cui una espressione assume certi valori. È una versione semplificata dell’istruzione IF, più adatta ai casi in cui la condizione da verificare è il fatto che una variabile assuma un certo valore a scelta tra un insieme. La forma generale dell’istruzione SWITCH è: SWITCH switch_expr CASE case_expr, istruzione, ..., istruzione CASE {case_expr1, case_expr2, case_expr3,...} istruzione, ..., istruzione OTHERWISE, istruzione, ..., istruzione END Vengono eseguiti i comandi seguenti il primo CASE per il quale la variabile case_expr verifica l’espressione switch_expr. Quando case_expr è un array (come nel secondo caso sopra), il case_expr verifica se un qualsiasi elemento dell’array verifica la switch-expression. Se nessuno dei case-expressions verifica la switch-expressione allora è eseguito il caso OTHERWISE (altrimenti). Viene eseguito solamente un CASE e l’esecuzione riprende con il primo comando dopo END. La switch_expr può essere uno scalare o una stringa. Uno scalare switch_expr verifica un case_expr se switch_expr==case_expr. Una stringa switch_expr verifica un case_expr se strcmp(switch_expr,case_expr) restituisce 1 (vera). Vengono eseguiti solamente i comandi tra il CASE verificante e il successivo CASE, OTHERWISE o END. Esempi:

method = 'Bilineare’; switch lower(method) case {'lineare’,'bilineare’};disp('Metodo lineare’) case 'cubico'; disp('Metodo cubico') otherwise; disp('Metodo sconosciuto') end Il risultato è “Metodo lineare”

c=0.5;d=1; a=sin(pi/2); switch (a); case(c); b=2; case(d); b=4; otherwise b=6; end Il risultato è b=4, essendo a=sin(pi/2)=1 e d=1;

Page 17: INTRODUZIONE AL MATLAB · 2019-11-05 · G. Petrucci “Laboratorio di elaborazione delle immagini” 2 Le variabili stringa servono a memorizzare parole e caratteri e sono utili

G. Petrucci “Laboratorio di elaborazione delle immagini”

17

FOR/END Ripete le istruzioni comprese tra FOR ed END un numero di volte specificato. La forma generale dell’istruzione FOR è: FOR I=A, istruzione, ..., istruzione; END

Se A è un vettore, le istruzioni comprese tra il FOR e l’END vengono eseguite un numero di volte pari alla lunghezza di A. Ogni esecuzione di tutte le istruzioni comprese tra FOR ed END si definisce iterazione o ciclo. Ad ogni iterazione alla variabile I viene assegnato il valore dell’elemento di A che si trova nella posizione corrispondente al numero dell’iterazione che si sta effettuando. Spesso A è nella forma X1:X2 per cui la variabile assume valori crescenti da X1 a X2 con incrementi unitari ad ogni iterazione. Ad esempio (si assuma che N ed M abbiano già un valore assegnato). FOR I = 1:N, FOR J = 1:M, A(I,J) = 1/(I+J-1); END END

In questo caso per ogni valore di I da 1 ad N viene effettuata una iterazione con J che va da 1 ad N. In totale vengono eseguite NxM iterazioni e vengono assegnati tutti i valori alla matrice A(N,M). I e J nel gergo informatico sono definiti contatori perché ad ogni iterazione assumono valore uguale al numero di conteggio dell’iterazione stessa. Spesso è opportuno che nel ciclo FOR/END una variabile assuma il ruolo di contatore. In questi due esempi le variabili utilizzate nel ciclo FOR non assumono il ruolo di contatore FOR S = 1.0: -0.1: 0.0; SS=S^2……. END passi con incrementi di -0.1 a=[1 5 7]: FOR J = a, ... END compie 3 passi dando a J i valori di a. per cui, se necessario, all’interno del ciclo dovrebbe essere introdotta una istruzione del tipo n=n+1, premettendo n=0 prima del FOR. n=0;FOR S = 1.0: -0.1: 0.0; n=n+1; SS=S^2……. END Sarebbe meglio scrivere così: S = 1.0: -0.1: 0.0;L=length(S); FOR k=1:L; SS=S(k)^2 ……. END WHILE Ripete le istruzioni comprese tra WHILE ed END mentre viene verificata una certa condizione. A differenza dell’istruzione FOR, l’istruzione WHILE viene utilizzata quando non si sa a priori quante iterazioni devono essere eseguite per conseguire il risultato che interessa. La forma generale dell’istruzione WHILE è:

WHILE espressione istruzioni END

Le iterazioni vengono eseguite mentre la parte reale dell’espressione ha tutti elementi non-zero (l’espressione è verificata) ovvero si può dire che iterazioni vengono eseguite fino a quando la parte reale dell’espressione ha tutti elementi zero (l’espressione non è più verificata). L’espressione è usualmente il risultato di una operazione relazionale tra 2 numeri o arrays, del tipo expr rop expr dove rop è ==, <, >, <=, >=, o ~=.

Ad esempio (assumendo A già definito):

E = 0*A; F = E + eye(size(E)); N = 1; while norm(E+F-E,1) > 0, E = E + F; F = A*F/N; N = N + 1; End BREAK Termina l’esecuzione dei cicli WHILE o FOR. Si utilizza per forzare l’uscita da un ciclo for o while nel caso in cui venga verificata una certa condizione. Dovrebbe essere utilizzata per casi particolari che possono accadere durante l’esecuzione, perché rende il programma meno leggibile. Esempi: for N=1:K; istruzioni; if N>1000; break;end; end while 1 istruzioni; if N>1000; break;end; end Nel secondo esempio il ciclo non si interromperebbe mai.

Page 18: INTRODUZIONE AL MATLAB · 2019-11-05 · G. Petrucci “Laboratorio di elaborazione delle immagini” 2 Le variabili stringa servono a memorizzare parole e caratteri e sono utili

G. Petrucci “Laboratorio di elaborazione delle immagini”

18

FUNCTION Aggiunge una nuova funzione. All’insieme di funzioni del MATLAB possono essere aggiunte ulteriori funzioni purchè costruite utilizzando funzioni e comandi già esistenti. I comandi e funzioni che sono compresi nella nuova funzione devono essere posti in un file con estensione '.m' il cui nome definisce il nome della nuova funzione. All’inizio del file deve essere posta una linea che contiene la sintassi della nuova funzione. Ad esempio, l’esistenza di un file chiamato STAT.M sul disco, scritto nel seguente modo: function [mean,stdev] = stat(x) %STAT funzione che fornisce statistiche utili (commento). n = length(x); mean = sum(x) / n; stdev = sqrt(sum((x - mean).^2)/n); definisce una nuova funzione chiamata STAT che calcola la media e la deviazione standard di un vettore. La nuova funzione può essere richiamata come una normale funzione matlab, ad esempio z=[1 5 7 10 12 3 6 7]; [m,s]=stat(z);

È importante notare che i nomi delle variabili utilizzate quando la funzione viene richiamata NON devono essere necessariamente uguali ai nomi delle variabili utilizzate all’interno della funzione nella sua definizione. Infatti, per richiamare una funzione è necessario conoscere quante variabili (e di che tipo) richiede e quante variabili (e di che tipo) restituisce, non come sono state chiamate al loro interno. In ingresso la funzione riceve i valori numerici assunti dalle variabili contenute tra parentesi tonde nell’espressione che

richiama la funzione, cioè [m,s]=stat(z), e li attribuisce alle variabili contenute tra parentesi tonde nella definizione della

funzione, cioè function [mean,stdev]=stat(x), per essere elaborati (in questo caso il valore di z viene assegnato alla variabile x). In uscita la funzione restituisce i valori assunti dalle variabili presenti nelle parentesi quadre della definizione (in questo esempio il valore numerico assunto da mean ed stdev) sostituendo tali valori nelle variabili presenti tra parentesi quadre nell’espressione che richiama la funzione (in questo esempio le variabili m ed s). Le variabili presenti all’interno del corpo della funzione sono tutte variabili locali, cioè non vengono viste dal programma che richiama la funzione, ma solo dalla funzione. In questo esempio, se nel programma chiamante è già presente una variabile n, essa non viene modificata, se non è presente non comparirà in memoria dopo l’esecuzione della funzione. CONVERSIONE DI VARIABILI, VARIABILI SPECIALI E COSTANTI DOUBLE Converte in doppia precisione. DOUBLE(X) converte gli elementi di un array X in elementi in doppia precisione. UINT8 Converte in interi a 8-bit senza segno. UINT8(X) converte gli elementi di un array X in interi a 8-bit senza segno. LOGICAL Converte in interi valori logici (pari a 0 o 1) LOGICAL(X) converte gli elementi di un array X in valori logici. NaN Not-a-Number. NaN è la rappresentazione aritmetica IEEE per Not-a-Number. Un NaN è ottenuto come risultato di una operazione matematicamente indefinita come zero su zero o infinito meno infinito. INF Infinito. INF restituisce la rappresentazione aritmetica IEEE per infinito positivo. Infinito è anche prodotto da operazionei come divisioni per zero, es. 1.0/0.0, o da overflow, es. exp(1000). pi 3.1415926535897 La costante pi greco i, j unità immaginaria Unità immaginaria, radice quadrata di -1 ISNAN Vero per Not-a-Number (NaN). ISNAN(X) restituisce un array che contiene 1 dove gli elementi di X sono NaN e 0 dove non lo sono. Ad esempio ISNAN([pi NaN Inf -Inf]) è [0 1 0 0]. ISINF Vero per infinito (Inf). ISNAN(X) restituisce un array che contiene 1 dove gli elementi di X sono Inf e 0 dove non lo sono. Ad esempio ISINF([pi NaN Inf -Inf]) è [0 0 1 1].

Page 19: INTRODUZIONE AL MATLAB · 2019-11-05 · G. Petrucci “Laboratorio di elaborazione delle immagini” 2 Le variabili stringa servono a memorizzare parole e caratteri e sono utili

G. Petrucci “Laboratorio di elaborazione delle immagini”

19

FUNZIONI MATEMATICHE E CALCOLO DIFF Differenza e derivata approssimata. DIFF(X), per un vettore X, è [X(2)-X(1) X(3)-X(2) ... X(n)-X(n-1)]. DIFF(X), per una matrice X, è una matrice di righe differenza, [X(2:n,:) - X(1:n-1,:)].

SUM Somma di elementi. SUM(X) per vettori, è la somma degli elementi di X. Per matrici, SUM(X) è un vettore riga con la somma su ciascuna colonna. SUM(X,DIM) calcola la somma lungo la dimensione DIM. Esempio: If X = [0 1 2; 3 4 5] allora sum(X,1) è [3 5 7] e sum(X,2) è [3; 12];

ABS Valore assoluto di numeri reali e il modulo di complessi. ABS(X) è il valore assoluto degli elementi di X. Se X è complesso restituisce il modulo.

SIGN Funzione segno. SIGN(X) per ciascun elemento di X, SIGN(X) restituisce 1 se l’elemento è maggiore di 0, 0 se è uguale a 0, -1 se è minore di 0. Per elementi complessi diversi da 0, SIGN(X) = X./ABS(X).

ROUND Arrotonda all’intero più vicino. ROUND(X) arrotonfda gli elementi di X al più vicino intero.

GRADIENT Gradiente approssimato. [FX,FY] = GRADIENT(F) restituisce il gradiente numerico della matrice F. FX corrisponde a dF/dx, le differenze in direzione x (colonne). FY corrisponde a dF/dy, le differenze in direzione y (colonne). La spaziatura tra i punti in ciascuna direzione è assunta pari ad uno. Quando F è un vettore, DF = GRADIENT(F) è il gradiente 1-D. [FX,FY] = GRADIENT(F,H), se H è uno scalare, usa H come spaziatura tra i punti in ciascuna direzione. [FX,FY] = GRADIENT(F,HX,HY), se F è 2-D, usa la spaziatura specificata da HX e HY. HX ed HY possono essere sia scalari per specificare la spaziatura tre le coordinate o vettori per specificare le coordinate dei punti. Se HX ed HY sono vettori, la loro lunghezza deve coincidere con la corrispondente dimensione di F.

TRAPZ Integrazione numerica trapezoidale. Z = TRAPZ(Y) calcola una approssimazione dell’integrale di Y tramite il metodo dei trapezi con spaziatura unitaria. Per calcolare l'integrale per spaziatura differente da uno, moltiplicare per l'incremento spaziale. Per vettori, TRAPZ(Y) è l’integrale di Y. Per matrici, TRAPZ(Y) è un vettore riga con gli integrali su ciascuna colonna. Z = TRAPZ(X,Y) calcola l’integrale di Y rispetto a X usando il metodo dei trapezi. X e Y devono essere vettori della stessa lunghezza, o X deve essere un vettore colonna e Y un array la cui prima dimensione è di lunghezza length(X). TRAPZ opera lungo questa dimensione. Z = TRAPZ(X,Y,DIM) o TRAPZ(Y,DIM) integra attraverso la dimensione DIM di Y. La lunghezza di X deve essere la stessa di size(Y,DIM)).

CUMSUM Somma cumulativa di elementi. CUMSUM(X) per vettori, è un vettore contenente la somma cumulativa degli elementi di X. Per matrici, CUMSUM(X) è una matrice della stessa dimensione di X contenente la somma cumulativa su ciascuna colonna. CUMSUM(X,DIM) lavora lungo la dimensione DIM. Esempio: If X = [0 1 2; 3 4 5] allora cumsum(X,1) è [0 1 2; 3 5 7] e cumsum(X,2) è [0 1 3; 3 7 12]

CUMTRAPZ Integrazione numerica trapezoidale cumulativa. Z = CUMTRAPZ(Y) calcola una approssimazione dell’integrale cumulativo di Y per mezzo il metodo dei trapezi (con unitaria spaziatura). Per calcolare l'integrale per spaziatura differente da uno, si deve moltiplicare per l'incremento spaziale. Per vettori, CUMTRAPZ(Y) è un vettore contenente l’integrale cumulativo di Y. Per matrici, CUMTRAPZ(Y) è una matrice della stessa dimensione di X con l’integrale cumulativo su ciascuna colonna. Z = CUMTRAPZ(X,Y) calcola l’integrale cumulativo of Y respetto a X il metodo dei trapezi. X e Y devono essere vettori della stessa lunghezza, o X deve essere un vettore colonna e Y un array la cui prima dimensione è di lunghezza length(X). CUMTRAPZ opera lungo questa dimensione.

DET Determinante. D=DET(X) è il determinante della matrice quadrata X. Usare COND invece di DET per saggiare la singolarità della matrice.

EIG Autovalori ed autovettori. [V,D] = EIG(X) E = EIG(X) è un vettore contenente gli autovalori della matrice quadrata X. [V,D] = EIG(X) produce una matrice diagonale D di autovalori e una matrice piena V le cui colonne sono i corrispondenti autovettori, tali che che X*V = V*D.

Page 20: INTRODUZIONE AL MATLAB · 2019-11-05 · G. Petrucci “Laboratorio di elaborazione delle immagini” 2 Le variabili stringa servono a memorizzare parole e caratteri e sono utili

G. Petrucci “Laboratorio di elaborazione delle immagini”

20

ATAN2 Tangente inversa a 4 quadranti. A=ATAN2(Y,X) è l’arctangente a 4 quadranti della parte reale degli elementi di Y/X con Y=sen e X=cos. Il valore restituito dalla funzione è -π≤ATAN2(Y,X)≤π. Si differenzia da ATAN perché considera il segno del seno e del coseno e non il segno risultante del rapporto.

CART2POL Trasforma coordinate da Cartesiane a polari. [T,R]=CART2POL(X,Y) trasforma elementi di dati immagazzinati in coordinate Cartesiane X,Y nelle corrispondenti coordinate polari (angolo T e raggio R). T è espresso in radianti.

DOT Prodotto scalare di vettori sc=DOT(V1,V2) effettua il prodotto scalare dei vettori V1 e V2. V1 e V2 devono avere la stessa dimensione. Se i vettori sono entrambi colonne, l’istruzione eseguita da DOT è: sc=V1′*V2.

CROSS Prodotto vettoriale di vettori V=CROSS(V1,V2) effettua il prodotto vettoriale dei vettori V1 e V2. V1 e V2 devono essere vettori tridimensionali. INTERPOLAZIONE E APPROSSIMAZIONE DI DATI POLYFIT Approssima dei dati con un polinomio. POLYFIT(X,Y,N) trova i coefficienti di un polinomio P(X) di grado N che approssima i dati, P(X(I))~=Y(I), nel senso dei minimi quadrati. [P,S]=POLYFIT(X,Y,N) restituisce i coefficienti del polinomio in P e una struttura S da usare con POLYVAL per ottenere una stima dell’errore sulla predizione. La struttura S contiene il fattore di Cholesky della matrice di Vandermonde (R), il grado di libertà (df), e la norma dei residui (normr) come campi. x=0:.1:pi;y=sin(x); C=polyfit(x,y,3) C = -0.0030 -0.4011 1.2856 -0.0392 yp=-.003*(x.^3)-.4011*(x.^2)+1.2856*(x)-.00392; figure(1); plot(x,y,x,yp) yp=polyval(C,x); figure(2); plot(x,y,x,yp) POLYVAL Valuta un polinomio. Y=POLYVAL(P,X), quando P è un vettore di lunghezza N+1 i cui elementi sono i coefficienti di un polinomio, Y è il valore del polinomio in X . Se X è una matrice o un vettore, il polinomio è valutato in tutti i punti in X. La funzione Y=POLYVAL(P,X) corrisponde a Y = P(1)*X^N + P(2)*X^(N-1) + ... + P(N)*X + P(N+1) INTERP1 Interpolazione monodimensionale. YI = INTERP1(X,Y,XI) interpola i dati per trovare i valori YI, cioè i valori della funzione Y nei punti del vettore XI. Il vettore X specifica le ascisse nelle quali si trovano i dati Y. Se Y è una matrice, l’interpolazione è effettuata per ciascun colonna di Y e YI sarà length(XI)-per-size(Y,2). YI = INTERP1(Y,XI) assume X=1:N, dove N è length(Y) per vettore Y o SIZE(Y,1) per matrice Y. YI = INTERP1(X,Y,XI,'method') specifica methodi alternatvi. La default è l’interpolazione lineare. Metodi disponibili sono: 'nearest' interpolazione al più vicino intorno. 'linear' interpolazione lineare 'spline’ interpolazione piecewise spline cubica (SPLINEA) 'pchip' interpolazione piecewise cubica di Hermite (PCHIP) 'cubic' come 'pchip' 'v5cubic' interpolazione cubica da MATLAB 5, che non estrapola e usa 'spline’ se X non è equispaziato. Ad esempio, genera a curva sinosuidale grossolana e interpola su una ascissa più fine con interp1 e polyfit: x = 0:10; y = sin(x); xi = 0:.25:10; yi1= interp1(x,y,xi); yi2= interp1(x,y,xi,’spline’); figure(1);subplot (2,1,1);plot(x,y,'o',xi,yi1);subplot (2,1,2);plot(x,y,'o',xi,yi2) [P,S] = polyfit(x,y,3); yp1=polyval(P,xi);[P,S] = polyfit(x,y,8); yp2=polyval(P,xi); figure(2);subplot (2,1,1);plot(x,y,'o',xi,yp1);subplot (2,1,2);plot(x,y,'o',xi,yp2)

Page 21: INTRODUZIONE AL MATLAB · 2019-11-05 · G. Petrucci “Laboratorio di elaborazione delle immagini” 2 Le variabili stringa servono a memorizzare parole e caratteri e sono utili

G. Petrucci “Laboratorio di elaborazione delle immagini”

21

FUNZIONI PER L’ELABORAZIONE DI IMMAGINI IMPROFILE rileva i valori d’intensità lungo una linea o un percorso a più linee in un'immagine. IMPROFILE seleziona punti equidistanti lungo il percorso specificato ed usa l'interpolazione per determinare il valore d’intensità per ogni punto. IMPROFILE funziona con immagini a toni di grigio ed immagini RGB. Se si usa IMPROFILE con una di queste sintassi, essa opera in modo interattivo sull'immagine negli assi correnti: C = IMPROFILE C = IMPROFILE(N) N specifica il numero di punti in cui valutare i valori di intensità. Se non si fornisce questo valore, IMPROFILE sceglie un valore N approssimativamente uguale al numero di pixel attraversato dal percorso. La linea o il percorso si seleziona lusando il mouse, ciccando i punti sull'immagine. Premere <INVIO> o <CANC> per rimuovere il punto precedentemente selezionato. Uno shift-click, right-click, or double-click aggiunge un punto finale e conclude la selezione; la pressione di <INVIO> termina la selezione senza aggiungere un punto. Quando la selezione dei punti viene terminata, IMPROFILE restituisce i valori interpolati dei dati in C. C è un vettore N-by-1 se l'ingresso è un'immagine monocromatica, o una matrice Nx1x3 se è un’immagine RGB. Se si omette la variabile di uscita, IMPROFILE visualizza un diagramma dei valori d’intensità. Se il percorso specificato consiste di singolo segmento di retta, IMPROFILE genera un diagramma bidimensionale dei valori di intensità rispetto alla distanza lungo il segmento; se il percorso consiste di due o più segmenti, IMPROFILE genera un diagramma tridimensionale dei valori di intensità rispetto alle loro coordinate x e y. Si può specificare il percorso in modo non interattivo, usando queste sintassi: C = IMPROFILE(I,xi,yi) C = IMPROFILE(I,xi,yi,N) xi and yi sono vettori di uguale lunghezza che specificano le coordinate spaziali dei punti estremi dei segmenti.

Si possono usare queste sintassi per ottenere informazioni addizionali: [CX,CY,C] = IMPROFILE(...) [CX,CY,C,xi,yi] = IMPROFILE(...) CX e CY sono vettori di lunghezza N, contenenti le coordinate spaziali dei punti ai quali vengono valutati i valori di intensità.

[...] = IMPROFILE(...,METODO) usa il metodo di interpolazione specificato. METODO è una stringa che può assumere i seguenti valori: 'nearest' usa l’interpolazione “intorno più vicino” (default) 'bilinear' usa l’interpolazione bilineare 'bicubic' usa l’interpolazione bicubica Se si omette METODO, IMPROFILE usa il metodo del 'più vicino'. L’immagine di ingresso può essere del tipo uint8, uint16, or double. Tutti gli altri ingressi sono di tipo double. Esempio I = imread('alumgrns.tif'); x = [35 338 346 103]; y = [253 250 17 148]; improfile(I,x,y), grid on IMCROP Ritaglia l’immagine. IMCROP ritaglia l’immagine ad un rettangolo specificato. Nella sintassi sotto, IMCROP mostra l’immagine di ingresso e attende che venga assegnato il rettangolo di ritaglio con il mouse: I2 = IMCROP(I);RGB2 = IMCROP(RGB); Se si omettono gli argomenti di ingresso, IMCROP opera interattivamente sull'immagine negli assi correnti. Per specificare il rettangolo da ritagliare: usando un mouse a 2 o 3 tasti, premere il tasto di sinistra e trascinare per definire il rettangolo da ritagliare. Terminare lasciando il tasto del mouse. Se si mantiene il tasto shift mentre si trascina, o se si preme il tasto di destra, IMCROP costringe il rettangolo delimitante a diventare un quadrato. Quando si libera il tasto del mouse, IMCROP restituisce l'immagine ritagliata nella variabile di uscita. Se non si specifica la variabile di uscita, IMCROP visualizza l'immagine in una nuova figura. Si può specificare il rettangolo da ritagliare in modo non interattivo, usando queste sintassi: I2 = IMCROP(I,RECT); RGB2 = IMCROP(RGB,RECT)

RECT è a vettore a 4 elementi nella forma [XMIN YMIN LARGHEZZA ALTEZZA]; questi valori sono specificati in coordinate spaziali. Poiché RECT è specificato in termini di coordinate spaziali, la LARGHEZZA e l'ALTEZZA di RECT non corrispondono sempre esattamente al formato dell'immagine di uscita. Per esempio, si supponga che RECT sia [20 20 40 30], usando il sistema di coordinate spaziali predefinito. L’angolo superiore sinistro del rettangolo specificato è il centro del pixel (20,20) ed l’angolo inferiore destro è il centro del pixel (50,60). L'immagine risultante di uscita è 31x41, non 30x40, affinché l'immagine di uscita includa tutti i pixel specificati nell'ingresso, che sono inclusi nel rettangolo completamente o parzialmente. L'immagine di ingresso può essere di categoria uint8, uint16, o double. L'immagine di uscita è della stessa categoria di quella di ingresso, mentre RECT è sempre double.

Esempio: I=imread('ic.tif'); I2 = imcrop(I,[60 40 100 90]); imshow(I), figure, imshow(I2)

Page 22: INTRODUZIONE AL MATLAB · 2019-11-05 · G. Petrucci “Laboratorio di elaborazione delle immagini” 2 Le variabili stringa servono a memorizzare parole e caratteri e sono utili

G. Petrucci “Laboratorio di elaborazione delle immagini”

22

IMROTATE ruota l’immagine B=IMROTATE(A,ANGLE,METHOD) ruota l’immagine A di una quantità pari ad ANGLE espresso in gradi, in direzione positiva antioraria, usando il metodo di interpolazione specificato dalla stringa METHOD. 'nearest' interpolazione utilizzando il valore del pixel più vicino (default) 'bilinear' interpolazione bilineare 'bicubic' interpolazione bicubica IMRESIZE ridimensiona l’immagine B = IMRESIZE(A, SCALE,METHOD) restituisce un immagine che ha SCALE volte la dimensione dell’immagine A, usando il metodo di interpolazione specificato dalla stringa METHOD. 'nearest' interpolazione utilizzando il valore del pixel più vicino (default) 'bilinear' interpolazione bilineare 'bicubic' interpolazione bicubica B = IMRESIZE(A, [NUMROWS NUMCOLS],METHOD) ridimensiona l’immagine in modo che abbia un numero di righe paria a NUMROWS un numero di colonne pari a NUMCOLS. IMHIST valuta e/o mostra l’istogramma dell’immagine IMHIST(I) mostra l’istogramma dell’immagine I. Se I è un’immagine a toni di grigio IMHIST usa 256 livelli, se è binaria ne usa 2. [COUNTS,X]=imhist(...) restituisce i conteggi dell’istogramma in COUNTS i valori dei livelli in X, in modo tale che stem(X,COUNTS) mostra l’istogramma. Esempio: figure(1);imhist(I); [h,g]=imhist(I);figure(2);stem(g,h); IMADJUST regola i valori di intensità o la colormap dell’immagine. J = IMADJUST(I, [LOW_IN HIGH_IN], [LOW_OUT HIGH_OUT], GAMMA) trasforma i valori di intensità in modo che ai valori compresi fra HIGH_IN e di LOW_IN in I, corrispondano valori compresi fra LOW_OUT e HIGH_OUT IN J. I valori sotto LOW_IN e sopra HIGH_IN vengono tagliati; cioè i valori sotto LOW_IN sono settati a LOW_OUT quelli sopra HIGH_IN sono settati ad HIGH_OUT. Si può usare un vettore vuoto ([ ]) per [LOW_IN HIGH_ IN] o per [LOW_OUT HIGH_OUT] per imporre il valore [0 1]. Il GAMMA specifica la forma della curva che descrive il rapporto fra i valori in I e J, cioè (J/Jmax)=(I/Imax)GAMMA. Se GAMMA è minore di 1, le intensità dell’immagine J assumono valori più elevati (più luminosi) e viceversa. Se si omette il GAMMA esso viene posto pari a 1 (trasformazione lineare). RGB2 = IMADJUST(RGB1...) effettua la regolazione su ogni piano dell’immagine RGB1 (rosso, verde e blue). Si può applicare una regolazione differente per ciascun piano. Si noti che se HIGH_OUT<LOW_OUT, l'immagine di uscita è invertita, come in un negativo fotografico. La funzione STRETCHLIM può essere usata con IMADJUST per applicare un aumento del contrasto valutato automaticamente, Esempi I = imread('pout.tif'); J = imadjust(I,[0.3 0.7],[]); imshow(I), figure, imshow(J) RGB1 = imread('flowers.tif'); RGB2 = imadjust(RGB1,[.2 .3 0; .6 .7 1],[]); imshow(RGB1), figure, imshow(RGB2) HISTEQ Aumenta il contrasto utilizzando l’equalizzazione dell’istogramma. HISTEQ aumenta il contrasto delle immagini trasformando i valori di intensità in modo che l'istogramma dell'immagine di uscita sia simile ad un istogramma specificato. J = HISTEQ(I, HGRAM) trasforma l'immagine I in modo che l'istogramma dell'immagine di uscita J abbia un istogramma simile ad HGRAM. Gli elementi del vettore HGRAM devono contenere conteggi interi di pixel corrispondenti a valori di intensità equidistanti nell’intervallo appropriato per il tipo di immagine: [0÷1] per le immagini double, [0÷255] per le immagini uint8 e [0÷65535] per immagini uint16. HISTEQ regola automaticamente HGRAM in modo che sum(HGRAM)=prod(size(I)). L'istogramma di J risulta più simile ad HGRAM quando length(HGRAM) è molto più piccolo del numero di livelli discreti in I. J = HISTEQ(I, N) trasforma l'immagine I, restituendo un'immagine J con N livelli di intensità. A ciascuno degli N livelli in J viene assegnato un numero approssimativamente uguale di pixel, di modo che l'istogramma di J risulti approssimativamente piatto. (l'istogramma di J è più piatto quando N è molto più piccolo del numero di livelli discreti in I.) Il valore iniziale per N è 64. [J,T] = HISTEQ(I) restituisce la trasformazione di scala di grigio che mappa i livelli di grigio nell'immagine I ai livelli di grigio in J. Esempio: I = imread('tire.tif'); J = histeq(I); imshow(I), figure, imshow(J)

Page 23: INTRODUZIONE AL MATLAB · 2019-11-05 · G. Petrucci “Laboratorio di elaborazione delle immagini” 2 Le variabili stringa servono a memorizzare parole e caratteri e sono utili

G. Petrucci “Laboratorio di elaborazione delle immagini”

23

MEDFILT2 effettua il filtraggio mediano 2-D. B=MEDFILT2(A, [M N ]) effettua il filtraggio mediano bidimensionale della matrice A. Ogni pixel dell'uscita contiene il valore mediano valutato in un intorno (finestra) M-N del pixel corrispondente nell'immagine di ingresso. B=MEDFILT2(A) effettua filtraggio mediano bidimensionale della matrice A usando una finestra 3-by-3. Nel suo funzionamento predefinito MEDFILT2 riempie i contorni estremi dell'immagine con degli zeri. B=MEDFILT2(...,PADOPT) controlla il modo in cui i confini della matrice vengono riempiti. PADOPT può essere ‘zeros’ (il predefinito), 'symmetric', o 'indexed'. Se PADOPT è 'zeros', i contorni di A sono riempiti con zeri. Se PADOPT è 'symmetric', A è estesa simmetricamente ai contorni. Se PADOPT è 'indexed', A è riempito con uno se è double; altrimenti è riempito con zeri. L'immagine di ingresso A può essere tipo uint8, uint16, o double. L'immagine B di uscita è dello stesso tipo di A Esempio: I = imread('eight.tif');J = imnoise(I,'salt & pepper',0.02); K = medfilt2(J); imshow(J), figure, imshow(K) EDGE trova i contorni degli oggetti nell’immagine. BW=EDGE(I,METHOD) restituisce un'immagine binaria BW dello stesso formato della I, con i pixel dove la funzione trova i contorni posti ad 1 e 0 altrove. EDGE supporta sei differenti metodi di individuazione dei contorni. I metodi di Sobel, Prewitt e Roberts determinano i contorni usando un'approssimazione alle derivate e restituiscono i contorni in quei punti in cui il gradiente di I è massimo. Il metodo del Laplaciano di gaussiana trova i contorni cercando gli attraversamenti dello zero dopo avere effettuato il filtraggio della I con il filtro del Laplaciano di gaussiana. Il metodo zero-cross trova i contorni cercando gli attraversamenti dello zero dopo avere effettuato il filtraggio della I con un filtro specificato. Il metodo di Canny trova i contorni cercando i massimi locali del gradiente di I. Il gradiente è calcolato usando la derivata di un filtro gaussiano. Il metodo usa due soglie, per rilevare i contorni forti e deboli ed include i contorni deboli nell'uscita soltanto se sono collegati a contorni forti. Questo metodo è quindi meno incline degli altri ad “essere imbrogliato” dal rumore e più efficace nel rilevare contorni deboli “veri”. I parametri che possono essere forniti differiscono a seconda del metodo specificato. Se non si specifica un metodo, EDGE utilizza il metodo di Sobel. Metodi di Sobel-Prewitt-Roberts- Laplaciano di Gaussiana BW=EDGE(I,METHOD) specifica il metodo da utilizzare. METHOD è una stringa che può assumere i valori ‘Sobel’. ‘Prewitt’, ‘Roberts” o “Log”. BW=EDGE(I,METHOD,THRESH) specifica la soglia di sensibilità per il metodo. EDGE ignora tutti I contorni che non sono pià forti di THRESH. Se non si specifica THRESH, o se THRESH è vuoto ([]), EDGE sceglie il valore di soglia automaticamente. [BW,thresh] = EDGE(I,METHOD,...) restituisce il valore di soglia. Per i metodi Sobel-Prewitt-Roberts BW=EDGE(I,METHOD,THRESH,DIRECTION) specifica la direzionalità per il metodo. DIRECTION è una stringa specificante se cercare contorni 'horizontal' o 'vertical' o 'both' (predefinito). Per il metodo Laplaciano di Gaussiana BW = EDGE(I,'log',THRESH,SIGMA) specifica il valore SIGMA come deviazione standard del filtro logaritmico. Il valore predefinito di SIGMA è 2; l’ampiezza del filtro è N-by-N, dove N=CEIL(SIGMA*3)*2+1. Metodo Zero-cross BW=EDGE(I,'zerocross',THRESH,H) specifica il metodo zero-cross, utilizzando il filtro specificato H. Se THRESH è vuoto ([ ]), EDGE sceglie il valore di soglia automaticamente. [BW,THRESH] = EDGE(I,'zerocross',...) restituisce il valore di soglia. Metodo di Canny BW= EDGE(I,'canny') specifica il metodo di Canny. BW=EDGE(I,'canny',THRESH) specifica la soglia di sensibilità per il metodo di Canny. THRESH è un vettore di due elementi nel quale il primo elemento è la soglia inferiore e il secondo è la soglia superiore. Se si specifica uno scalare come THRESH, questo valore viene usato come soglia superiore e 0.4*THRESH viene usato come soglia inferiore. Se non si specifica THRESH, o se THRESH è vuoto ([]), EDGE sceglie i valori di soglia automaticamente. BW = EDGE(I,'canny',THRESH,SIGMA) specifica il metodo di Canny, usando SIGMA come deviazione standard del filtro Gaussiano. Il SIGMA predefinito è 1; la dimensione del filtro è scelto automaticamente in base a SIGMA. [BW,thresh] = EDGE(I,'canny',...) restituisce i valori di soglia come vettore a 2 elementi. I può essere di tipo uint8, uint16, o double. BW è di tipo uint8. Per i metodi 'log' e 'zerocross', se si specifica una soglia di 0, l’immagine di uscita ha contorni chiusi, perché include tutti gli attraversamenti dello zero nell’immagine di ingresso. Esempio I = imread('rice.tif'); BW1 = edge(I,'prewitt'); BW2 = edge(I,'canny'); imshow(BW1);figure, imshow(BW2)

Page 24: INTRODUZIONE AL MATLAB · 2019-11-05 · G. Petrucci “Laboratorio di elaborazione delle immagini” 2 Le variabili stringa servono a memorizzare parole e caratteri e sono utili

G. Petrucci “Laboratorio di elaborazione delle immagini”

24

RGB2GRAY Converte l’immagine RGB in un’immagine in livelli di grigio. IG=RGB2GRAY(I) converte l’immagine a colori I nell’immagine a toni di grigio IG. IM2DOUBLE Converte l’immagine in immagine in doppia precisione. I2=im2double(I1) converte l'immagine di intensità I1 a doppia precisione scalando i dati se necessario. IMBINARIZE Converte l’immagine in binaria mediante un valore di soglia. BW=IMBINARIZE(I,LEVEL) converte l’immagini bidimensionale o tridimensionale I a toni di grigio o RGB in immagine binaria (o logical). L’immagine BW in uscita ha valore 0 (nero) in tutti i pixel che nell’immagine in ingresso hanno intensità minore del valore LEVEL e valore 1 (bianco) per tutti gli altri pixel. Si deve notare che il livello di soglia LEVEL deve essere specificato nell’intervallo [0,1], indipendentemente dalla classe dell’immagine in ingresso (cioè double o uint8). BW= IMBINARIZE(I) converte l’immagine in binaria determinando il valore di soglia con il metodo di Otsu, BW= IMBINARIZE(I,’adaptive’,‘Sensitive’,VAL) converte l’immagine in binaria determinando il valore di soglia localmente con metodi statistici; Val è un valore compreso tra 0 e 1: per VAL →1 aumentano i punti posti ad 1 (default VAL=.5). BWPERIM Trova i pixel perimetrali in immagini binarie. BW2=bwperim(bw1) restituisce un'immagine binaria che contiene soltanto i pixel perimetrali degli oggetti nell'immagine di ingresso BW1. Un pixel appartiene al perimetro se esso è diverso da zero ed è connesso ad almeno un pixel stimato come zero. La connettività predefinita è 8 per due dimensioni, 26 per tre dimensioni e CONNDEF(NDIMS(BW), 'minimal ') per le dimensioni maggiori.

BW2 = BWPERIM(BW1, CONN) specifica la connettività voluta. CONN può assumere i seguenti valori scalari: 4: contorni a 4 pixel 8: contorni a 8 pixel BWMORPH Effettua operazioni morfologiche su immagini binarie. BW2=BWMORPH(BW1,OPERATION) applica una specifica operazione morfologica all’immagine binaria BW1. BW2=BWMORPH(BW1,OPERATION,N) applica l’operazione N volte. N può essere Inf, nel cui caso l’operazione è ripetuta fino a che l’immagine non si modifica più. OPERATION è una stringa che può avere uno di questi valori: 'shrink' Con N = Inf, rimpicciolisce oggetti a punti, rimpicciolisce oggetti con fori per connettere anelli 'skel' Con N = Inf, rimuove pixel sui contorni degli oggetti senza permetter che gli oggetti si dividano in parti 'thin' Con N = Inf, rimuove pixel in modo che oggetti senza fori si riducano a tratti connessi minimamente, e un

oggetto con fori si riduca ad un anello a metà strada tra il bordo esterno ed interno.

'thicken' Con N = Inf, inspessisce oggetti aggiungendo pixel all’esterno dell’oggetto senza connettere oggetti 'dilate’ Effettua la dilatazione usando l’elemento strutturante ones(3) 'erode’ Effettua l’erosione usando l’elemento strutturante ones(3) 'close’ Effettua chiusura binaria (dilatazione seguita da erosione) 'open' Effettua l’apertura binaria (erosione seguita da dilazione) 'bothat' Sottrae l’immagine di ingresso dalla sua chiusura 'tophat' Sottrae l’apertura dall’immagine di ingresso

'bridge’ Unisce pixel precedentemente non connessi 'diag' Riempimento diagonale per eliminare 8-connettività di sfondo 'fill' Riempie pixel isolati interni (0 circondati da 1) 'majority' Setta un pixel ad 1 se 5 o più pixel nei suoi 3x3 vicini sono 1 'clean' Rimuove pixel isolati (1 circondati da 0) 'spur' Rimuove punti terminali di linee senza rimuovere del tutto piccoli oggetti precedentemente non connessi 'hbreak' Rimuove pixel H-connessi 'remove’ Pone un pixel a 0 sei i suoi 4-connected contorni sono tutti 1's, in modo da lasciare solo pixel di contorno 'endpoints' Trova i punti finali di scheletri 'branchpoints' Trova i punti di diramazione di scheletri L’immagine di ingresso BW1 può essere una matrice 2-D di qualsiasi classe. L’immagine di uscita BW2 è di classe uint8. Esempi BW1 = imread('circles.tif'); imshow(BW1) BW2 = bwmorph(BW1,'remove’); figure, imshow(BW2); BW3 = bwmorph(BW1,'skel',Inf); figure, imshow(BW3) IMFILL riempie una regione di un’immagine BW2=IMFILL(BW1,LOCATIONS) esegue un’operazione di riempimento su un area di pixel aventi il valore dello sfondo (cioè 0) di una immagine di ingresso binaria (logical) BW1, a partire dal pixel la cui riga e colonna sono indicati nel vettore riga LOCATIONS. Tutti i pixel connessi con continuità a quello iniziale vengono posti ad uno. Esempio: x=10;y=100; BW2=imfill(BW1,[y x])

Page 25: INTRODUZIONE AL MATLAB · 2019-11-05 · G. Petrucci “Laboratorio di elaborazione delle immagini” 2 Le variabili stringa servono a memorizzare parole e caratteri e sono utili

G. Petrucci “Laboratorio di elaborazione delle immagini”

25

FUNZIONI MATEMATICHE ELEMENTARI

TRIGONOMETRICHE

sin Seno sec Secante sinh Seno iperbolico sech Secante iperbolica asin Seno inverso asec Secante inversa

asinh Seno iperbolico inverso asech Secante iperbolica inversa cos Coseno csc Cosecante

cosh Coseno iperbolico csch Cosecante iperbolica acos Coseno inverso acsc Cosecante inversa

acosh Coseno iperbolico inverso acsch Cosecante iperb. inversa tan Tangente cot Cotangente

tanh Tangente iperbolica coth Cotangente iperbolica atan Tangente inversa acot Cotangente inversa

atan2 Tangente inversa 4 quadr. acoth Cotang. iperb. inversa atanh Tangente iperb. inversa

ESPONENZIALI

exp Esponenziale. log Logaritmo naturale.

log10 Logaritmo comune (base 10). log2 Logaritmo in base 2

pow2 Elevazione a potenza in base 2 sqrt Radice quadrata.

COMPLESSI

abs Valore assoluto. angle Angolo di fase.

complex Costruisce un dato complesso dalle parti reale e immaginaria. conj Complesso coniugato.

imag Parte immaginaria. real Parte reale.

unwrap Angolo di fase svolto. isreal Vero per array reale.

cplxpair Ordina numeri in coppie di complessi coniugati.

ARROTONDAMENTI E RESTI

Funzione Intero -0.6 0.6 round più vicino -1 1

fix più vicino a 0 0 0 floor più vicino a –infinito -1 0

ceil più vicino a +infinito 0 1

mod resto di una divisione, con segno del divisore

rem resto di una divisione,

con segno del dividendo

OPERATORI

OPERATORI ARITMETICI

Più + plus Meno - minus Moltiplicazione di Matrici * mtimes Potenza di Matrice ^ mpower Slash o divisione destra matrice / mrdivide Backslash o divisione sinistra matrice \ mldivide Moltiplicazione elemento x elemento .* times Potenza elemento x elemento .^ power Divisione sinistra elemento x elemento .\ ldivide Divisione destra elemento x elemento ./ rdivide Prodotto tensoriale di Kronecker kron kron

OPERATORI RELAZIONALI Uguale == eq Non uguale ~= ne Minore di < lt Maggiore di > gt Minore o uguale di <= le Maggiore o uguale di >= ge

OPERATORI LOGICI

And E logico & Or O logico | Not NON logico ~ Xor O ESCLUSIVO logico Any Vera se un qualsiasi elemento del vettore è nonzero All Vera se tutti gli elementi del vettore sono nonzero

CARATTERI SPECIALI

( ) Parentesi e indici argomenti di funzioni indici di arrays

[ ] Parentesi quadre matrici e vettori / output multipli di funzioni : due punti fa scorrere gli indici

, virgola separa elementi in una riga separa argomenti nelle funzioni separa le istruzioni

; Punto e virgola separa elementi in una colonna separa le istruzioni

= Assegnazione Assegna un valore ad una variabile . punto decimale Separa i decimali dagli interi .' Punto e apice Traspone una matrice ' Apice Complesso coniugato transposto

'..' Apici Delimitano una stringa % Commento Permette di scrivere commenti