Ingegneria della conoscenza e sistemi esperti
Moduli di Visione e percezione e Apprendimento
Clusterizzazione di prati e alberi secondo misture
di gaussiane con parametri appresi tramite
algoritmo EM
Cesare Guariniello
i
Abstract
This work about the clustering of trees and meadows can be divided into two parts
which have been carried on almost independently: first of all, supposed that the
"trees and meadows" RGB components belong to a Gaussian mixture (GM)
probability distribution function (pdf), the parameters of this GM pdf have been
learned with the EM algorythm, which allows to solve the problem of learning in
presence of hidden variables. In fact, we want to perform unsupervised clustering,
by recovering a gaussian mixture model when we know neither the assignment of
any data point to a given component, nor the parameters of any component of the
mixture. Two different data sets have been used, thus generating two different sets
of parameters. From each data set, composed by 44100 RGB components vectors
(ten 70-by-70 images), GMs with 3 up to 11 components have been learned. The
learned sets of parameters have been used in the second part of this work, that is the
creation of a Graphic User Interface (GUI) that allows to open images and choose
the learning data set and the parameters for clustering, and calculates the trees and
meadows clusters in the selected image basing on the GM pdf learned in the first
part.
ii
Sommario:
Clusterizzazione di prati e alberi secondo misture di gaussiane con parametri appresi tramite
algoritmo EM ........................................................................................................................................ i
Abstract ............................................................................................................................................ ii
1
L’apprendimento dei parametri delle misture di gaussiane tramite l’algoritmo EM
(Expectation Maximization) ............................................................................................................ 1
1.1
Le misture di gaussiane.................................................................................................... 1
1.2
L’algoritmo EM ............................................................................................................... 1
1.3
Le immagini e i dati di apprendimento ............................................................................ 2
1.4
Le funzioni di apprendimento .......................................................................................... 3
1.4.1
gmem.m.................................................................................................................... 3
1.4.2
fcm.m........................................................................................................................ 4
1.4.3
covfixer.m................................................................................................................. 4
1.4.4
mvnpdf.m.................................................................................................................. 5
1.4.5
emstime.mat.............................................................................................................. 5
2
L’utilizzo delle misture di gaussiane per la clusterizzazione ................................................... 5
2.1
Scelta del numero di componenti della mistura ............................................................... 5
2.2
Scelta della soglia di appartenenza .................................................................................. 6
2.3
Gestione delle immagini .................................................................................................. 6
2.4
Le funzioni di clusterizzazione ........................................................................................ 6
2.4.1
gmpdf.m.................................................................................................................... 6
2.4.2
gmcluster.m.............................................................................................................. 7
3
L’interfaccia grafica ................................................................................................................. 7
3.1
Il layout ............................................................................................................................ 8
3.2
I menu e l’utilizzo dell’interfaccia grafica ....................................................................... 8
3.2.1
Il menu File .............................................................................................................. 8
3.2.2
Il menu View............................................................................................................. 9
3.2.3
Il menu Help............................................................................................................. 9
3.2.4
I menu contestuali delle immagini ........................................................................... 9
3.2.5
Il pannello Learning set ........................................................................................... 9
3.2.6
Il pannello Parameters........................................................................................... 10
3.2.7
Il pannello Single points removal e il tasto Update............................................... 10
3.3
Le funzioni dell’interfaccia grafica................................................................................ 10
3.3.1
EM.m ed EM.fig ..................................................................................................... 10
3.3.2
modalabout.m e modalabout.fig ............................................................................ 13
3.3.3
modalguide.m e modalguide.fig ............................................................................. 13
3.3.4
modalmenu.m e modalmenu.fig ............................................................................. 13
3.3.5
modalbox.m e modalbox.fig ................................................................................... 14
4
Listati delle funzioni matlab .................................................................................................. 15
4.1
gmem.m.......................................................................................................................... 15
4.2
fcm.m ............................................................................................................................. 17
iii
4.3
covfixer.m ...................................................................................................................... 18
4.4
mvnpdf.m....................................................................................................................... 19
4.5
gmpdf.m......................................................................................................................... 21
4.6
gmcluster.m.................................................................................................................... 22
4.7
EM.m.............................................................................................................................. 23
4.8
modalabout.m................................................................................................................. 32
4.9
modalguide.m................................................................................................................. 34
4.10 modalmenu.m................................................................................................................. 37
4.11 modalbox.m.................................................................................................................... 40
5
Bibliografia e risorse online ................................................................................................... 44
Indice analitico ............................................................................................................................... 45
iv
1
L’apprendimento dei parametri delle misture di gaussiane tramite
l’algoritmo EM (Expectation Maximization)
1.1
Le misture di gaussiane
Le misture di gaussiane sono funzioni di distribuzione di probabilità formate dalla somma di
funzioni di distribuzione di tipo gaussiano, chiamate componenti della mistura, ciascuna con
un suo peso.
I parametri caratterizzanti una mistura di gaussiane, dato il numero di componenti k e la
dimensione d, sono di tre tipi:
Ÿ i momenti µ, che sono k vettori di dimensione d, uno per ciascuna componente
Ÿ le covarianze S , che sono k matrici di dimensione d*d, una per ciascuna componente
Ÿ il vettore dei pesi, di dimensione k.
La probabilità della mistura è data da
k
P( x) = å P( x | C = i )P (C = i )
i=1
dove P(C=i), ossia la probabilità che la componente sia la i- esima, è proprio il peso della iesima componente, mentre P(x|C=i) = P(x| Si, µi) è la gaussiana i-esima calcolata in x.
1.2
L’algoritmo EM
L’algoritmo “Expectatio n Maximization” permette l’apprendimento con set di dati
incompleti o con set di dati generati da misture di distribuzioni di probabilità nel caso in cui
non si conoscano né i parametri delle funzioni di distribuzione, né l’appartenenza di ciascun
dato ad una data funzione di distribuzione. Nel caso delle misture di gaussiane, l’idea base
dell’algoritmo EM è assumere di conoscere i parametri dei modelli, e quindi calcolare la
probabilità che ciascun dato appartenga a ciascuna componente. A questo punto, si
riadattano le componenti ai dati, e per ciascuna componente si pesano tutti i dati con la
probabilità che appartengano a questa componente. I due passi prendono rispettivamente il
nome di “passo di speranza”, o di aspettativa (Expectation step, E-step) e “passo di
massimizzazione” (Maximization step, M-step).
Nell’E-step, calcoliamo il valore atteso di variabili fittizie nascoste Zij, che indicano la
probabilità che il dato xj sia stato generato dalla -i esima componente. Calcoliamo quindi
Pij=P(C=i| xj ). Applicando la regola di Bayes, abbiamo Pij=aP(xj|C=i)P(C=i). a è un fattore di
normalizzazione, il termine P(xj|C=i) è la probabilità della i- esima gaussiana, calcolata nel
punto xj e il termine P(C=i) è semplicemente il peso della i- esima gaussiana. Definiamo poi
Pi = å Pij .
j
Nell’M-step, calcoliamo i nuovi valori dei parametri delle gaussiane che massimizzano il
log- likelihood dei dati, secondo le seguenti formule:
1
µi ¬¾¾
S i ¬¾¾
åpx
j
ij
j
pi
å p (x -µ )(x -µ )
j
ij
j
i
j
T
i
pi
w i ¬¾¾
pi
N
dove µi sono i momenti, Si le covarianze, wi pesi ed N il numero di dati.
L’algoritmo EM fa aumentare il log- likelihood dei dati ad ogni iterazione, quindi
generalmente raggiunge un massimo locale. Raramente raggiunge un punto di sella oppure
un punto di minimo locale.
La forma generale dell’algoritmo EM è data da
J (i+1) =argmax å z P(Z=z|x,J (i) )L(x,Z=z|J )
J
Dove ? sono tutti i parametri del modello che stiamo apprendendo, x sono i dati, Z sono le
variabili nascoste e L il likelihood.
1.3
Le immagini e i dati di apprendimento
Le immagini utilizzate per l’apprendimento sono le seguenti:
Queste prime otto immagini sono presenti in entrambi i set di apprendimento. Si può notare
che sono stati scelti alberi, prati e foglie di colore differente, alcuni con zone d’ombra, altri
con foschia. Per la nona immagine, nel primo set è stata inserita quella di un prato secco, che
tuttavia ha presentato alcuni problemi, poiché in immagini con la presenza di pixel di colore
2
chiaro (bianco sporco), questi sono marcati come pixel generati dalla mistura di gaussiane
appresa. Per questo motivo, nel secondo set la nona immagine è quella di un prato
ravvicinato.
Le immagini sono state importate in matlab come array di dimensioni 70*70*3, dove
ciascuna delle tre matrici è formata da numeri interi compresi tra 0 e 255, che indicano
l’intensità rispettivamente del rosso, del verde e del blu. Le matrici sono state poi “aperte” in
vettori di 4900 elementi, e affiancate in tre colonne. Mettendo poi in successione i vettori di
tutte le immagini, si è ottenuto per ogni set di immagini una matrice con tre colonne (rosso,
verde e blu) di 44100 elementi, utilizzata poi nelle funzioni di apprendimento.
1.4
Le funzioni di apprendimento
In questo paragrafo verranno descritte le funzioni matlab utilizzate per l’apprendimento. I
listati, all’interno dei quali si trovano ulteriori commenti alle funzioni, sono consultabili nel
capitolo 4.
1.4.1
gmem.m
La funzione gmem (gaussian mixture expectation maximization) accetta in ingresso una
matrice di dati di dimensioni NxD, dove N è il numero di punti e D la dimensione della
mistura di gaussiane che vogliamo ottenere in uscita, e restituisce una struttura contenente
una matrice di momenti mu, di dimensioni DxC, dove C è il numero di componenti nella
mistura di gaussiane, un array di covarianze sigma, di dimensioni DxDxC e un vettore di
pesi weight, di lunghezza C. Tra i parametri di ingresso, possono essere anche indicati il
numero massimo di interazioni (100 per default), la soglia di convergenza (10-6 per default),
il numero di componenti nella mistura di gaussiane (3 per default), la visualizzazione o
meno di messaggi indicanti il progresso dell’algoritmo (no per default) e l’inizializzazione
dell’algoritmo, mediante una struttura contenente le matrici mu e sigma con le quali si
intende inizializzare l’algoritmo ([] per default).
La funzione inizia con l’assegnazione dei parametri di default e il parsing degli eventuali
parametri passati in ingresso.
Si passa poi all’inizializzazione di mu, sigma e weight. Nel caso in cui l’utente non abbia
fornito una propria inizializzazione, se le componenti della mistura sono almeno 2, si è
scelto di inizializzare i centri tramite la funzione fcm, basato sul clustering fuzzy c- mean;
questa scelta permette di mantenere un certo grado di casualità, scegliendo però comunque
un metodo di calcolo dei centri di cluster. Se la mistura è in realtà il calcolo di una semplice
distribuzione gaussiana, mu viene inizializzato calcolando la media dei dati. La covarianza,
3
invece, viene inizializzata per ciascuna componente come la matrice diagonale avente come
valori quelli della diagonale della covarianza calcolata sui dati. A questo punto viene
invocata la funzione covfixer, che forza la matrice appena calcolata ad essere una valida
matrice di covarianza. I pesi vengono inizializzati semplicemente assegnando a ciascuna
delle C componenti un peso pari a 1/C.
Il log- likelihood viene inizializzato con il massimo valore negativo.
A questo punto inizia la fase di calcolo. Per ciascuna componente, il prodotto
p(xj |C=i)p(C=i) viene calcolato dalla funzione gmprob, che invoca la funzione preesistente
in matlab mvnpdf per calcola re la probabilità di un punto in una gaussiana multivariata e poi
la pesa con l’attuale peso della componente, passato come parametro di ingresso insieme ai
dati, alla matrice mu e all’array sigma. Viene poi effettuata la normalizzazione dei risultati, e
questo conclude il passo E. Nel passo M vengono calcolate le nuove stime dei pesi, di mu e
di sigma, sempre poi verificato dalla funzione covfixer. Alla fine di ogni ciclo viene
ricalcolato il prodotto p(xj|C=i)p(C=i), e quindi il log- likelihood dei dati. Se la variazione del
log- likelihood è minore della soglia di convergenza, le iterazioni vengono interrotte, come
anche se il numero di iterazioni ha superato il massimo numero consentito; altrimenti, il
ciclo riprende dalla normalizzazione dei risultati. Al termine dell’iterazione, viene creata la
struttura che verrà passata in uscita.
1.4.2
fcm.m
La funzione fcm è preesistente in matlab. Il primo elemento che restituisce è proprio il
vettore di centri dei cluster. La invochiamo richiedendo C centri e inserendo opportuni
parametri, ottenendo così una buona inizializzazione per le matrici mu della mistura di
gaussiane.
1.4.3
covfixer.m
La funzione covfixer forza una matrice ad essere una valida matrice di covarianza
(simmetrica, definita positiva, con valori reali sulla diagonale). Per prima cosa viene forzata
la simmetria della matrice, poi vengono eliminate le parti immaginarie di eventuali numeri
complessi presenti sulla diagonale; nel caso queste parti immaginarie abbiano valori
superiori a 10-3 viene emesso un messaggio di avviso.
Viene poi utilizzata la funzione isspd, estratta dal file mvnpdf.m, che restituisce un valore
booleano che indica se la matrice in ingresso è simmetrica definita positiva. Nel caso in cui
non lo sia, si producono lievi modifiche per cercare di ottenere una matrice definita positiva:
se gli elementi della diagonale sono tutti negativi, viene sommato ad essi l’1% del massimo
valore assoluto degli elementi della diagonale; altrimenti, ogni elemento della diagonale
viene aumentato dell’1%.
4
1.4.4
mvnpdf.m
La funzione mvnpdf è preesistente in matlab. Fornisce la probabilità della distribuzione
gaussiana multivariata, determinata dai parametri mu e sigma, calcolata nei punti contenuti
nel vettore X, passato in ingresso.
1.4.5
emstime.mat
In questo file di dati sono contenuti i due set di parametri delle misture di gaussiane apprese.
Per ciascun set di dati di apprendimento, sono stati calcolati i mu, sigma e weight di misture
aventi un numero di componenti compreso tra 3 e 11.
2
L’utilizzo delle misture di gaussiane per la clusterizzazione
2.1
Scelta del numero di componenti della mistura
Durante la fase di studio del problema, per la scelta del numero di componenti da inserire
nella mistura di gaussiane al fine di ottenere il modello che maggiormente si avvicinasse alla
distribuzione che potrebbe generare tutte le possibili immagini di prati e alberi, sono stati
tentati diversi approcci. Il primo, più semplice ma anche dai minori risultati, è stato quello di
tracciare un grafico tridimensionale di punti, rappresentanti ciascuno le tre componenti dei
44100 dati di apprendimento. A causa dell’enorme numero di punti, tuttavia, si è creata una
gran sovrapposizione degli ellissoidi di addensamento che sarebbero stati indice di una
componente della mistura; da rotazioni del grafico, sono risultate evidenti 6-8 zone di
addensamento dei punti. Il grafico è salvato nella cartella dati di apprendimento, sotto il
nome di grafico1.fig. A questo punto, il secondo passo è stato quello di tentare di
semplificare il problema, riducendolo in sottoproblemi. Per questo motivo, nel file
apprendimento.mat, sempre nella cartella dati di apprendimento, sono presenti a titolo di
esempio le matrici greenblue, redgreen e redblue, che indicano quanti punti, tra quelli di
apprendimento, presentano le coppie [x,y] di verde e blu, di rosso e verde, di rosso e blu. In
tal modo, invocando le funzioni surf, mesh, o semplicemente image su queste matrici,
possiamo individuare le zone di addensamento per coppie di componenti cromatiche. Poiché
il blu è più omogeneo delle altre due componenti nelle immagini di prati e alberi, si è dato
maggior peso alla matrice redgreen, che presenta 5-6 zone di addensamento (grafico2.fig e
grafico3.fig). Tuttavia, le altre due matrici presentano ben 8-9 zone di addensamento
(grafico4.fig e grafico5.fig). Pertanto, in vista della creazione dell’interfaccia grafica per il
riconoscimento di prati e alberi, si è deciso di apprendere le misture di gaussiane con un
numero di componenti variabile da 3 a 11, ma il valore consigliato è di 5-7 componenti.
5
2.2
Scelta della soglia di appartenenza
Per quanto riguarda la soglia di appartenenza di un punto alla mistura di gaussiane, sono stati
effettuati vari test, calcolando le probabilità delle misture apprese in tutti i punti di varie
immagini, con e senza presenza di prati e alberi. I punti appartenenti a prati e alberi sono
generalmente caratterizzati da valori di probabilità compresi tra 10-9 e 10-6 ; pertanto, i valori
consigliati sono dell’ordine di 10-7 , e nell’interfaccia grafica è consentita la scelta di un
valore di soglia compreso tra i due estremi individuati mediante gli esperimenti.
Ovviamente, la scelta di una soglia più alta garantisce la diminuzione di errori positivi (ossia
la diminuzione di punti marcati come appartenenti alla mistura, ma in realtà non tali), ma
alcuni punti appartenenti alla mistura non verranno marcati come tali. La scelta di una soglia
più bassa comporta l’esatto opposto, poiché tende ad includere un maggior numero di punti.
2.3
Gestione delle immagini
Tutte le immagini riconosciute da matlab (principalmente ci si è concentrati su gif, jpeg e
bitmap) vengono importate in matlab come matrici di intensità di colori rosso, verde e blu.
Nel caso di immagini in toni di grigio, anziché un array di dimensioni m*n*3, verrà creata
una matrice di dimensioni m*n. Tuttavia, si è preferito non inserire la gestione di tali
immagini, che produrranno quindi semplicemente un errore nel caso si tentasse di applicare
la clusterizzazione a questo tipo di immagini.
2.4
Le funzioni di clusterizzazione
In questo paragrafo verranno descritte le funzioni matlab utilizzate per la clusterizzazione. I
listati, all’interno dei quali si trovano ulteriori commenti alle funzioni, sono consultabili nel
capitolo 4.
2.4.1
gmpdf.m
La funzione è molto semplice: accetta in ingresso un vettore di punti D-dimensionali e i
parametri di una mistura di gaussiane. I controlli su mu e sigma verranno effettuati dalla
funzione invocata mvnpdf, mentre un errore sulla dimensione del peso genererà un errore di
calcolo, in quanto proprio la lunghezza del vettore weight determina il numero di
componenti della mistura, oppure un errore nella finestra dei comandi di matlab, nel caso in
cui le dimensioni di mu e sigma siano minori di quella richiesta dal vettore weight.
La funzione calcola la probabilità della mistura di gaussiane in ciascun punto del vettore in
ingresso, invocando la funzione mvnpdf per calcolare la probabilità di ciascuna componente
nel punto, pesando tale probabilità col il peso della rispettiva componente, e sommando tra
loro tutti i valori trovati per ciascuna componente.
6
2.4.2
gmcluster.m
La funzione gmcluster produce un’immagine delle stesse dimensioni dell’immagine passata
in ingresso, nella quale intendiamo riconoscere prati e alberi basandoci sulle misture di
gaussiane apprese nella prima fase. L’immagine in uscita, in toni di grigio, ha marcati di
bianco (valore 255) tutti i pixel riconosciuti come generati dalla mistura di gaussiane scelta
per la clusterizzazione. In ingresso devono essere forniti i valori medi e le covarianze e i pesi
delle gaussiane della mistura. Possono anche essere passati due parametri opzionali: la
soglia di appartenenza, che per default è pari a 4*10-7 , e un valore booleano, il cui valore di
default è di verità, che indica se effettuare o meno la rimozione di punti isolati.
La funzione inizia con il controllo sul numero dei parametri passati in ingresso e sulle
dimensioni dei dati: l’immagine deve essere una valida immagine a colori, quindi un array di
dimensioni n*m*3, con n ed m non nulli; la matrice dei valori medi deve avere dimensioni
3*C e l’array delle covarianze 3*3*C, dove C indica il numero di componenti della mistura
di gaussiane; il vettore dei pesi deve avere lunghezza C.
Terminato il controllo dei dati in ingresso, viene eseguito il parsing dei parametri facoltativi.
A questo punto, viene generata una nuova immagine, completamente nera (tutti i pixel con
valore 0) e avente le dimensioni dell’immagine in ingresso. Ciascuna colonna dell’immagine
in ingresso viene convertita a valori reali, e sul vettore risultate viene invocata la funzione
gmpdf, per calcolare la probabilità, passando come parametri i valori medi, covarianze e pesi
passati dall’utente alla funzione gmcluster. Successivamente, per ogni punto della colonna,
la probabilità calcolata viene confrontata con la soglia di appartenenza: se la probabilità
risulta strettamente maggiore della soglia, il pixel corrispondente viene marcato come
generato dalla mistura di gaussiane, e settato ad un valore di 255.
Infine, se la variabile che indica l’esecuzione della rimozione di punti isolati ha un valore di
verità positivo, per ogni punto dell’immagine risultante, eccetto quelli lungo il bordo, se un
pixel nero è circondato da 6, 7 o 8 pixel bianchi (somma dei valori degli 8 pixel circostanti
maggiore di 1400), viene settato a 255. Allo stesso modo, se un pixel bianco è circondato da
6, 7 o 8 pixel neri (somma dei valori degli 8 pixel circostanti minore di 520), viene settato a
0. L’immagine risultante viene restituita in uscita.
3
L’interfaccia grafica
In questo capitolo, verrà presentata l’interfaccia grafica “EM” per il riconoscimento di
cluster di prati e alberi, sviluppata in ambiente matlab. Dopo la descrizione del layout
dell’interfaccia, verrà descritto l’utilizzo dei menu e pannelli presenti nell’interfaccia, e
infine saranno presentate le funzioni che compongono l’interfaccia.
Per visualizzare e utilizzare l’interfaccia, è sufficiente avviare matlab, digitare nella finestra
dei comandi “EM” e premere il tasto invio, ovviamente dopo aver aggiunto la cartella
contenente tutti i file di questo lavoro al percorso delle cartelle di matlab.
7
3.1
Il layout
Nella parte alta della finestra si trova la barra dei menu, contenente i menu “File”, “View”
ed “Help”, le cui funzioni e il cui utilizzo sono descritti in 3.2.1, 3.2.2 e 3.2.3.
Nella zona centrale, sono presenti le due
finestre delle immagini: a sinistra,
l’immagine caricata in ingresso, nella
quale si intendono riconoscere i cluster di
prati e alberi; a destra, l’immagine
risultante, che presenta in bianco i pixel
attribuiti ai suddetti cluster. Sugli assi sono
riportate le dimensioni in pixel. Cliccando
con il tasto destro sugli assi, si possono
utilizzari i menu contestuali delle
immagini, descritti in 3.2.4.
Nella parte inferiore della finestra vi sono i
pannelli per la scelta dei parametri, due
con pulsanti di scelta esclusiva e uno con
due cursori a scorrimento con relativa box di testo; in basso a destra, il pulsante “Update”,
che permette di aggiornare il risultato. Per l’utilizzo di questi controlli, si rimanda a 3.2.5,
3.2.6 e 3.2.7.
3.2
3.2.1
I menu e l’utilizzo dell’interfaccia grafica
Il menu File
Posto all’inizio della barra dei menu, presenta una sola voce (in quanto non esistono
comandi per il salvataggio di risultati dall’interfaccia grafica, per poter salvare le immagini
si utilizzano i comandi dei menu contestuali, descritti in 3.2.4): “Open image”. Tale
comando apre una finestra con la lista dei file presenti nella cartella corrente. Il punto
singolo (.) aggiorna il contenuto della cartella corrente, mentre il punto doppio (..) ha la
funzione di tornare indietro di un passo nel percorso della cartella corrente. Tutti gli altri file
possono essere selezionati con un clic singolo e aperti successivamente cliccando sul
pulsante “Yes”, oppure aperti direttamente, con un doppio clic. Solo file di immagini gif
(*.gif, *.GIF), jpeg (*.jpg, *.JPG, *.jpeg, *.JPEG) e bitmap (*.bmp, *.BMP) verranno
accettati e caricati nella finestra immagine di sinistra, al posto dell’immagine corrente. Altri
tipi di file genereranno una finestra modale (ossia in attesa di risposta dell’utente) di errore.
Il comando “Open image” può essere selezionato anche tramite la combinazione di tasti
CTR+O.
8
3.2.2
Il menu View
Posto sulla barra dei menu, presenta due voci: selezionando la prima, “Default” (CTRL+D),
l’interfaccia verrà riportata nello stato iniziale, con l’immagine e i parametri di default; la
seconda voce permette, mediante un sottomenu, di decidere il colore dei pixel del cluster
nell’immagine risultante; i colori possibili sono bianco (CTRL+H), grigio (CTRL+G) e
sfumature di grigio calcolate in base all’intensità del pixel nell’immagine iniziale
(CTRL+P).
3.2.3
Il menu Help
Posto sulla barra dei menu, presenta due voci: la prima, “Guide”, dà vita ad un sottomenu di
due voci; “Layout” (CTRL+L) apre una finestra modale contenente una breve spiegazione
del layout dell’interfaccia; “Menu” (CTRL+M) apre una finestra modale contenente una
breve guida ai menu della barra e ai menu contestuali. La seconda voce del menu Help,
“About” (CTRL+B), apre una finestra modale contenente i crediti dell’autore
dell’interfaccia.
3.2.4
I menu contestuali delle immagini
Si attivano con il clic del tasto destro sugli assi di ciascuna delle due immagini. Per
l’immagine di sinistra viene attivato un menu contestuale di due voci: il comando “Open”
apre la stessa finestra che si ottiene con il comando “Open image” del menu file (si rimanda
a 3.2.1); il comando “Zoom” apre una nuova finestra contenente l’immagine fortemente
ingrandita. Questa nuova finestra consente anche di salvare l’immagine. Il menu contestuale
dell’immagine di destra, invece, contiene solo la voce “Zoom” con la stessa funzione di
aprire una nuova finestra contenente l’immagine risultante ingrandita. In tal modo, possiamo
salvare i risultati dell’applicazione dell’algoritmo.
3.2.5
Il pannello Learning set
Posto nella zona inferiore sinistra dell’interfaccia, presenta due pulsanti mutuamente
esclusivi, che consentono di scegliere il set di apprendimento con il quale sono state ottenute
le misture di gaussiane che si vogliono utilizzare per il clustering. Il set numero 1 è quello in
cui la nona immagine di apprendimento (11,1% dei dati di apprendimento) è quella di un
prato secco; il set numero 2 è quello in cui la nona immagine di apprendimento (11,1% dei
dati di apprendimento) è quella di un prato fotografato da breve distanza.
9
3.2.6
Il pannello Parameters
Posto al centro della zona inferiore, il pannello presenta due cursori scorrevoli con due
relative caselle di testo. Il cursore superiore permette di scegliere il numero di componenti
presenti nella mistura di gaussiane che intendiamo utilizzare per la clusterizzazione ; il
numero scelto può variare da 3 a 11, e può essere modificato trascinando il cursore,
cliccando sullo scivolo ai lati del cursore oppure cliccando sulle frecce; la modifica della
variabile sarà immediatamente riportata nella casella di testo; la variabile può essere
modificata anche inserendo un valore numerico nella casella; un valore che ecceda i limiti
consentiti non produrrà alcun cambiamento, mentre un valore non intero verrà arrotondato al
più vicino valore intero. Il cursore inferiore permette di scegliere la soglia di appartenenza
dei pixel alla mistura; il numero scelto sarà moltiplicato per 10-9 , e può variare da 1 (soglia
10-9 ) a 1001 (soglia 1,001*10-6 ). Il cursore può essere trascinato sul punto desiderato; un clic
sulle frecce laterali produrrà una variazione unitaria della variabile, mentre un clic sullo
scivolo ai lati del cursore produrrà una variazione di 50 unità; la modifica della variabile
sarà immediatamente riportata nella casella di testo; la variabile può essere modificata anche
inserendo un valore numerico nella casella: un valore che ecceda i limiti consentiti non
produrà alcun cambiamento, mentre un valore non intero verrà arrotondato al più vicino
intero.
3.2.7
Il pannello Single points removal e il tasto Update
Sono entrambi situati nella parte inferiore destra della finestra dell’interfaccia grafica. Il
pannello presenta due pulsanti mutuamente esclusivi, che consentono di decidere se
effettuare o meno la rimozione dei punti isolati dall’immagine risultante (descritta in 2.4.2).
Il tasto “Update” è quello che avvia il calcolo del cluster di prati e alberi: una volta caricata
l’immagine che si intende clusterizzare e scelti il set di apprendimento, il numero di
componenti della mistura, la soglia di appartenenza e la rimozione o meno dei punti isolati,
la pressione del tasto “Update” cancella l’immagine risultante, sostituendola con una
temporanea di attesa, raccoglie i parametri scelti e avvia il calcolo basato su di essi,
disegnando alla fine la nuova immagine risultante.
3.3
Le funzioni dell’interfaccia grafica
In questo paragrafo verranno descritte le funzioni matlab utilizzate per la creazione e la
gestione dell’interfaccia grafica. I listati, all’interno dei quali si trovano ulteriori commenti
alle funzioni, sono consultabili nel capitolo 4.
3.3.1
EM.m ed EM.fig
La struttura principale del file .m e l’intero file .fig sono stati generati automaticamente
tramite l’utilità “Guide” di matlab, che permette di creare interfacce grafiche;
10
successivamente, l’intera interfaccia è stata programmata e gestita scrivendo il corpo delle
numerose funzioni presenti nel file .m, che verrà ora descritto.
La parte iniziale è generata automaticamente, e gestisce le proprietà dell’interfaccia; subito
dopo, la funzione EM_OpeningFcn, che viene eseguita prima che l’interfaccia venga resa
visibile su schermo, si occupa di inizializzare i valori di default, caricare l’immagine
iniziale, invocare per la prima volta la funzione gmcluster e disegnare l’immagine risultante
nella seconda finestra. Alla fine di ciascuna funzione, il comando guidata(hObject, handles)
ha il compito di aggiornare la struttura contenente i parametri condivisi tra le funzioni
all’interno dell’interfaccia. A questo punto l’interfaccia viene posta in attesa;
successivamente, dopo la funzione di output che ha scarsa importanza in questo contesto,
iniziano le funzioni di callback e di creazione di ciascun oggetto: le prime sono invocate
ogni volta che un oggetto viene utilizzato o attivato dall’utente; le altre sono invocate al
momento dell’apertura della finestra dell’interfaccia grafica.
La funzione slider1_Callback viene attivata dallo spostamento del cursore superiore del
pannello dei parametri: legge il nuovo valore segnato dal cursore, e sceglie il set di
parametri corrispondente alla scelta fatta; infine, setta il valore della casella di testo
corrispondente pari al nuovo valore scelto dall’utente tramite il cursore.
La funzione slide1_CreateFcn ha in questo caso solo il compito di impostare il colore di
sfondo dei cursori.
La funzione slider2_Callback viene attivata dallo spostamento del cursore inferiore del
pannello dei parametri: legge il nuovo valore segnato dal cursore, lo moltiplica per 10-9 e
pone la soglia di appartenenza corrente pari alla quantità appena calcolata; infine, setta il
valore della casella di testo corrispondente pari al nuovo valore scelto dall’utente tramite il
cursore.
Anche in questo caso, la funzione slide2_CreateFcn ha il solo compito di impostare il colore
di sfondo dei cursori.
La funzione gmctext_Callback viene attivata quando l’utente modifica il contenuto della
casella di testo corrispondente al numero di componenti nella mistura di gaussiane; se il
valore immesso è numerico e rientra nel range consentito, il cursore corrispondente verrà
portato su questo valore, e sarà scelto il set corrispondente di parametri della mistura; in
caso contrario, il valore del cursore, il quale non è stato modificato dall’utente, verrà usato
per ripristinare il valore precedente della casella di testo.
La funzione gmctext_CreateFcn ha il compito di impostare il colore di sfondo della casella
di testo, in base al sistema operativo utilizzato.
La funzione threshtext_Callback viene attivata quando l’utente modifica il contenuto della
casella di testo corrispondente alla soglia di appartenenza ; se il valore immesso è numerico e
rientra nel range consentito, il cursore corrispondente verrà portato su questo valore, il
quale, moltiplicato per 10-9 , diventerà la soglia corrente; altrimenti, il valore del cursore, il
quale non è stato modificato dall’utente, verrà usato per ripristinare il valore precedente
della casella di testo.
La funzione threshtext_CreateFcn ha il compito di impostare il colore di sfondo della casella
di testo, in base al sistema operativo utilizzato.
La funzione pushbutton1_Callback viene invocata dalla pressione del tasto “Update” nella
finestra dell’interfaccia; immediatamente viene disegnata sulla seconda finestra
un’immagine di attesa; viene poi invocata la funzione gmcluster passando come parametri
l’immagine corrente, il set di apprendimento e i parametri della mistura di gaussiane
selezionata dall’utente, la soglia corrente e la scelta se rimuovere o meno i punti isolati;
ottenuta l’immagine risultante, questa viene disegnata nella seconda finestra.
11
La funzione white_Callback, attivata dalla voce “White” del menu “View/Cluster color”,
pone a 255 (bianco) tutti i pixel dell’immagine risultante che sono marcati come generati
dalla mistura di gaussiane.
La funzione gray_Callback, attivata dalla voce “Gray” del menu “View/Cluster color”, pone
a 40 (tono di grigio scuro) tutti i pixel dell’immagine risultante che sono marcati come
generati dalla mistura di gaussiane.
La funzione pix_Callback, attivata dalla voce “Original pixel intensity” del menu
“View/Cluster color”, calcola il valore di intensità dei pixel dell’immagine originali marcati
come generati dalla mistura di gaussiane, calcolando la media della metà delle intensità di
rosso, verde e blu; imposta poi l’intensità di grigio del corrispondente pixel nell’immagine
risultant e pari al valore appena calcolato.
La funzione open_Callback, invocata dalla voce “Open image” del menu “File” e dalla voce
“Open” del menu contestuale dell’immagine iniziale, chiama la funzione modalbox
(descritta in 3.3.5) e attende la risposta dell’utente: se la risposta è “Close”, non compie
nessuna azione; se la risposta è “No”, viene generata una finestra con un messaggio di
errore; se la risposta è il nome di un file, nel caso in cui il file sia di uno dei tipi di immagine
riconosciuti, viene impostato come immagine corrente e disegnato nella prima finestra;
altrimenti, viene generato un messaggio di errore.
La funzione defa_Callback, invocata dalla scelta della voce “Default” dal menu “View”,
carica l’immagine di default e la disegna nella prima finestra, imposta tutti i parametri ai
valori di default, aggiornando cursori, pulsanti e caselle di testo, calcola nuovamente
l’immagine risultante e la disegna nella seconda finestra.
La funzione about_Callback, attivata dalla voce “About” del menu “Help” chiama la
funzione modalabout (descritta in 3.3.2) e non compie nessuna azione, una volta ricevuta la
risposta dell’utente, non importante in questo caso.
La funzione zoom_Callback, attivata dalla voce “Zoom” del menu contestuale
dell’immagine di sinistra, apre una nuova finestra, di dimensioni leggermente inferiori a
quelle dello schermo, e vi disegna l’immagine corrente.
La funzione zoom2_Callback, attivata dalla voce “Zoom” del menu contestuale
dell’immagine di destra, apre una nuova finestra, di dimensioni leggermente inferiori a
quelle dello schermo, e vi disegna l’immagine risultante corrente.
La funzione buttonset1_Callback, attivata dalla selezione del pulsante “Set 1” nel pannello
di sinistra, imposta come array corrente dei vari parametri di mistura di gaussiane quello
ottenuto col il set di apprendimento numero 1.
La funzione buttonset2_Callback, attivata dalla selezione del pulsante “Set 2” nel pannello
di sinistra, imposta come array corrente dei vari parametri di mistura di gaussiane quello
ottenuto col il set di apprendimento numero 2.
La funzione panelset_SelectionChangeFcn svolge lo stesso ruolo delle due funzioni appena
descritte, supervisionando l’esclusività mutua dei due pulsanti.
La funzione buttonon_Callback, attivata dalla selezione del pulsante “On” nel pannello di
destra, imposta a 1 il valore della variabile che indica se effettuare la rimozione dei punti
isolati nell’immagine di destra.
La funzione buttonoff_Callback, attivata dalla selezione del pulsante “Off” nel pannello di
destra, imposta a 0 il valore della variabile che indica se effettuare la rimozione dei punti
isolati nell’immagine di destra.
La funzione panelrem_SelectionChangeFcn svolge lo stesso ruolo delle due funzioni appena
descritte, supervisionando l’esclusività mutua dei due pulsanti.
12
La funzione lay_Callback, attivata dalla voce “Layout” del menu “Help/Guide” chiama la
funzione modalguide (descritta in 3.3.3) e non compie nessuna azione, una volta ricevuta la
risposta dell’utente, non importante in questo caso.
La funzione menu_Callback, attivata dalla voce “Menu” del menu “Help/Guide” chiama la
funzione modalmenu (descritta in 3.3.4) e non compie nessuna azione, una volta ricevuta la
risposta dell’utente, non importante in questo caso.
3.3.2
modalabout.m e modalabout.fig
I due file sono stati generati quasi del tutto automaticamente, tramite l’utilità “Guide” di
matlab, e gestiscono la finestra modale contenente i crediti dell’autore dell’interfaccia
grafica. Il testo che compare nella finestra è una proprietà inserita tramite “Guide” e inclusa
nel file .fig, mentre il file .m gestisce la creazione e la chiusura della finestra. Un solo tasto è
disponibile, e permette di chiudere la finestra e tornare a quella principale; lo stesso risultato
può essere ottenuto chiudendo la finestra col tasto di chiusura in alto a destra o premendo il
tasto Escape sulla tastiera. Come già scritto precedentemente, il valore passato dall’utente
alla funzione chiamante EM.m non è rilevante in questo caso.
3.3.3
modalguide.m e modalguide.fig
Anche in questo caso, i due file sono stati generati automaticamente, tramite “Guide”, e
gestiscono la finestra modale di guida al layout dell’interfaccia grafica. Il testo che compare
nella finestra è una proprietà inserita tramite “Guide” e inclusa nel file .fig, mentre il file .m
gestisce la creazione della finestra, l’inserimento dell’icona di aiuto e del pulsante di
chiusura nella parte a sinistra della casella di testo e la chiusura della finestra. La pressione
del pulsante di chiusura della finestra, del tasto di chiusura in alto a destra o del tasto Escape
sulla tastiera, provocano la chiusura della finestra e il passaggio del valore di output alla
funzione chiamante; anche in questo caso, tale valore non è rilevante.
3.3.4
modalmenu.m e modalmenu.fig
Anche in questo caso, i due file sono stati generati automaticamente, tramite “Guide”, e
gestiscono la finestra modale di guida ai menu contestuali e della barra dei menu
dell’interfaccia grafica. Il testo che compare nella finestra è una proprietà inserita tramite
“Guide” e inclusa nel file .fig, mentre il file .m gestisce la creazione della finestra,
l’inserimento dell’icona di aiuto e del pulsante di chiusura nella parte a sinistra della casella
di testo e la chiusura della finestra. La pressione del pulsante di chiusura della finestra, del
tasto di chiusura in alto a destra o del tasto Escape sulla tastiera, provocano la chiusura della
finestra e il passaggio del valore di output alla funzione chiamante; anche in questo caso,
tale valore non è rilevante.
13
3.3.5
modalbox.m e modalbox.fig
Il file .fig e la struttura di base del file .m sono stati generati automaticamente tramite
“Guide”, e gestiscono l’apertura della finestra che elenca il contenuto della cartella corrente,
e il caricamento di file; il valore passato in uscita dall’utente sarà il nome di un file, oppure
le stringhe “No” e “Close”, che producono risultati diversi nella funzione chiamante (si
rimanda a 3.3.1).
Dopo la parte di codice relativa alla creazione della finestra, la funzione
modalbox_OpeningFcn imposta l’output di default a “Clo se”, poi legge la cartella corrente,
ordina il contenuto per nome attribuendo ad ogni riga (nome di cartella o di file) un indice
numerico e mostra l’elenco dei file in una listbox.
Seguono a questo punto le funzioni di posizionamento della finestra, di disegno dell’icona di
aiuto, di impostazione della finestra a modale e di attesa.
La funzione pushbutton1_Callback, invocata dalla pressione del pulsante “Yes”, legge il
valore attualmente selezionato nella lista; se si tratta di una cartella, imposta il nuovo valore
della cartella corrente pari a questo valore attualmente selezionato, e carica il nuovo
contenuto, allo stesso modo di prima: legge la cartella corrente, ordina il contenuto per nome
attribuendo ad ogni riga un indice numerico e mostra l’elenco dei file nella listbox. Se
invece si tratta di un file, il valore di output viene posto uguale al nome del file, e il
comando uiresume interrompe l’attesa e invoca la funzione di uscita, che passerà il nome del
file alla funzione chiamante e chiuderà la finestra modale di caricamento dei file.
La funzione pushbutton2_Callback, invocata dalla pressione del pulsante “No”, passa la
stringa “Close” come valore di uscita.
La prossima funzione che è stata modificata, è la listbox1_Callback, invocata ogni volta che
l’utente modifica la sua selezione all’interno della listbox. Se si tratta di un clic singolo, la
funzione si occupa solo di leggere il nuovo valore della stringa selezionata e di impostare il
valore della variabile che indica se si tratta di una cartella (1) o di un file (0); se invece si
tratta di un doppio clic, se la riga selezionata è quella di una cartella, la funzione imposta il
nuovo valore della cartella corrente pari a questo valore attualmente selezionato, e carica il
nuovo contenuto, allo stesso modo di prima: legge la cartella corrente, ordina il contenuto
per nome attribuendo ad ogni riga un indice numerico e mostra l’elenco dei file nella listbox.
Se invece si tratta di un file, il valore di output viene posto uguale al nome del file, e il
comando uiresume interrompe l’attesa e invoca la funzione di uscita, che passerà il nome del
file alla funzione chiamante e chiuderà la finestra modale di caricamento dei file.
La funzione load_listbox, suggerita nella guida all’utilizzo di “Guide”, è stata lasciata nel
listato ma non è più invocata, in quanto provocava errori: considerata una funzione esterna
all’interfaccia, non aveva la possibilità di modificare variabili condivise dalle funzioni
interne dell’interfaccia; per questo motivo, alle sue chiamate è stato sostituito l’intero corpo
della funzione.
La funzione listbox1_CreateFcn ha il solo compito di impostare i colori della listbox.
14
4
Listati delle funzioni matlab
Per semplicità e per motivi di spazio, le righe vuote sono state eliminate. I commenti sono
riportati in corsivo.
4.1
gmem.m
% GMEM - Gaussian mixture parameters with EM exstimation
% par=gmem(data)
% par=gmem(data,<params>)
% [par,stats] = gmmb_em(...)
% data=NxD matrix, N points, D dimensions.
% params is a list of ('field',value) pairs.
% stats is a matrix (loops, final log-likelihood).
% parameters - default value between ():
% maxloops maximum number of loops. (100)
% thr
convergence threshold: when the log-likelihood change
%
reaches this value, looping stops. Set a negative value
%
to use only the maxloops condition. (1e-6)
% components number of components in Gaussian mixture. (3)
% verbose if 1, progress messages will be printed. (0)
% init
structure with two components, init.mu=DxC matrix,
%
init.sigma=DxDxC array, C=number of components in GM.
%
if not empty, GM parameters will be initialized with
%
these values. ([])
% Example:
% par=gmem(data, 'components', 5, 'thr', 1e-8)
% Author: Cesare Guariniello <[email protected]>
% 01/09/2004
function [estimate,varargout] = gmem(data,varargin);
% default parameters
max_loops=100;
em_threshold=1e-6;
C=3;
verbose=0;
init=[];
% parameter parsing
argc = nargin-1;
for argl = 1:2:(argc-1)
switch lower(varargin{argl}) %conversion to lowercase letters
case 'maxloops'
max_loops=varargin{argl
case 'thr'
em_threshold=varargin{argl+1};
case 'components'
C=varargin{argl+1};
case 'verbose'
verbose=varargin{argl+1};
case 'init'
init=varargin{argl+1};
otherwise
disp(['unknown parameter ' varargin{argl}]);
end
end
N=size(data,1);
D=size(data,2);
if isempty(init)
% mu initialization. Fcm initialization has been choosen because it has
% a random nature (so result will vary), but it's a somehow
% "intelligent" way to initialize our parameters, because it's however
15
% a cluster-center-choosing method, based on fuzzy c-mean clustering.
if C>1
mu=fcm(data, C, [2.0 100 1e-3 verbose]).';
else
% in case of unidimensional distribution, mu is simply the mean value
% of the data.
mu=mean(data, 1).';
end
% covariances initialization. For each component, it's the diagonal
% matrix having the values of the diagonal of covariance calculated on
% the data. The covfixer function forces a matrix to be a valid
% covariance matrix.
sigmat=covfixer(diag(diag(cov(data))));
sigma=zeros(D,D,C);
for i=1:C
sigma(:,:,i)=sigmat;
end
else
C=size(init.mu, 2);
mu=init.mu;
sigma=zeros(D,D,C);
for i=1:C
sigma(:,:,i)=covfixer(init.sigma(:,:,i));
end
end
% weights initialization
weight=ones(C,1)*(1/C);
% values for stopping condition initialization
old_loglike=-realmax;
loops=1;
prob=gmprob(data, mu, sigma, weight); % p(Xj|C=i)p(C=i)
while 1
% one EM cycle
pij = prob ./ (sum(prob,2)*ones(1,C)); %normalization with "alfa"
for i = 1:C
% calculate new estimates
psum=sum(pij(:,i)); %pi
% weights
weight(i) = 1/N*psum; %normalized weights
% mu
nmu=sum(data.*(pij(:,i)*ones(1,D)), 1).' ./ psum;
% .* is array multiply, element by element
mu(:,i)=nmu;
% covariances
moddata = (data - ones(N,1)*(nmu.')) .* (sqrt(pij(:,i))*ones(1,D));
% sqrt(pij) is because it will be squared back
nsigma = (moddata' * moddata) ./ psum;
% covariance matrix goodness forcing
sigma(:,:,i)=covfixer(nsigma);
end
% finish test
prob=gmprob(data, mu, sigma, weight);
loglike=sum(log(sum(prob, 2)));
if verbose
disp([ 'log-likelihood change is ' num2str(loglike-old_loglike) ' on round ' num2str(loops) ]);
end
if abs(loglike-old_loglike)<em_threshold
break;
end
if loops>=max_loops
break;
end
loops=loops+1;
old_loglike=loglike;
end
16
estimate=struct('mu', mu,...
'sigma', sigma,...
'weight', weight);
if(nargout>1)
varargout(1)={[loops loglike]};
end
% -----------------------------------------function prob=gmprob(data, mu, sigma, weight);
N=size(data, 1);
C=size(weight,1);
pxcomp=zeros(N,C);
for i=1:C
pxcomp(:,i)=mvnpdf(data, mu(:,i).', sigma(:,:,i)); %p(Xj|C=i)
end
prob=pxcomp.*repmat(weight.', N,1);
4.2
fcm.m
function [center, U, obj_fcn] = fcm(data, cluster_n, options)
%FCM Data set clustering using fuzzy c-means clustering.
% [CENTER, U, OBJ_FCN] = FCM(DATA, N_CLUSTER) finds N_CLUSTER number of
% clusters in the data set DATA. DATA is size M-by-N, where M is the number of
% data points and N is the number of coordinates for each data point. The
% coordinates for each cluster center are returned in the rows of the matrix
% CENTER. The membership function matrix U contains the grade of membership of
% each DATA point in each cluster. The values 0 and 1 indicate no membership
% and full membership respectively. Grades between 0 and 1 indicate that the
% data point has partial membership in a cluster. At each iteration, an
% objective function is minimized to find the best location for the clusters
% and its values are returned in OBJ_FCN.
% [CENTER, ...] = FCM(DATA,N_CLUSTER,OPTIONS) specifies a vector of options
% for the clustering process:
%
OPTIONS(1): exponent for the matrix U
(default: 2.0)
%
OPTIONS(2): maximum number of iterations
(default: 100)
%
OPTIONS(3): minimum amount of improvement
(default: 1e-5)
%
OPTIONS(4): info display during iteration
(default: 1)
% The clustering process stops when the maximum number of iterations
% is reached, or when the objective function improvement between two
% consecutive iterations is less than the minimum amount of improvement
% specified. Use NaN to select the default value.
% Example
%
data = rand(100,2);
%
[center,U,obj_fcn] = fcm(data,2);
%
plot(data(:,1), data(:,2),'o');
%
hold on;
%
maxU = max(U);
%
% Find the data points with highest grade of membership in cluster 1
%
index1 = find(U(1,:) == maxU);
%
% Find the data points with highest grade of membership in cluster 2
%
index2 = find(U(2,:) == maxU);
%
line(data(index1,1),data(index1,2),'marker','*','color','g');
%
line(data(index2,1),data(index2,2),'marker','*','color','r');
%
% Plot the cluster centers
%
plot([center([1 2],1)],[center([1 2],2)],'*','color','k')
%
hold off;
% See also FCMDEMO, INITFCM, IRISFCM, DISTFCM, STEPFCM.
% Roger Jang, 12-13-94, N. Hickey 04-16-01
% Copyright 1994-2002 The MathWorks, Inc.
% $Revision: 1.13 $ $Date: 2002/04/14 22:20:38 $
if nargin ~= 2 & nargin ~= 3,
error('Too many or too few input arguments!');
17
end
data_n = size(data, 1);
in_n = size(data, 2);
% Change the following to set default options
default_options = [2;
% exponent for the partition matrix U
100;
% max. number of iteration
1e-5;
% min. amount of improvement
1];
% info display during iteration
if nargin == 2,
options = default_options;
else
% If "options" is not fully specified, pad it with default values.
if length(options) < 4,
tmp = default_options;
tmp(1:length(options)) = options;
options = tmp;
end
% If some entries of "options" are nan's, replace them with defaults.
nan_index = find(isnan(options)==1);
options(nan_index) = default_options(nan_index);
if options(1) <= 1,
error('The exponent should be greater than 1!');
end
end
expo = options(1);
% Exponent for U
max_iter = options(2);
% Max. iteration
min_impro = options(3);
% Min. improvement
display = options(4);
% Display info or not
obj_fcn = zeros(max_iter, 1); % Array for objective function
U = initfcm(cluster_n, data_n);
% Initial fuzzy partition
% Main loop
for i = 1:max_iter,
[U, center, obj_fcn(i)] = stepfcm(data, U, cluster_n, expo);
if display,
fprintf('Iteration count = %d, obj. fcn = %f\n', i, obj_fcn(i));
end
% check termination condition
if i > 1,
if abs(obj_fcn(i) - obj_fcn(i-1)) < min_impro, break; end,
end
end
iter_n = i;
% Actual number of iterations
obj_fcn(iter_n+1:max_iter) = [];
4.3
covfixer.m
function nsigma = covfixer(sigma);
% COVFIXER forces matrix to be a valid covariance matrix
% covmatrix=COVFIXER(matrix)
% Matrix is forced to be (complex conjugate) symmetric,
% positive definite and its diagonal real valued.
% isspd() function is taken from the file mvnpdf.m.
D=size(sigma,1);
covfixmat=ones(D)+0.01*diag(ones(D,1));
nsigma=imagfixer(sigma);
while isspd(nsigma)==0
% covariance matrix is not positive definite
% fix it
if any(diag(nsigma)<=0)
% any value of diag is negative
% add 1% of max of diag to diag
18
nsigma=nsigma+(covfixmat-1)*max(abs(diag(nsigma))+realmin);
% realmin is against looping
else
% increase diagonal values by 1 percent
nsigma=nsigma .* covfixmat;
end
end
% -----------------function [t,R] = isspd(Sigma)
% ISSPD Test if a matrix is positive definite symmetric
% T=ISSPD(SIGMA) returns a logical indicating whether the matrix SIGMA is
% square, symmetric, and positive definite, i.e., it is a valid full rank
% covariance matrix.
%
% [T,R]=ISSPD(SIGMA) returns the cholesky factor of SIGMA in R. If SIGMA
% is not square symmetric, ISSPD returns [] in R.
% Test for square, symmetric
[n,m] = size(Sigma);
if (n == m) & all(all(abs(Sigma - Sigma') < 10*eps*max(abs(diag(Sigma)))));
% Test for positive definiteness
[R,p] = chol(Sigma);
if p == 0
t = 1;
else
t = 0;
end
else
R = [];
t = 0;
end
% -----------------function nsigma=imagfixer(sigma);
% force symmetric
nsigma=sigma-(sigma-sigma')/2;
% delete imag
del=imag(diag(nsigma));
nsigma=nsigma-diag(del)*sqrt(-1);
if max(del)>1e-3
WARNING('Big imaginary components removed from the diagonal');
end
4.4
mvnpdf.m
function y = mvnpdf(X, Mu, Sigma)
%MVNPDF Multivariate normal probability density function (pdf).
% Y = MVNPDF(X) returns the n-by-1 vector Y, containing the probability
% density of the multivariate normal distribution with zero mean and
% identity covariance matrix, evaluated at each row of the n-by-d matrix
% X. Rows of X correspond to observations and columns correspond to
% variables or coordinates.
% Y = MVNPDF(X,MU) returns the density of the multivariate normal
% distribution with mean MU and identity covariance matrix, evaluated
% at each row of X. MU is a 1-by-d vector, or an n-by-d matrix, in which
% case the density is evaluated for each row of X with the corresponding
% row of MU. MU can also be a scalar value, which MVNPDF replicates to
% match the size of X.
% Y = MVNPDF(X,MU,SIGMA) returns the density of the multivariate normal
% distribution with mean MU and covariance SIGMA, evaluated at each row
% of X. SIGMA is a d-by-d matrix, or an d-by-d-by-n array, in which case
% the density is evaluated for each row of X with the corresponding page
% of SIGMA, i.e., MVNPDF computes Y(I) using X(I,:) and SIGMA(:,:,I).
19
%
%
%
%
%
%
%
%
%
%
%
%
Pass in the empty matrix for MU to use its default value when you want
to only specify SIGMA.
If X is a 1-by-d vector, MVNPDF replicates it to match the leading
dimension of MU or the trailing dimension of SIGMA.
Example:
mu = [1 -1];
Sigma = [.9 .4; .4 .3];
X = mvnrnd(mu, Sigma, 10);
p = mvnpdf(X, mu, Sigma);
See also MVNRND, NORMPDF.
Copyright 1993-2004 The MathWorks, Inc.
$Revision: 1.2.4.2 $ $Date: 2004/01/16 20:09:41 $
if nargin < 1 | isempty(X)
error('stats:mvnpdf:InputSizeMismatch','Requires the input argument X.');
elseif ndims(X) > 2
error('stats:mvnpdf:InvalidData','X must be a matrix.');
end
% Get size of data. Column vectors provisionally interpreted as multiple scalar data.
[n,d] = size(X);
% Assume zero mean, data are already centered
if nargin < 2 | isempty(Mu)
X0 = X;
% Get scalar mean, and use it to center data
elseif prod(size(Mu)) == 1
X0 = X - Mu;
% Get vector mean, and use it to center data
elseif ndims(Mu) == 2
[n2,d2] = size(Mu);
if d2 ~= d % has to have same number of coords as X
error('stats:mvnpdf:InputSizeMismatch',...
'X and MU must have the same number of columns.');
elseif n2 == n % lengths match
X0 = X - Mu;
elseif n2 == 1 % mean is a single row, rep it out to match data
X0 = X - repmat(Mu,n,1);
elseif n == 1 % data is a single row, rep it out to match mean
n = n2;
X0 = repmat(X,n2,1) - Mu;
else % sizes don't match
error('stats:mvnpdf:InputSizeMismatch',...
'X or MU must be a row vector, or X and MU must have the same number of rows.');
end
else
error('stats:mvnpdf:BadMu','MU must be a matrix.');
end
% Assume identity covariance, data are already standardized
if nargin < 3 | isempty(Sigma)
% Special case: if Sigma isn't supplied, then interpret X
% and Mu as row vectors if they were both column vectors
if d == 1 & prod(size(X)) > 1
X0 = X0';
[n,d] = size(X0);
end
xRinv = X0;
sqrtInvDetSigma = 1;
% Single covariance matrix
elseif ndims(Sigma) == 2
% Special case: if Sigma is supplied, then use it to try to interpret
% X and Mu as row vectors if they were both column vectors.
if (d == 1 & prod(size(X)) > 1) & size(Sigma,1) == n
X0 = X0';
[n,d] = size(X0);
end
% Make sure Sigma is the right size
if size(Sigma,1) ~= d | size(Sigma,2) ~= d
20
error('stats:mvnpdf:BadSigma',...
'SIGMA must be a square matrix with size equal to the number of columns in X.');
else
% Make sure Sigma is a valid covariance matrix
[spd,R] = isspd(Sigma);
if spd
% Create array of standardized data, vector of inverse det
xRinv = X0 / R;
sqrtInvDetSigma = 1 / prod(diag(R));
else
error('stats:mvnpdf:BadSigma',...
'SIGMA must be symmetric and positive definite.');
end
end
% Multiple covariance matrices
elseif ndims(Sigma) == 3
% Special case: if Sigma is supplied, then use it to try to interpret
% X and Mu as row vectors if they were both column vectors.
if (d == 1 & prod(size(X)) > 1) & size(Sigma,1) == n
X0 = X0';
[n,d] = size(X0);
end
% Data and mean are a single row, rep them out to match covariance
if n == 1 % already know size(Sigma,3) > 1
n = size(Sigma,3);
X0 = repmat(X0,n,1); % rep centered data out to match cov
end
% Make sure Sigma is the right size
if size(Sigma,1) ~= d | size(Sigma,2) ~= d
error('stats:mvnpdf:InputSizeMismatch',...
'Each page of SIGMA must be a square matrix with size equal to the number of columns in X.');
elseif size(Sigma,3) ~= n
error('stats:mvnpdf:InputSizeMismatch',...
'SIGMA must have one page for each row of X.');
else
% Create array of standardized data, vector of inverse det
xRinv = zeros(n,d);
sqrtInvDetSigma = zeros(n,1);
for i = 1:n
% Make sure Sigma is a valid covariance matrix
[spd,R] = isspd(Sigma(:,:,i));
if spd
xRinv(i,:) = X0(i,:) / R;
sqrtInvDetSigma(i) = 1 / prod(diag(R));
else
error('stats:mvnpdf:BadSigma',...
'SIGMA must be symmetric and positive definite.');
end
end
end
elseif ndims(Sigma) > 3
error('stats:mvnpdf:BadSigma',...
'SIGMA must be a matrix or a 3 dimensional array.');
end
% Exponents in pdf are the inner products of the standardized data
quadform = sum(xRinv.^2, 2);
y = sqrt((2*pi)^(-d)) * sqrtInvDetSigma .* exp(-0.5*quadform);
4.5
gmpdf.m
% GMPDF Gaussian mixture probability distribution function
% Calculates the probability of each (D-dimensional) point of a vector x
21
% on a C-components Gaussian mixture pdf.
% p = gmpdf (x, mu, sigma, weight)
% x = N x D matrix
% mu = D x C matrix
% sigma = D x D x C array
% weight = C x 1 vector
% p = N x 1 vector
% D dimensions, N points, C components
% Author: Cesare Guariniello <[email protected]>
% 01/09/2004
function [p] = gmpdf(x, mu, sigma, weight);
N=size(x,1);
C=size(weight,1);
p=zeros(N,1);
for i=1:C,
p=p+weight(i)*mvnpdf(x,mu(:,i).',sigma(:,:,i));
end
4.6
gmcluster.m
% GMCLUSTER - Image clustering with gaussian mixture
% imgout=gmcluster(imgin, mu, sigma, weight)
% imgout=gmcluster(imgin, mu, sigma, weight, <params>)
% imgin=HxWx3 array, H height, W width. 16 million colors RGB image
% (can be imported from a .bmp, .jpg, .gif file).
% mu=3xC matrix, C=number of components in GM.
% sigma=3x3xC array.
% weight=Cx1 vector.
% params is a list of ('field',value) pairs.
% function returns imgout=HxW array. 256 tones Gray scale (only B/W used).
% parameters - default between ():
% thr belonging threshold (0<=thr<=1). If the probability density
%
of the GM, evaluated at pixel (i,j) of imgin is higher than
%
threshold, the value of the correspondant pixel of imgout
%
is set at 255, so that this pixel is marked as generated
%
by the GM. (4e-7).
% spr single points removal. If 1, the removal of single black or
%
white pixels from imgout will be performed. (1)
% Example:
% imgout=gmcluster(imgin, mu, sigma, weight, 'thr', 8e-8)
% Author: Cesare Guariniello <[email protected]>
% 03/09/2004
function imgout=gmcluster(imgin,mu,sigma,weight,varargin);
% default parameters
threshold=4e-7;
removal=1;
% Size of data control
if nargin < 4
error('InputSizeMismatch. Requires at least 4 input arguments.');
elseif ndims(imgin) ~= 3 | size(imgin,1)==0 | size(imgin,2)==0 | size(imgin,3) ~= 3
error('InvalidData. First input argument must be a HxWx3 array.');
elseif ndims(mu) ~= 2 | ndims(sigma)~=3 | ndims(weight)~=2| size(mu,1) ~=3 | size(sigma,1)~=3|size(sigma,2)~=3|...
size(weight,2)~=1|size(mu,2)~=size(sigma,3)|size(mu,2)~=size(weight,1)
error('InvalidData. Mu must be a 3xC matrix, sigma must be a 3x3xC array, weight must be a Cx1 vector.');
end
% Parameter parsing
argc = nargin-4;
for argl=1:2:(argc-1)
switch lower(varargin{argl}) %conversion to lowercase letters
case 'thr'
if varargin{argl+1}>=0 & varargin{argl+1}<=1
threshold=varargin{argl+1};
22
else warning('OutOfRange threshold.');
end
case 'spr'
removal=varargin{argl+1};
otherwise
disp(['unknown parameter ' varargin{argl}]);
end
end
H=size(imgin,1);
W=size(imgin,2);
result=zeros(H,W);
for i=1:W,
x=double([imgin(:,i,1),imgin(:,i,2),imgin(:,i,3)]);
p=gmpdf(x, mu, sigma, weight);
for j=1:H,
if p(j)>threshold
result(j,i)=255;
end
end
end
if removal
for i=2:H-1,
for j=2:W-1,
if result(i,j)==0
if (result(i-1,j-1)+result(i-1,j)+result(i-1,j+1)+result(i,j-1)+...
result(i,j+1)+result(i+1,j-1)+result(i+1,j)+result(i+1,j+1))>1400
result(i,j)=255;
end
end
end
end
for i=2:H-1,
for j=2:W-1,
if result(i,j)==255
if (result(i-1,j-1)+result(i-1,j)+result(i-1,j+1)+result(i,j-1)+...
result(i,j+1)+result(i+1,j-1)+result(i+1,j)+result(i+1,j+1))<520
result(i,j)=0;
end
end
end
end
end
imgout=result;
4.7
EM.m
function varargout = EM(varargin)
% EM M-file for EM.fig
%
EM, by itself, creates a new EM or raises the existing
%
singleton*.
%
H = EM returns the handle to a new EM or the handle to
% the existing singleton*.
% EM('CALLBACK',hObject,eventData,handles,...) calls the local
%
function named CALLBACK in EM.M with the given input arguments.
% EM('Property','Value',...) creates a new EM or raises the
%
existing singleton*. Starting from the left, property value pairs are
23
% applied to the GUI before EM_OpeningFunction gets called. An
% unrecognized property name or invalid value makes property application
%
stop. All inputs are passed to EM_OpeningFcn via varargin.
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)".
% See also: GUIDE, GUIDATA, GUIHANDLES
% Copyright 2002-2003 The MathWorks, Inc.
% Edit the above text to modify the response to help EM
% Last Modified by GUIDE v2.5 06-Sep-2004 01:18:56
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',
mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @EM_OpeningFcn, ...
'gui_OutputFcn', @EM_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before EM is made visible.
function EM_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to EM (see VARARGIN)
load('emstime.mat');
handles.currentimage=imread('DSC00837.jpg');
axes(handles.fig1);
image(handles.currentimage);
handles.currentcomp='st05';
handles.currentthr=3e-7;
handles.currentset=stima2;
handles.currentrem=1;
handles.currentresult=gmcluster(handles.currentimage, handles.currentset.(handles.currentcomp).mu, ...
handles.currentset.(handles.currentcomp).sigma, handles.currentset.(handles.currentcomp).weight, 'thr', handles.currentthr, ...
'spr', handles.currentrem);
axes(handles.fig2);
image(handles.currentresult);colormap(gray);
% Choose default command line output for EM
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes EM wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = EM_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
% --- Executes on slider movement.
function slider1_Callback(hObject, eventdata, handles)
% hObject handle to slider1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
temp=uint8(get(hObject, 'Value'));
24
switch temp
case 3
handles.currentcomp='st03';
case 4
handles.currentcomp='st04';
case 5
handles.currentcomp='st05';
case 6
handles.currentcomp='st06';
case 7
handles.currentcomp='st07';
case 8
handles.currentcomp='st08';
case 9
handles.currentcomp='st09';
case 10
handles.currentcomp='st10';
case 11
handles.currentcomp='st11';
end
set(handles.gmctext,'String', int2str(temp));
guidata(hObject, handles);
% Hints: get(hObject,'Value') returns position of slider
%
get(hObject,'Min') and get(hObject,'Max') to determine range of slider
% --- Executes during object creation, after setting all properties.
function slider1_CreateFcn(hObject, eventdata, handles)
% hObject handle to slider1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: slider controls usually have a light gray background, change
%
'usewhitebg' to 0 to use default. See ISPC and COMPUTER.
usewhitebg = 1;
if usewhitebg
set(hObject,'BackgroundColor',[.9 .9 .9]);
else
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end
% --- Executes on slider movement.
function slider2_Callback(hObject, eventdata, handles)
% hObject handle to slider2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
handles.currentthr=1e-9*get(hObject,'Value');
set(handles.threshtext,'String', int2str(uint16(get(hObject,'Value'))));
guidata(hObject, handles);
% Hints: get(hObject,'Value') returns position of slider
%
get(hObject,'Min') and get(hObject,'Max') to determine range of slider
% --- Executes during object creation, after setting all properties.
function slider2_CreateFcn(hObject, eventdata, handles)
% hObject handle to slider2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: slider controls usually have a light gray background, change
%
'usewhitebg' to 0 to use default. See ISPC and COMPUTER.
usewhitebg = 1;
if usewhitebg
set(hObject,'BackgroundColor',[.9 .9 .9]);
else
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end
function gmctext_Callback(hObject, eventdata, handles)
% hObject handle to edit1 (see GCBO)
25
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit1 as text
%
str2double(get(hObject,'String')) returns contents of edit1 as a double
val = uint8(str2double(get(hObject,'String')));
if isnumeric(val) & ...
val >= get(handles.gmcslid,'Min') & ...
val <= get(handles.gmcslid,'Max')
set(handles.gmcslid,'Value',val);
set(hObject,'String', num2str(val));
switch val
case 3
handles.currentcomp='st03';
case 4
handles.currentcomp='st04';
case 5
handles.currentcomp='st05';
case 6
handles.currentcomp='st06';
case 7
handles.currentcomp='st07';
case 8
handles.currentcomp='st08';
case 9
handles.currentcomp='st09';
case 10
handles.currentcomp='st10';
case 11
handles.currentcomp='st11';
end
else
set(hObject,'String', int2str(uint8(get(handles.gmcslid, 'Value'))));
end
guidata(hObject, handles);
% --- Executes during object creation, after setting all properties.
function gmctext_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
%
See ISPC and COMPUTER.
if ispc
set(hObject,'BackgroundColor','white');
else
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end
function threshtext_Callback(hObject, eventdata, handles)
% hObject handle to edit2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit2 as text
%
str2double(get(hObject,'String')) returns contents of edit2 as a double
val = uint16(str2double(get(hObject,'String')));
if isnumeric(val) & ...
val >= get(handles.slider2,'Min') & ...
val <= get(handles.slider2,'Max')
set(handles.slider2,'Value',val);
set(hObject,'String', num2str(val));
handles.currentthr=1e-9*str2double(get(hObject,'Value'));
else
set(hObject,'String', int2str(uint16(get(handles.slider2, 'Value'))));
end
guidata(hObject, handles);
26
% --- Executes during object creation, after setting all properties.
function threshtext_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
%
See ISPC and COMPUTER.
if ispc
set(hObject,'BackgroundColor','white');
else
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
A=imread('wait.jpg');
axes(handles.fig2);
image(A);
drawnow;
handles.currentresult=gmcluster(handles.currentimage, handles.currentset.(handles.currentcomp).mu, ...
handles.currentset.(handles.currentcomp).sigma, handles.currentset.(handles.currentcomp).weight, 'thr', handles.currentthr, ...
'spr', handles.currentrem);
axes(handles.fig2);
image(handles.currentresult);colormap(gray);
guidata(hObject, handles);
% -------------------------------------------------------------------function white_Callback(hObject, eventdata, handles)
% hObject handle to white (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
A=imread('wait.jpg');
axes(handles.fig2);
image(A);
drawnow;
for i=1:size(handles.currentresult, 1)
for j=1:size(handles.currentresult, 2)
if handles.currentresult(i,j)>0
handles.currentresult(i,j)=255;
end
end
end
axes(handles.fig2);
image(handles.currentresult);colormap(gray);
% -------------------------------------------------------------------function gray_Callback(hObject, eventdata, handles)
% hObject handle to green (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
A=imread('wait.jpg');
axes(handles.fig2);
image(A);
drawnow;
for i=1:size(handles.currentresult, 1)
for j=1:size(handles.currentresult, 2)
if handles.currentresult(i,j)>0
handles.currentresult(i,j)=40;
end
end
end
axes(handles.fig2);
image(handles.currentresult);colormap(gray);
% -------------------------------------------------------------------function pix_Callback(hObject, eventdata, handles)
27
% hObject handle to pix (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
A=imread('wait.jpg');
axes(handles.fig2);
image(A);
drawnow;
for i=1:size(handles.currentresult, 1)
for j=1:size(handles.currentresult, 2)
if handles.currentresult(i,j)>0
handles.currentresult(i,j)=uint8((handles.currentimage(i,j,1)+...
handles.currentimage(i,j,2)+handles.currentimage(i,j,3))/6);
end
end
end
axes(handles.fig2);
image(handles.currentresult);colormap(gray);
% -------------------------------------------------------------------function open_Callback(hObject, eventdata, handles)
% hObject handle to open (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
pos_size = get(handles.figure1,'Position');
% Call modaldlg with the argument 'Position'.
user_response = modalbox('Title','Load');
switch user_response
case 'Close'
case 'No'
errordlg('Error while loading file', 'File error');
otherwise
[path,name,ext,ver] = fileparts(user_response);
switch ext
case '.jpg'
handles.currentimage=imread(user_response);
axes(handles.fig1);
image(handles.currentimage);
case '.JPG'
handles.currentimage=imread(user_response);
axes(handles.fig1);
image(handles.currentimage);
case '.jpeg'
handles.currentimage=imread(user_response);
axes(handles.fig1);
image(handles.currentimage);
case '.JPEG'
handles.currentimage=imread(user_response);
axes(handles.fig1);
image(handles.currentimage);
case '.bmp'
handles.currentimage=imread(user_response);
axes(handles.fig1);
image(handles.currentimage);
case '.BMP'
handles.currentimage=imread(user_response);
axes(handles.fig1);
image(handles.currentimage);
case '.gif'
handles.currentimage=imread(user_response);
axes(handles.fig1);
image(handles.currentimage);
case '.GIF'
handles.currentimage=imread(user_response);
axes(handles.fig1);
image(handles.currentimage);
otherwise
errordlg('Error while loading file', 'File error');
28
end
end
guidata(hObject,handles);
% -------------------------------------------------------------------function defa_Callback(hObject, eventdata, handles)
% hObject handle to defa (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
load('emstime.mat');
handles.currentimage=imread('DSC00837.jpg');
axes(handles.fig1);
image(handles.currentimage);
handles.currentcomp='st05';
handles.currentthr=3e-7;
handles.currentset=stima2;
handles.currentrem=1;
A=imread('wait.jpg');
axes(handles.fig2);
image(A);
drawnow;
handles.currentresult=gmcluster(handles.currentimage, handles.currentset.(handles.currentcomp).mu, ...
handles.currentset.(handles.currentcomp).sigma, handles.currentset.(handles.currentcomp).weight, 'thr', handles.currentthr, ...
'spr', handles.currentrem);
axes(handles.fig2);
image(handles.currentresult);colormap(gray);
set(handles.gmctext,'String', 5);
set(handles.gmcslid,'Value', 5);
set(handles.threshtext,'String', 300);
set(handles.slider2,'Value', 300);
set(handles.buttonset2,'Value',get(handles.buttonset2, 'Max'));
set(handles.buttonon,'Value',get(handles.buttonon, 'Max'));
guidata(hObject, handles);
% -------------------------------------------------------------------function clus_Callback(hObject, eventdata, handles)
% hObject handle to clus (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% -------------------------------------------------------------------function gud_Callback(hObject, eventdata, handles)
% hObject handle to guide (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% -------------------------------------------------------------------function about_Callback(hObject, eventdata, handles)
% hObject handle to about (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
pos_size = get(handles.figure1,'Position');
% Call modaldlg with the argument 'Position'.
user_response = modalabout('Title','About');
switch user_response
case {'Close'}
end
% -------------------------------------------------------------------function file_Callback(hObject, eventdata, handles)
% hObject handle to file (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% -------------------------------------------------------------------function view_Callback(hObject, eventdata, handles)
% hObject handle to view (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% -------------------------------------------------------------------function help_Callback(hObject, eventdata, handles)
% hObject handle to help (see GCBO)
29
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% -------------------------------------------------------------------function zoom_Callback(hObject, eventdata, handles)
% hObject handle to zoom (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
scrsz = get(0,'ScreenSize');
figure('Position',[30 scrsz(4)-80 scrsz(3)-130 scrsz(4)-130]);
image(handles.currentimage);
% -------------------------------------------------------------------function zoom2_Callback(hObject, eventdata, handles)
% hObject handle to zoom2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
scrsz = get(0,'ScreenSize');
figure('Position',[30 scrsz(4)-80 scrsz(3)-130 scrsz(4)-130]);
image(handles.currentresult);colormap(gray);
% -------------------------------------------------------------------function context_1_Callback(hObject, eventdata, handles)
% hObject handle to context_1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% -------------------------------------------------------------------function context_2_Callback(hObject, eventdata, handles)
% hObject handle to context_2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --- Executes on button press in buttonset1.
function buttonset1_Callback(hObject, eventdata, handles)
% hObject handle to buttonset1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
if get(hObject, 'Value')==get(hObject, 'Max')
load('emstime.mat');
handles.currentset=stima;
guidata(hObject, handles);
end
% Hint: get(hObject,'Value') returns toggle state of buttonset1
% --- Executes on button press in buttonset2.
function buttonset2_Callback(hObject, eventdata, handles)
% hObject handle to buttonset2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
if get(hObject, 'Value')==get(hObject, 'Max')
load('emstime.mat');
handles.currentset=stima2;
guidata(hObject, handles);
end
% Hint: get(hObject,'Value') returns toggle state of buttonset2
% -------------------------------------------------------------------function panelset_SelectionChangeFcn(hObject, eventdata, handles)
% hObject handle to panelset (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
selection = get(hObject,'SelectedObject');
switch get(selection,'Tag')
case 'buttonset1'
load('emstime.mat');
handles.currentset=stima;
% code piece when radiobutton1 is selected goes here
case 'buttonset2'
load('emstime.mat');
handles.currentset=stima2;
30
% code piece when radiobutton2 is selected goes here
% ...
end
guidata(hObject, handles);
% --- Executes on button press in buttonon.
function buttonon_Callback(hObject, eventdata, handles)
% hObject handle to buttonon (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
if get(hObject, 'Value')==get(hObject, 'Max')
handles.currentrem=1;
guidata(hObject, handles);
end
% Hint: get(hObject,'Value') returns toggle state of buttonon
% --- Executes on button press in buttonoff.
function buttonoff_Callback(hObject, eventdata, handles)
% hObject handle to buttonoff (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
if get(hObject, 'Value')==get(hObject, 'Max')
handles.currentrem=0;
guidata(hObject, handles);
end
% Hint: get(hObject,'Value') returns toggle state of buttonoff
% -------------------------------------------------------------------function panelrem_SelectionChangeFcn(hObject, eventdata, handles)
% hObject handle to panelrem (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
selection = get(hObject,'SelectedObject');
switch get(selection,'Tag')
case 'buttonon'
handles.currentset=1;
% code piece when radiobutton1 is selected goes here
case 'buttonoff'
handles.currentrem=0;
% code piece when radiobutton2 is selected goes here
% ...
end
guidata(hObject, handles);
% -------------------------------------------------------------------function lay_Callback(hObject, eventdata, handles)
% hObject handle to lay (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
pos_size = get(handles.figure1,'Position');
% Call modaldlg with the argument 'Position'.
user_response = modalguide('Title','Layout guide');
switch user_response
case {'Close'}
end
% -------------------------------------------------------------------function menu_Callback(hObject, eventdata, handles)
% hObject handle to menu (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
pos_size = get(handles.figure1,'Position');
% Call modaldlg with the argument 'Position'.
user_response = modalmenu('Title','Menu guide');
switch user_response
case {'Close'}
end
31
4.8
modalabout.m
function varargout = modalabout(varargin)
% MODALABOUT M-file for modalabout.fig
%
MODALABOUT by itself, creates a new MODALABOUT or raises the
% existing singleton*.
% H = MODALABOUT returns the handle to a new MODALABOUT or the handle to
% the existing singleton*.
% MODALABOUT('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in MODALABOUT.M with the given input arguments.
%
MODALABOUT('Property','Value',...) creates a new MODALABOUT or raises the
%
existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before modalabout_OpeningFunction gets called. An
% unrecognized property name or invalid value makes property application
%
stop. All inputs are passed to modalabout_OpeningFcn via varargin.
%
*See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
%
instance to run (singleton)".
% See also: GUIDE, GUIDATA, GUIHANDLES
% Copyright 2002-2003 The MathWorks, Inc.
% Edit the above text to modify the response to help modalabout
% Last Modified by GUIDE v2.5 25-Mar-2002 12:19:15
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',
mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @modalabout_OpeningFcn, ...
'gui_OutputFcn', @modalabout_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before modalabout is made visible.
function modalabout_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to modalabout (see VARARGIN)
% Choose default command line output for modalabout
handles.output = 'Yes';
% Update handles structure
guidata(hObject, handles);
% Insert custom Title and Text if specified by the user
% Hint: when choosing keywords, be sure they are not easily confused
% with existing figure properties. See the output of set(figure) for
% a list of figure properties.
if(nargin > 3)
for index = 1:2:(nargin-3),
if nargin-3==index, break, end
switch lower(varargin{index})
case 'title'
set(hObject, 'Name', varargin{index+1});
32
case 'string'
set(handles.text1, 'String', varargin{index+1});
end
end
end
% Determine the position of the dialog - centered on the callback figure
% if available, else, centered on the screen
FigPos=get(0,'DefaultFigurePosition');
OldUnits = get(hObject, 'Units');
set(hObject, 'Units', 'pixels');
OldPos = get(hObject,'Position');
FigWidth = OldPos(3);
FigHeight = OldPos(4);
if isempty(gcbf)
ScreenUnits=get(0,'Units');
set(0,'Units','pixels');
ScreenSize=get(0,'ScreenSize');
set(0,'Units',ScreenUnits);
FigPos(1)=1/2*(ScreenSize(3)-FigWidth);
FigPos(2)=2/3*(ScreenSize(4)-FigHeight);
else
GCBFOldUnits = get(gcbf,'Units');
set(gcbf,'Units','pixels');
GCBFPos = get(gcbf,'Position');
set(gcbf,'Units',GCBFOldUnits);
FigPos(1:2) = [(GCBFPos(1) + GCBFPos(3) / 2) - FigWidth / 2, ...
(GCBFPos(2) + GCBFPos(4) / 2) - FigHeight / 2];
end
FigPos(3:4)=[FigWidth FigHeight];
set(hObject, 'Position', FigPos);
set(hObject, 'Units', OldUnits);
% Make the GUI modal
set(handles.figure1,'WindowStyle','modal')
% UIWAIT makes modalabout wait for user response (see UIRESUME)
uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = modalabout_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
% The figure can be deleted now
delete(handles.figure1);
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
handles.output = get(hObject,'String');
% Update handles structure
guidata(hObject, handles);
% Use UIRESUME instead of delete because the OutputFcn needs
% to get the updated handles structure.
uiresume(handles.figure1);
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
handles.output = get(hObject,'String');
% Update handles structure
guidata(hObject, handles);
% Use UIRESUME instead of delete because the OutputFcn needs
% to get the updated handles structure.
33
uiresume(handles.figure1);
% --- Executes when user attempts to close figure1.
function figure1_CloseRequestFcn(hObject, eventdata, handles)
% hObject handle to figure1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
if isequal(get(handles.figure1, 'waitstatus'), 'waiting')
% The GUI is still in UIWAIT, us UIRESUME
uiresume(handles.figure1);
else
% The GUI is no longer waiting, just close it
delete(handles.figure1);
end
% --- Executes on key press over figure1 with no controls selected.
function figure1_KeyPressFcn(hObject, eventdata, handles)
% hObject handle to figure1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Check for "enter" or "escape"
if isequal(get(hObject,'CurrentKey'),'escape')
% User said no by hitting escape
handles.output = 'No';
% Update handles structure
guidata(hObject, handles);
uiresume(handles.figure1);
end
if isequal(get(hObject,'CurrentKey'),'return')
uiresume(handles.figure1);
end
4.9
modalguide.m
function varargout = modalguide(varargin)
% MODALGUIDE M-file for modalguide.fig
%
MODALGUIDE by itself, creates a new MODALGUIDE or raises the
% existing singleton*.
%
H = MODALGUIDE returns the handle to a new MODALGUIDE or the handle to
% the existing singleton*.
%
MODALGUIDE('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in MODALGUIDE.M with the given input arguments.
% MODALGUIDE('Property','Value',...) creates a new MODALGUIDE or raises the
%
existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before modalguide_OpeningFunction gets called. An
%
unrecognized property name or invalid value makes property application
%
stop. All inputs are passed to modalguide_OpeningFcn via varargin.
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
%
instance to run (singleton)".
% See also: GUIDE, GUIDATA, GUIHANDLES
% Copyright 2002-2003 The MathWorks, Inc.
% Edit the above text to modify the response to help modalguide
% Last Modified by GUIDE v2.5 25-Mar-2002 12:19:15
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',
mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @modalguide_OpeningFcn, ...
'gui_OutputFcn', @modalguide_OutputFcn, ...
'gui_LayoutFcn', [] , ...
34
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before modalguide is made visible.
function modalguide_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to modalguide (see VARARGIN)
% Choose default command line output for modalguide
handles.output = 'Yes';
% Update handles structure
guidata(hObject, handles);
% Insert custom Title and Text if specified by the user
% Hint: when choosing keywords, be sure they are not easily confused
% with existing figure properties. See the output of set(figure) for
% a list of figure properties.
if(nargin > 3)
for index = 1:2:(nargin-3),
if nargin-3==index, break, end
switch lower(varargin{index})
case 'title'
set(hObject, 'Name', varargin{index+1});
case 'string'
set(handles.text1, 'String', varargin{index+1});
end
end
end
% Determine the position of the dialog - centered on the callback figure
% if available, else, centered on the screen
FigPos=get(0,'DefaultFigurePosition');
OldUnits = get(hObject, 'Units');
set(hObject, 'Units', 'pixels');
OldPos = get(hObject,'Position');
FigWidth = OldPos(3);
FigHeight = OldPos(4);
if isempty(gcbf)
ScreenUnits=get(0,'Units');
set(0,'Units','pixels');
ScreenSize=get(0,'ScreenSize');
set(0,'Units',ScreenUnits);
FigPos(1)=1/2*(ScreenSize(3)-FigWidth);
FigPos(2)=2/3*(ScreenSize(4)-FigHeight);
else
GCBFOldUnits = get(gcbf,'Units');
set(gcbf,'Units','pixels');
GCBFPos = get(gcbf,'Position');
set(gcbf,'Units',GCBFOldUnits);
FigPos(1:2) = [(GCBFPos(1) + GCBFPos(3) / 2) - FigWidth / 2, ...
(GCBFPos(2) + GCBFPos(4) / 2) - FigHeight / 2];
end
FigPos(3:4)=[FigWidth FigHeight];
set(hObject, 'Position', FigPos);
set(hObject, 'Units', OldUnits);
% Show a question icon from dialogicons.mat - variables questIconData
35
% and questIconMap
load dialogicons.mat
IconData=questIconData;
questIconMap(256,:) = get(handles.figure1, 'Color');
IconCMap=questIconMap;
Img=image(IconData, 'Parent', handles.axes1);
set(handles.figure1, 'Colormap', IconCMap);
set(handles.axes1, ...
'Visible', 'off', ...
'YDir' , 'reverse'
, ...
'XLim' , get(Img,'XData'), ...
'YLim' , get(Img,'YData') ...
);
% Make the GUI modal
set(handles.figure1,'WindowStyle','modal')
% UIWAIT makes modalguide wait for user response (see UIRESUME)
uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = modalguide_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
% The figure can be deleted now
delete(handles.figure1);
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
handles.output = get(hObject,'String');
% Update handles structure
guidata(hObject, handles);
% Use UIRESUME instead of delete because the OutputFcn needs
% to get the updated handles structure.
uiresume(handles.figure1);
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
handles.output = get(hObject,'String');
% Update handles structure
guidata(hObject, handles);
% Use UIRESUME instead of delete because the OutputFcn needs
% to get the updated handles structure.
uiresume(handles.figure1);
% --- Executes when user attempts to close figure1.
function figure1_CloseRequestFcn(hObject, eventdata, handles)
% hObject handle to figure1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
if isequal(get(handles.figure1, 'waitstatus'), 'waiting')
% The GUI is still in UIWAIT, us UIRESUME
uiresume(handles.figure1);
else
% The GUI is no longer waiting, just close it
delete(handles.figure1);
end
% --- Executes on key press over figure1 with no controls selected.
function figure1_KeyPressFcn(hObject, eventdata, handles)
% hObject handle to figure1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
36
% Check for "enter" or "escape"
if isequal(get(hObject,'CurrentKey'),'escape')
% User said no by hitting escape
handles.output = 'No';
% Update handles structure
guidata(hObject, handles);
uiresume(handles.figure1);
end
if isequal(get(hObject,'CurrentKey'),'return')
uiresume(handles.figure1);
end
4.10
modalmenu.m
function varargout = modalmenu(varargin)
% MODALMENU M-file for modalmenu.fig
% MODALMENU by itself, creates a new MODALMENU or raises the
% existing singleton*.
%
H = MODALMENU returns the handle to a new MODALMENU or the handle to
% the existing singleton*.
% MODALMENU('CALLBACK',hObject,eventData,handles,...) calls the local
%
function named CALLBACK in MODALMENU.M with the given input arguments.
%
MODALMENU('Property','Value',...) creates a new MODALMENU or raises the
%
existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before modalmenu_OpeningFunction gets called. An
% unrecognized property name or invalid value makes property application
%
stop. All inputs are passed to modalmenu_OpeningFcn via varargin.
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
%
instance to run (singleton)".
% See also: GUIDE, GUIDATA, GUIHANDLES
% Copyright 2002-2003 The MathWorks, Inc.
% Edit the above text to modify the response to help modalmenu
% Last Modified by GUIDE v2.5 25-Mar-2002 12:19:15
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',
mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @modalmenu_OpeningFcn, ...
'gui_OutputFcn', @modalmenu_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before modalmenu is made visible.
function modalmenu_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to modalmenu (see VARARGIN)
37
% Choose default command line output for modalmenu
handles.output = 'Yes';
% Update handles structure
guidata(hObject, handles);
% Insert custom Title and Text if specified by the user
% Hint: when choosing keywords, be sure they are not easily confused
% with existing figure properties. See the output of set(figure) for
% a list of figure properties.
if(nargin > 3)
for index = 1:2:(nargin-3),
if nargin-3==index, break, end
switch lower(varargin{index})
case 'title'
set(hObject, 'Name', varargin{index+1});
case 'string'
set(handles.text1, 'String', varargin{index+1});
end
end
end
% Determine the position of the dialog - centered on the callback figure
% if available, else, centered on the screen
FigPos=get(0,'DefaultFigurePosition');
OldUnits = get(hObject, 'Units');
set(hObject, 'Units', 'pixels');
OldPos = get(hObject,'Position');
FigWidth = OldPos(3);
FigHeight = OldPos(4);
if isempty(gcbf)
ScreenUnits=get(0,'Units');
set(0,'Units','pixels');
ScreenSize=get(0,'ScreenSize');
set(0,'Units',ScreenUnits);
FigPos(1)=1/2*(ScreenSize(3)-FigWidth);
FigPos(2)=2/3*(ScreenSize(4)-FigHeight);
else
GCBFOldUnits = get(gcbf,'Units');
set(gcbf,'Units','pixels');
GCBFPos = get(gcbf,'Position');
set(gcbf,'Units',GCBFOldUnits);
FigPos(1:2) = [(GCBFPos(1) + GCBFPos(3) / 2) - FigWidth / 2, ...
(GCBFPos(2) + GCBFPos(4) / 2) - FigHeight / 2];
end
FigPos(3:4)=[FigWidth FigHeight];
set(hObject, 'Position', FigPos);
set(hObject, 'Units', OldUnits);
% Show a question icon from dialogicons.mat - variables questIconData
% and questIconMap
load dialogicons.mat
IconData=questIconData;
questIconMap(256,:) = get(handles.figure1, 'Color');
IconCMap=questIconMap;
Img=image(IconData, 'Parent', handles.axes1);
set(handles.figure1, 'Colormap', IconCMap);
set(handles.axes1, ...
'Visible', 'off', ...
'YDir' , 'reverse'
, ...
'XLim' , get(Img,'XData'), ...
'YLim' , get(Img,'YData') ...
);
% Make the GUI modal
set(handles.figure1,'WindowStyle','modal')
% UIWAIT makes modalmenu wait for user response (see UIRESUME)
uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
38
function varargout = modalmenu_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
% The figure can be deleted now
delete(handles.figure1);
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
handles.output = get(hObject,'String');
% Update handles structure
guidata(hObject, handles);
% Use UIRESUME instead of delete because the OutputFcn needs
% to get the updated handles structure.
uiresume(handles.figure1);
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
handles.output = get(hObject,'String');
% Update handles structure
guidata(hObject, handles);
% Use UIRESUME instead of delete because the OutputFcn needs
% to get the updated handles structure.
uiresume(handles.figure1);
% --- Executes when user attempts to close figure1.
function figure1_CloseRequestFcn(hObject, eventdata, handles)
% hObject handle to figure1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
if isequal(get(handles.figure1, 'waitstatus'), 'waiting')
% The GUI is still in UIWAIT, us UIRESUME
uiresume(handles.figure1);
else
% The GUI is no longer waiting, just close it
delete(handles.figure1);
end
% --- Executes on key press over figure1 with no controls selected.
function figure1_KeyPressFcn(hObject, eventdata, handles)
% hObject handle to figure1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Check for "enter" or "escape"
if isequal(get(hObject,'CurrentKey'),'escape')
% User said no by hitting escape
handles.output = 'No';
% Update handles structure
guidata(hObject, handles);
uiresume(handles.figure1);
end
if isequal(get(hObject,'CurrentKey'),'return')
uiresume(handles.figure1);
end
39
4.11
modalbox.m
function varargout = modalbox(varargin)
% MODALBOX M-file for modalbox.fig
%
MODALBOX by itself, creates a new MODALBOX or raises the
% existing singleton*.
% H = MODALBOX returns the handle to a new MODALBOX or the handle to
% the existing singleton*.
% MODALBOX('CALLBACK',hObject,eventData,handles,...) calls the local
%
function named CALLBACK in MODALBOX.M with the given input arguments.
% MODALBOX('Property','Value',...) creates a new MODALBOX or raises the
%
existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before modalbox_OpeningFunction gets called. An
% unrecognized property name or invalid value makes property application
%
stop. All inputs are passed to modalbox_OpeningFcn via varargin.
%
*See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
%
instance to run (singleton)".
% See also: GUIDE, GUIDATA, GUIHANDLES
% Copyright 2002-2003 The MathWorks, Inc.
% Edit the above text to modify the response to help modalbox
% Last Modified by GUIDE v2.5 06-Sep-2004 17:19:03
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',
mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @modalbox_OpeningFcn, ...
'gui_OutputFcn', @modalbox_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before modalbox is made visible.
function modalbox_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to modalbox (see VARARGIN)
% Choose default command line output for modalbox
handles.output = 'No';
handles.file = 'No';
handles.dir=1;
guidata(hObject,handles);
cd (pwd);
dir_struct = dir(pwd);
[sorted_names,sorted_index] = sortrows({dir_struct.name}');
handles.file_names = sorted_names;
handles.is_dir = [dir_struct.isdir];
handles.sorted_index = [sorted_index];
guidata(hObject,handles);
set(handles.listbox1,'String',handles.file_names,...
'Value',1);
set(handles.text1,'String',pwd);
40
guidata(hObject, handles);
handles.index_selected = get(handles.listbox1,'Value');
handles.file_list = get(handles.listbox1,'String');
handles.filename = handles.file_list{handles.index_selected};
% Update handles structure
guidata(hObject, handles);
% Insert custom Title and Text if specified by the user
% Hint: when choosing keywords, be sure they are not easily confused
% with existing figure properties. See the output of set(figure) for
% a list of figure properties.
if(nargin > 3)
for index = 1:2:(nargin-3),
if nargin-3==index, break, end
switch lower(varargin{index})
case 'title'
set(hObject, 'Name', varargin{index+1});
case 'string'
set(handles.text1, 'String', varargin{index+1});
end
end
end
% Determine the position of the dialog - centered on the callback figure
% if available, else, centered on the screen
FigPos=get(0,'DefaultFigurePosition');
OldUnits = get(hObject, 'Units');
set(hObject, 'Units', 'pixels');
OldPos = get(hObject,'Position');
FigWidth = OldPos(3);
FigHeight = OldPos(4);
if isempty(gcbf)
ScreenUnits=get(0,'Units');
set(0,'Units','pixels');
ScreenSize=get(0,'ScreenSize');
set(0,'Units',ScreenUnits);
FigPos(1)=1/2*(ScreenSize(3)-FigWidth);
FigPos(2)=2/3*(ScreenSize(4)-FigHeight);
else
GCBFOldUnits = get(gcbf,'Units');
set(gcbf,'Units','pixels');
GCBFPos = get(gcbf,'Position');
set(gcbf,'Units',GCBFOldUnits);
FigPos(1:2) = [(GCBFPos(1) + GCBFPos(3) / 2) - FigWidth / 2, ...
(GCBFPos(2) + GCBFPos(4) / 2) - FigHeight / 2];
end
FigPos(3:4)=[FigWidth FigHeight];
set(hObject, 'Position', FigPos);
set(hObject, 'Units', OldUnits);
% Show a question icon from dialogicons.mat - variables questIconData
% and questIconMap
load dialogicons.mat
IconData=helpIconData;
questIconMap(256,:) = get(handles.figure1, 'Color');
IconCMap=helpIconMap;
Img=image(IconData, 'Parent', handles.axes1);
set(handles.figure1, 'Colormap', IconCMap);
set(handles.axes1, ...
'Visible', 'off', ...
'YDir' , 'reverse'
, ...
'XLim' , get(Img,'XData'), ...
'YLim' , get(Img,'YData') ...
);
% Make the GUI modal
set(handles.figure1,'WindowStyle','modal')
41
% UIWAIT makes modalbox wait for user response (see UIRESUME)
uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = modalbox_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
% The figure can be deleted now
delete(handles.figure1);
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
if handles.dir==1;
cd(handles.filename);
%load_listbox(pwd,handles);
dir_struct = dir(pwd);
[sorted_names,sorted_index] = sortrows({dir_struct.name}');
handles.file_names = [sorted_names];
handles.is_dir = [dir_struct.isdir];
handles.sorted_index = [sorted_index];
guidata(hObject,handles);
set(handles.listbox1,'String',handles.file_names,...
'Value',1);
set(handles.text1,'String',pwd);
guidata(hObject,handles);
else
handles.output = handles.filename;
uiresume(handles.figure1);
end
% Update handles structure
guidata(hObject, handles);
% Use UIRESUME instead of delete because the OutputFcn needs
% to get the updated handles structure.
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
handles.output = 'Close';
% Update handles structure
guidata(hObject, handles);
% Use UIRESUME instead of delete because the OutputFcn needs
% to get the updated handles structure.
uiresume(handles.figure1);
% --- Executes when user attempts to close figure1.
function figure1_CloseRequestFcn(hObject, eventdata, handles)
% hObject handle to figure1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
if isequal(get(handles.figure1, 'waitstatus'), 'waiting')
% The GUI is still in UIWAIT, us UIRESUME
uiresume(handles.figure1);
else
% The GUI is no longer waiting, just close it
delete(handles.figure1);
end
42
% --- Executes on key press over figure1 with no controls selected.
function figure1_KeyPressFcn(hObject, eventdata, handles)
% hObject handle to figure1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Check for "enter" or "escape"
if isequal(get(hObject,'CurrentKey'),'escape')
% User said no by hitting escape
handles.output = 'Close';
% Update handles structure
guidata(hObject, handles);
uiresume(handles.figure1);
end
if isequal(get(hObject,'CurrentKey'),'return')
uiresume(handles.figure1);
end
% --- Executes on selection change in listbox1.
function listbox1_Callback(hObject, eventdata, handles)
% hObject handle to listbox1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: contents = get(hObject,'String') returns listbox1 contents as cell array
%
contents{get(hObject,'Value')} returns selected item from listbox1
get(handles.figure1,'SelectionType');
if strcmp(get(handles.figure1,'SelectionType'),'normal')
handles.index_selected = get(handles.listbox1,'Value');
handles.file_list = get(handles.listbox1,'String');
handles.filename = handles.file_list{handles.index_selected};
if handles.is_dir(handles.sorted_index(handles.index_selected))
handles.dir=1;
else handles.dir=0;
end
guidata(hObject,handles);
end
if strcmp(get(handles.figure1,'SelectionType'),'open')
index_selected = get(handles.listbox1,'Value');
file_list = get(handles.listbox1,'String');
filename = file_list{index_selected};
if handles.is_dir(handles.sorted_index(index_selected))
cd(filename);
%load_listbox(pwd,handles);
dir_struct = dir(pwd);
[sorted_names,sorted_index] = sortrows({dir_struct.name}');
handles.file_names = [sorted_names];
handles.is_dir = [dir_struct.isdir];
handles.sorted_index = [sorted_index];
guidata(hObject,handles);
set(handles.listbox1,'String',handles.file_names,...
'Value',1);
set(handles.text1,'String',pwd);
guidata(hObject,handles);
else
handles.output=handles.filename;
uiresume(handles.figure1);
end
end
guidata(hObject, handles);
% -----------------------------------------------------------% Read the current directory and sort the names
% -----------------------------------------------------------function load_listbox(dir_path,handles)
cd (dir_path);
dir_struct = dir(dir_path);
43
[sorted_names,sorted_index] = sortrows({dir_struct.name}');
handles.file_names = [sorted_names];
handles.is_dir = [dir_struct.isdir];
handles.sorted_index = [sorted_index];
guidata(handles.figure1,handles);
set(handles.listbox1,'String',handles.file_names,...
'Value',1);
set(handles.text1,'String',pwd);
guidata(handles.figure1,handles);
% --- Executes during object creation, after setting all properties.
function listbox1_CreateFcn(hObject, eventdata, handles)
% hObject handle to listbox1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: listbox controls usually have a white background on Windows.
%
See ISPC and COMPUTER.
if ispc
set(hObject,'BackgroundColor','white');
else
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end
5
Bibliografia e risorse online
Ÿ
Stuart J. Russel, Peter Norvig - Artificial Intelligence, A Modern Approach. International
Edition. (Prentice Hall, second edition, 2003).
Ÿ
Fiora Pirri - Dispense del corso di Apprendimento, A.A. 2003/2004. Distribuite agli studenti
frequentanti il corso.
Ÿ
http://www-2.cs.cmu.edu/~awm/tutorials/gmm.html - Dispense sui modelli di misture di
gaussiane e sull’algoritmo EM.
Ÿ
http://dsp.ucsd.edu/students/present-students/mik/matlabgui - Guida rapida alla creazione di
interfacce grafiche in ambiente matlab.
Ÿ
http://www.mathworks.com/access/helpdesk_r13/help/pdf_doc/matlab/buildgui.pdf - Guida
completa alle interfacce grafiche in ambiente matlab. (The Mathworks, inc. – 184 pagine).
Ÿ
The Mathworks, inc. - Matlab 7 Reference Book - Guida ed help dell’ambiente Matlab 7.
44
Indice analitico (in corsivo le funzioni matlab):
A
algoritmo EM .......................................................................1
apprendimento dei parametri.............................................1
dati di apprendimento....................................................2
funzioni di apprendimento............................................3
covfixer.m ...................................................................4
listato ...................................................................18
emstime.mat ...............................................................5
fcm.m
listato ...................................................................17
gmem.m.......................................................................4
listato ...................................................................15
mvnpdf.m ....................................................................5
listato ...................................................................19
immagini di apprendimento..........................................2
B
bibliografia ..........................................................................44
C
clusterizzazione....................................................................5
funzioni di clusterizzazione..........................................6
gmcluster.m................................................................7
listato ...................................................................22
gmpdf.m ......................................................................6
listato ...................................................................21
immagini..........................................................................6
interfaccia grafica...........................................................7
covfixer.m..............................................................................4
listato..............................................................................18
modalbox.m...................................................................14
listato.........................................................................40
modalguide.fig..............................................................13
modalguide.m................................................................13
listato.........................................................................34
modalmenu.fig ..............................................................13
modalmenu.m................................................................13
listato.........................................................................37
funzioni di apprendimento.................................................3
covfixer.m ........................................................................4
listato.........................................................................18
emstime.mat.....................................................................5
fcm.m
listato.........................................................................17
gmem.m............................................................................4
listato.........................................................................15
mvnpdf.m..........................................................................5
listato.........................................................................19
funzioni di clusterizzazione ...............................................6
gmcluster.m .....................................................................7
listato.........................................................................22
gmpdf.m............................................................................6
listato.........................................................................21
G
gmcluster.m ..........................................................................7
listato..............................................................................22
gmem.m .................................................................................4
listato..............................................................................15
gmpdf.m .................................................................................6
listato..............................................................................21
D
I
dati di apprendimento .........................................................2
immagini di apprendimento...............................................2
interfaccia grafica ................................................................7
caricamento delle immagini .................................. 8; 14
crediti......................................................................... 9; 13
funzioni dell'interfaccia grafica .................................10
EM.fig .......................................................................10
EM.m .........................................................................10
listato ...................................................................23
modalabout.fig.........................................................13
modalabout.m..........................................................13
listato ...................................................................32
modalbox.fig............................................................14
modalbox.m..............................................................14
listato ...................................................................40
modalguide.fig.........................................................13
modalguide.m ..........................................................13
listato ...................................................................34
modalmenu.fig.........................................................13
modalmenu.m...........................................................13
listato ...................................................................37
guida.......................................................................... 9; 13
ingrandimento delle immagini.....................................9
E
EM..........................................................................................1
EM.fig ..................................................................................10
EM.m....................................................................................10
listato..............................................................................23
emstime.mat..........................................................................5
F
fcm.m
listato..............................................................................17
funzioni
listati...............................................................................15
funzioni dell'interfaccia grafica.......................................10
EM.fig.............................................................................10
EM.m ..............................................................................10
listato.........................................................................23
modalabout.fig..............................................................13
modalabout.m ...............................................................13
listato.........................................................................32
modalbox.fig..................................................................14
45
layout................................................................................8
menu .................................................................................8
menu contestuali .......................................................9
menu File ....................................................................8
menu Help ..................................................................9
menu View.................................................................9
pannello Learning set ....................................................9
pannello Parameters .....................................................10
pannello single points removal ..................................10
salvataggio delle immagini...........................................9
utilizzo ..............................................................................8
layout dell'interfaccia grafica ............................................8
listati delle funzioni...........................................................15
utilizzo per la clusterizzazione.....................................5
modalabout.fig...................................................................13
modalabout.m.....................................................................13
listato..............................................................................32
modalbox.fig.......................................................................14
modalbox.m ........................................................................14
listato..............................................................................40
modalguide.fig....................................................................13
modalguide.m.....................................................................13
listato..............................................................................34
modalmenu.fig....................................................................13
modalmenu.m .....................................................................13
listato..............................................................................37
mvnpdf.m ...............................................................................5
listato..............................................................................19
M
R
menu dell'interfaccia grafica..............................................8
menu contestuali.............................................................9
menu File .........................................................................8
menu Help .......................................................................9
menu View......................................................................9
misture di gaussiane............................................................1
numero di componenti............................................ 5; 10
soglia di appartenenza ............................................ 6; 10
risorse online ......................................................................44
L
S
set di apprendimento.......................................................2; 9
U
utilizzo dell'interfaccia grafica ..........................................8
46
Scarica

Clusterizzazione di prati e alberisecondo misture di gaussiane con