semplicemente visualizzazioni di fenomeni, sono cioè riproduzione 
“vere”, “reali”, “oggettive”. Esse aiutano a osservare ed interpretare i 
vari processi che rappresentano.  
Per questo processo non è solitamente sufficiente la semplice 
osservazione. Spesso infatti richiede l’ausilio di modellizzazioni digitali 
oppure (o in aggiunta) può essere necessario isolare le informazioni da 
esaminare, togliendo il contesto, il “rumore di fondo”. In questi casi è 
utile ricorrere ad elaborazioni che consentano di dividere le varie parti di 
una immagine in aree ben distinte, ognuna rappresentante qualche 
oggetto o comunque avente caratteristiche di similarità interna. Tale 
processo viene chiamato segmentazione. Si tratta di un problema ben 
noto e lungamente studiato, per il quale esistono diverse soluzioni e 
procedure applicative, alcune delle quali saranno brevemente presentate 
nel Capitolo 1. 
L’algoritmo ottimo, se mai esistesse, non è stato tuttavia ancora 
trovato, lasciando quindi aperta la ricerca di nuovi e migliori metodi 
risolutivi. Tra questi, uno molto promettente è stato presentato da Jianbo 
Shi e Jitendra Malik in via prelimare nel 1997 [SM97] e definitiva nel 
corso del 2000 nel loro lavoro intitolato “Normalized Cuts and Image 
Segmentation”. Nello stesso anno i due ricercatori, insieme a Serge 
Belongie e Thomas Leung dell’Università di Berkeley hanno anche 
descritto una possibile strategia implementativa in “Contour and Texture 
Analysis for Image Segmentation” [MBLS00]. Una completa descrizione 
di tale algoritmo, tema fondamentale della presente tesi, verrà data nel 
Capitolo 3.  
Data la complessità matematica dell’algoritmo in questione si è 
ritenuto opportuno, nel Capitolo 2, riassumere molto brevemente alcuni 
concetti chiave che saranno necessari per una migliore comprensione del 
lavoro svolto. In particolare saranno trattati argomenti di algebra, calcolo 
numerico e teoria dei grafi. 
 Il Capitolo 4 presenta, invece, il codice in C++ e MATLAB che 
consente di applicare le nozioni teoriche apprese in un caso particolare 
ma significativo, quello delle immagini PGM in scala di grigio. Alcuni 
esempi commentati di utilizzo di questo codice saranno presentati nel 
Capitolo 5. 
 6
Capitolo 1  
Segmentazione di un’Immagine 
1.1 Introduzione 
Un’immagine digitale, indipendentemente dal metodo con cui è stata 
acquisita, risulta composta da elementi, chiamati pixel, ognuno dei quali 
rappresenta un singolo colore o livello di grigio. Normalmente un 
intervallo di luminosità (per ogni singolo colore) viene rappresentato con 
8 bit (il bit è la singola unità di memorizzazione dell’elaboratore, e può 
contenere solo i valori binari 0 o 1), per cui può assumere al massimo 
2
8
=256 valori. Tali valori sono normalmente bastanti affichè l’occhio 
umano percepisca l’immagine sufficientemente “nitida”.  
Nel caso di immagini in scala di grigio è possibile specificare un 
solo intervallo di luminosità. Sono perciò sufficienti 8 bit (ossia 1 byte) 
per ogni pixel. Al contrario, per immagini a colori questi si incrementano 
in base al numero di colori primari da registrare. Per esempio alle 
immagini RGB (tricromia) saranno necessari 3x8=24 bit, potendo quindi 
contare su 2
24
=16 miloni di colori possibili (un singolo colore è dato 
dalle diverse “gradazioni” dei 3 primari, in questo caso rosso, verde e 
blu).  
Considerando il pixel come l’unità singola di memorizzazione è 
possibile rappresentarlo dandone semplicemente la posizione (per 
esempio relativa il primo pixel in alto a sinistra) e i valori di luminosità 
relativi allo spazio considerato (uno solo per immagini in scala di grigio, 
tre per quello RGB, quattro per CMYK, ecc…). Per esempio in RGB il 
colore rosso sarà 255-0-0, il blu 0-0-255, l’azzurro cielo 128-128-255 il 
grigio chiaro 192-192-192, il quale nello spazio dato dalle immagini solo 
in scala di grigio sarà dato semplicemente dal valore 192. 
La segmentazione dell’immagine consiste nell’effettuare una 
partizione di questo insieme dei pixel. Segmentare un’immagine significa 
quindi individuare in essa le regioni (sottoinsiemi di pixel connessi) che 
rappresentano elementi significativi della scena. 
Benché il problema risulti di facile comprensione sfortunatamente 
esso è difficilmente automatizzabile. Per l’elaboratore, infatti, risulta 
 7
molto complesso trovare opportunamente le regioni. Per chiarire il 
concetto si veda l’immagine seguente (Fig. 1.1) 
 
 
Fig. 1.1 – Esempio di immagine 
 
Per l’uomo è abbastanza facile dividere l’immagine in parti che 
definiscono i diversi oggetti: il terreno, le nuvole, il sole, le piante, i 
tralicci. Per l’elaboratore questo è molto più complesso: come 
distinguere, per esempio, le piante dal terreno? Il livello di grigio è 
molto simile, quindi potrebbe essere molto complicato effettuare (si 
ricordi, in maniera automatica) tale divisione. Come se ciò non bastasse, 
si consideri inoltre che la divisione “ottimale” dipende fortemente da 
cosa si cerca. Nell’esempio di Fig. 1.1 potrebbe essere necessario 
individuare solo il confine tra l’area del cielo e quella della terra (linea 
dell’orizzonte), oppure si vorrà porre l’attenzione sulle nuvole (in una 
stazione metereologica) o alle piante (nel campo della biologia) e così 
via. 
Concludendo si può dire che la scelta della partizione ottimale è per 
un certo senso soggettiva. I principali algoritmi possono quindi essere 
usati, dopo attenta personalizzazione, solamente come traccia, un 
suggerimento che poi dovrà essere verificato dall’occhio umano in 
rapporto a ciò che ricerca. 
 
1.2 Principali tipi di segmentazione 
Nel corso degli anni sono state presentate numerose tecniche per il 
problema della segmentazione. Benché spesso siano molto diverse l’una 
dall’altra è tuttavia possibile classificarle in due categorie [MBLS00]: 
• basate sulle regioni 
• basate sul contorno 
 
Nel primo caso si cerca di dividere l’immagine in sottoinsiemi in cui 
i pixel abbiano una certa coerenza, per esempio un intervallo di 
luminosità o di colore. Nel secondo, al contrario, solitamente si inizia 
 8
riconoscendo i contorni (attraverso uno dei numerosi algoritmi esistenti), 
per poi “collegare” tali confini ottenendo delle continuità (generando 
quindi dei sottoinsiemi). Si può verificare che è possibile passare da un 
metodo di un tipo ad uno dell’altro scegliendo opportuni criteri [WE96]. 
 
Un’ulteriore classificazione può essere effettuata verificando se il 
metodo in esame utilizza dati esclusivamente locali oppure anche globali 
all’immagine. Altrimenti detto, se vengono esaminate esclusivamente 
caratteristiche (locali) dei pixel adiacenti oppure se si considerano anche 
qualità globali. In generale il tener conto di informazioni globali 
migliora notevolmente il processo di segmentazione, a costo tuttavia di 
una complessità computazionale nettamente superiore. L’utilizzo di 
entrambi i tipi di informazioni può essere l’approccio migliore al 
problema della segmentazione. Applicare ciò per esempio ad un metodo 
basato sul contorno può voler dire in una prima fase usare informazioni 
locali per trovare i contorni, che saranno poi successivamente collegati in 
base a dati globali all’immagine. 
 
A conclusione del paragrafo risulta utile accennare ad un problema 
di riconoscimento importante ed in qualche modo indipendente dal 
metodo utilizzato: quello delle trame (“texture”). Si pensi ad una tovaglia 
a righe o al mantello di una tigre: essi sono oggetti con una trama più o 
meno regolare, ma che devono essere interpretati per quanto possibile 
complessivamente. Sia gli approcci basati sulle regioni che quelli basati  
sul contorno rischiano di fallire miseramente in tali situazioni, se non 
utilizzando complesse informazioni globali a correzione del 
riconoscimento effettuato. 
 
1.3 La partizione ottimale 
E’ possibile individuare alcune caratteristiche che dovrebbe 
possedere una metodologia di segmentazione considerata ottimale (non 
ottima, si ricordi, in quanto questa in generale non esiste) [MBLS00]: 
• dovrebbe poter essere utilizzata con immagini generiche, 
quindi anche miste con texture e senza; 
• in termini di contorno, dovrebbe essere in grado di trovare sia 
differenze di luminosità o altre caratteristiche di pixel che 
contorni e linee; 
• dovrebbe essere possibile applicarlo ricorsivamente su parti di 
immagine che si desidera approfondire ulteriormente 
 
 9
Ricordando queste caratteristiche è ora possibile descrivere in modo 
più approfondito alcune strategie risolutive “classiche”, per passare poi, 
nel Capitolo 3, all’algoritmo oggetto di studio di questa tesi.  
Si noti, inoltre, che tutte le metodologie e gli esempi presentati nel 
proseguo si riferiscono a immagini a livelli di grigio. Esse sono tuttavia 
generalizzabili (previa opportuna modifica) anche per immagini a colori. 
 
1.4 Il Thresholding 
1.4.1 L’istogramma 
L’istogramma di un’immagine fornisce molte importanti 
informazioni circa la distribuzione dei livelli di grigio presenti. Si 
consideri un’immagine di dimensione N x M con G livelli di grigio (si è 
visto che normalmente G=256).  
L’istogramma è definito come una funzione da G a [0,NM] che ad 
ogni elemento di G associa il numero di pixel aventi quel determinato 
livello di grigio. 
Particolare importanza viene assunta dall’istogramma normalizzato, 
definito come: 
NM
n
h
i
i
=  
 
per ogni valore i∈ G, dove: 
• n
i
 è il numero di pixel di livello i; 
• NM è il numero totale di pixel presenti nell’immagine. 
 
L’istogramma normalizzato è quindi una distribuzione, e come tale è 
possibile calcolarne diversi valori notevoli, nonchè darne una 
rappresentazione grafica, indicando per esempio sull’asse delle ascisse il 
livello di grigio e sulle ordinate la percentuale (il valore h
x
).  
In Fig. 1.2 è riportato a titolo esemplificativo l’istogramma 
normalizzato dell’immagine di Fig. 1.1, ottenuto utilizzando l’apposita 
funzione all’interno del noto programma di fotoritocco Adobe 
Photoshop. Nella stessa figura sono riportati anche alcuni valori notevoli 
associati, quali la media (mean), la deviazione standard (std dev) e la 
mediana (median). 
 
 10
 Fig. 1.2 – Istogramma normalizzato dell’immagine di Fig. 1.1 
 
L’importanza di avere una precisa conoscenza delle percentuali dei 
diversi livelli di grigio sarà maggiormente compresa in seguito. Tuttavia, 
prendendo come riferimento la Fig. 1.2, è già facilmente verificabile 
come sia possibile migliorare la qualità dell’immagine intervenendo 
sull’istogramma. In Fig. 1.2 è infatti presente una zona (nel nero) dove 
non sono presenti pixel (la parte con valore y a 0 sulla sinistra). E’ 
quindi possibile “normalizzare” l’immagine di partenza per fare in modo 
che i pixel siano distribuiti su tutta l’ampiezza dei valori della scala. 
Questa semplice operazione consente di migliorare notevolmente la 
leggibilità dei dettagli, seppur, ovviamente, non aggiungendo alcuna 
informazione. Una semplice procedura di normalizzazione sarà realizzata 
nel Capitolo 4. 
 
1.4.2 Segmentazione tramite thresholding 
Il tipo più semplice di partizionamento utilizza la strategia del 
thresholding. 
Sia data un’immagine I di dimensioni N x M e G livelli di grigio. Si 
prenda un valore arbitrario K appartenente a G. Nel tresholding viene 
generata una nuova immagine T (sempre di dimensioni N x M) con pixel 
solo bianchi o neri. L’elemento T
i
 sarà ad esempio bianco se il 
corrispondente I
i
 è minore o uguale a K, altrimenti sarà nero.  
Questa semplice metodologia di segmentazione ha due grossi 
svantaggi: primo, non è possibile conoscere a priori in quanti 
sottoinsiemi verrà divisa l’immagine di partenza (è molto facile avere 
anche dei singoli punti “sparsi”); secondo, è in generale molto difficile 
individuare (se non per immagini molto semplici) un corretto valore 
soglia K. 
Un caso in cui risulta abbastanza semplice la scelta del valore soglia 
è dato dall’immagine di Fig. 1.1. Osservando il corrispondente 
istogramma normalizzato (Fig. 1.2) è possibile notare che esiste un punto 
di minimo posto nella parte sinistra della curva di distribuzione. 
 11
Utilizzando tale valore minimo come soglia K l’immagine viene 
suddivisa in due regioni, che corrispondono a cielo e terra (Fig. 1.4). 
 
 
Fig. 1.3 – Scelta del valore di soglia 
 
 
Fig. 1.4 – Risultato del threshold applicato all’immagine di Fig. 1.1 
 
E’ stato un caso fortunato, infatti è stata sostanzialmente mantenuta 
la linea dell’orizzonte, dividendo correttamente il cielo dalla terra. Se, 
invece, si fossero voluti altri particolari (quali gli alberi) la scelta del 
valore di soglia sarebbe stata molto più complicata. Per questo, nel corso 
degli anni, sono stati ideati moltissimi algoritmi di ricerca automatici, 
nessuno dei quali, tuttavia, risulta definitivo [WE96]. 
1.4.3 Threshold multilivello 
Il treshold multilivello si basa sullo stesso principio del tresholding 
semplice. Esso usa tuttavia più valori soglia (K
1
, K
2
, ecc…) generando 
quindi, come segmentata T, un’immagine in scala di grigio (con |G| = 
numero livelli).  
Si noti che il treshold multilivello non risolve nessuno dei problemi 
visti in precedenza, e non è quindi da considerarsi una buona strategia 
risolutiva del problema della segmentazione. 
1.5 Segmentazione basata sul contorno 
E’ possibile realizzare una segmentazione basandosi sulle figure 
presenti nell’immagine: dapprima si trovano i contorni “probabili” degli 
oggetti rappresentati, poi essi vengono “uniti” a formare una linea 
chiusa, che delimiterà una regione. I pixel che alla fine del processo 
(ripetuto per ogni singolo contorno) non saranno stati ancora inclusi in 
un’area verranno considerati facenti parte al sottoinsieme dello sfondo. 
 12
Per comprendere il funzionamento dell’algoritmo si consideri 
l’immagine come una funzione in due variabili che associa ad ogni punto 
dello spazio bidimensionale di coordinate (x,y) un valore f(x,y), il livello 
di grigio ad esso associato.  
Inoltre, bisogna definire cosa si intenda per contorno. Un contorno si 
può considerare tale quando esiste una certa discontinuità tra i livelli di 
grigio da una parte e quelli dall’altra della linea rappresentante il 
confine. 
 
Si vedrà anzitutto il problema della ricerca del contorno, per passare 
poi alla fase di tracing (unione).  
1.5.1 Point Detection 
Inizialmente si pensi a come trovare un singolo punto di 
discontinuità. 
Molte tecniche per l’estrazione dei pixel di bordo si basano 
sull’utilizzo di filtri lineari. Un esempio di filtro con regione di supporto 
3 x 3 è:  
 
-1 -1 -1 
-1 8 -1 
-1 -1 -1 
Fig. 1.5 – Tabella di filtro di ricerca di punti 
 
Come avvenga la sua applicazione è abbastanza intuitivo: si 
seleziona una parte dell’immagine di dimensioni identiche a quelle del 
filtro (3 x 3) e i valori di grigio dei pixel corrispondenti vengono 
moltiplicati per i fattori moltiplicativi del filtro stesso.  
Formalmente un’immagine data da f(x,y) subisce durante il processo 
la seguente trasformazione: 
 
 ƒ ƒ
==
+
+−+−=
2
0
2
0
)3(
)1,1(),(
ij
ij
Aiyjxfyxg  
 
dove A
i
 è l’iesimo valore della maschera del filtro (partendo da A
0
, 
valore alto sinistro). Considerando la funzione point(x,y) come il valore 
assoluto di g(x,y) (ossia point(x,y)=|g(x,y)|) è facile comprendere che 
esso è un livello di grigio direttamente proporzionale alla differenza di 
valore tra il pixel centrale e i suoi 8 vicini. 
 Point(x,y) ritorna un livello di grigio, mentre nel determinare se un 
pixel ha una differenza “sufficiente” di valore ci si aspetterebbe un 
 13
“vero” o “falso”. Per ovviare a tale inconveniente solitamente si applica 
il thresholding al risultato, considerando quindi punti di discontinuità 
solamente quelli per cui  
 
point(x,y)>K 
 
con K valore soglia scelto. 
 
1.5.2 Line Detection 
Estendendo il caso sopra esposto, per cercare un contorno di linee si 
dovranno applicare n filtri lineari, uno per ogni direzione cercata. In Fig. 
1.6 sono riportati alcuni esempi: 
 
 
 
-1 -1 -1
2 2 2
-1 -1 -1
-1 2 -1 
-1 2 -1 
-1 2 -1 
 
-1 -1 2
-12-1
2 -1 -1
 
2-1-1 
-1 2 -1 
-1 -1 2
 
Fig. 1.6 – Maschere di filtri per la ricerca di linee orizzontali, verticali, a 45° e 
135° 
 
Come si vede la prima matrice consente di trovare linee orizzontali, 
la seconda verticali e così via. Per ogni pixel viene quindi scelto come 
output la direzione della maschera che ha dato il risultato massimo, che 
sarà infine sottoposto a thresholding per lo stesso motivo visto nel caso 
dei punti. 
 
1.5.3 Edge Detection 
Il fatto che per trovare contorni qualunque si applichino delle 
maschere simili a quelle viste in precedenza non dovrà, a questo punto, 
sorprendere. In effetti in Fig. 1.7 sono rappresentate le tabelle (otto in 
tutto) che consentono di ottenere i contorni in due direzioni orizzontali, 
due verticali e quattro diagonali, conosciute come Kirsch edge detector. 
 
 14