Analisi di forma
Utilizzando tecniche spesso scelte e adattate ai singoli casi, è possibile estrarre punti di interesse da immagini di soggetti noti (occhi, facce, bocche, ...). Una volta identificati i punti di interesse è possibile operare tramite algoritmi basati sulla geometria e sulla statistica.
I punti di interesse vengono chiamati landmark, nei nostri esempi i landmark sono stati selezionati a mano, cosa che accade spesso in applicazioni di tipo medicale, la localizzazione automatica dei landmark è un problema che non affronteremo in questo "capitolo", rimandando a strumenti di caratterizzazione e classificazione o altre tecniche, si veda il corner detector id Harris:
http://www.dei.unipd.it/~masiero/files/teaching/harris_corner_detector.pdf
I Landmark sono punti di un soggetto aventi una semantica ben nota, dato un soggetto i landmark da utilizzare devono essere scelti attentamente, così da poterne garantire la visibilità e identificabilità nelle immagini del soggetto stesso. Una volta identificati i landmark sono in numero e ordinamento fisso, così che ogni forma manualmente o automaticamente identificata in una immagine possa essere manipolata in automatico lavorando sulla geometria della forma stessa.
Contents
Rappresentazione di forma
La rappresentazione di una forma descritta da un numero fisso di landmark dalla semantica nota può avvenire in differenti modi, dipendentemente dalle operazioni che si intendono svolgere su di essa e dalla dimensionalità della forma.
La rappresentazione più intuitiva di una forma è rappresentata da una matrice le cui colonne contengono le coordinate dei punti (uno per colonna). Nel caso spcifico di una forma bidimensionale una rappresentazione spesso più comoda e conveniente consiste in un vettore colonna a valori complessi, in cui ogni valore complesso z = x + iy rappresenta un punto della forma.
Indipendentemente da come le coordinate dei landmark siano memorizzate, differenti rappresentazioni di una forma sono possibili, cominciamo a definirla:
Una forma è ciò che resta di una struttura geometrica una volta che vengono eliminate le informazioni di traslazione, rotazione e scala.
Solo nel caso bidimensionale, utilizzando la rappresentazione di forma come vettore complesso, è possibile definire le operazione di traslazione, scalatura e rotazione come segue:
W_t = W + (dx + i dy) W_s = W s W_r = W e(i\theta)
% Creiamo dei quadrati e rappresentiamoli come coordinate complesse: csq = pcru2dshape2complex([-1,-1;1,-1;1,1;-1,1]'); % Generiamo dei quadrati con rumore: nsq = 300; noise = 0.1; W = noise*rand(size(csq,1),nsq) + 1i*noise*rand(size(csq,1),nsq) + repmat(csq,[1,nsq]); % Rotazione moltiplicando per un'esponenziale complessa: W = W.*repmat((10*rand(1,nsq).*exp(1i*2*pi*rand(1,nsq))),[size(csq,1),1]); % Scalatura moltiplicando per scalari reali: W = W.*repmat(rand(1,size(W,2))+0.5,[size(W,1),1]); % Traslazione aggiungendo coordinate complesse: W = W + repmat(100*((rand([1,size(W,2)])-0.5)+1i*(rand([1,size(W,2)])-0.5)),[size(W,1),1]); % Vediamoli: figure; hold on; for i=1:size(W,2); plotshape(pcru2dcomplex2shape(W(:,i))); end

Coordinate di Bookstein
Diverse rappresentazioni di forma sono state definite differente in letteratura, ad esempio quella di Bookstein o di Kendall. Bookstein elimina la trasformazione di similarità portando i primi due landmark in (0;0) e (0;1):
Passiamo alle coordinate di Bookstein (in una cella di matrici-forma): si osservi che in questa implementazione, per una questione di simmetria, vengono utilizzati i punti (0,-0.5) e (0,0.5) per l'allineamento dei primi due landmark (il che ovviamente non modifica le proprietà delle coordinate di Bookstein).
% Inizializzazione: Wb = cell(1,size(W,2)); figure; hold on; % Conversione e visualizzazione: for i=1:numel(Wb) Wb{i} = pcru2dbookstein(pcru2dcomplex2shape(W(:,i))); plotshape(Wb{i},true,'r.'); end axis equal;

Coordinate di Kendall
Una ulteriore rappresentazione per le forme è ottenibile comodamente utilizzando le coordinate complesse e le matrici di Helmert. Una matrice di Helmert per uno spazio vettoriale a d dimensioni consiste in una matrice ortonormale (quindi una base ortonormale) di cui il primo versore rappresenta la bisettrive degli assi con tutte le coordinate equivalenti a 1/sqrt(d), e ogni altro versore coinvolgente il numero minimo di coordinate (2, 3, ..., d). La j-esima riga di questa matrice, oltre la prima, assume la seguente forma:
h_j = \overbrace{-\frac{1}{\sqrt{j(j-1)}};\dots}^{j-1\ volte}; \frac{j-1}{\sqrt{j(j-1)}} \overbrace{0; \dots}^{d-j\ volte}
Per k=3 ad esempio si ha:
H_3 = \begin{pmatrix} 1/\sqrt{3} & 1/\sqrt{3} & 1/\sqrt{3} \\ -1/\sqrt{2} & 1/\sqrt{2} & 0 \\ -1/\sqrt{6} & -1/\sqrt{6} & 2/\sqrt{6} \\ \end{pmatrix}
% Conversione e visualizzazione: Wk = pcru2dkendall(W); figure; hold on; for i=1:size(Wk,2); plotshape(pcru2dcomplex2shape(Wk(:,i)),true,'r.'); end axis equal;

E' possibile mostrare che le coordinate di Bookstein e di Kendall sono facilmente trasformabili le une nelle altre tramite la sottomatrice quadrata a N-2 righe/colonne della matice di Helmert:
W_k = \sqrt{2} H_l W_b
e viceversa:
W_b = \frac{1}{\sqrt{2}}H_l^{-1} W_k
% Matrice di Helmert per forme a 4 landmark e sua sottomatrice: H = pcruhelmert(4); Hl = H(3:end,3:end); % Passaggio da Kendall a Bookstein: Wb2 = pcru2dcomplex2shape((Hl\Wk(:,1))/sqrt(2)); % Passaggio da Bookstein a Kendall: Wk2 = sqrt(2)*Hl*pcru2dshape2complex(Wb{1}(:,3:end)); % Vediamo gli errori: fprintf('Errore massimo K->B: %f\n', max(max(abs(Wb2 - Wb{1}(:,3:end))))); fprintf('Errore massimo B->K: %f\n', max(max(abs(Wk(:,1) - Wk2))));
Errore massimo K->B: 0.000000 Errore massimo B->K: 0.000000
Full Procrustes fit
Si considerino una forma W, e una forma Y ottenuta per similarità dalla precendente più una componente di rumore additivo:
Y = W\beta e^{i\theta} + (a + ib)1_k + \epsilon
dove a + ib rappresenta la traslazione, \beta il fattore di scala e \theta l'angolo di rotazione. Convenientemente è possibile "impacchettare" la trasformazione in un vettore complesso 2x1 come segue:
Y = X A + \epsilon = (1_k,W) \begin{pmatrix}a + ib \\ e^{i\theta}\end{pmatrix} + \epsilon
da cui l'allineamento delle due forme W e Y consiste nella determinazione del vettore complesso A contenente i parametri di trasformazione similare tali che l'errore \epsilon^H\epsilon sia minimo, dove ^H rappresenta l'ermitiana di una matrice, ovvero A^H = \overline{A^T}. Si ha:
\hat{A} = \arg\min_A \epsilon^H\epsilon = \arg\min_A (Y-(1_k,W)A)^H(Y-(1_k,W)A)
Sotto l'ipotesi che Y e W siano centrate (centroide nullo), si dimostra che a=b=0 (essendo Y e W già centrate), inoltre:
\beta e^{i\theta} = \frac{W^HY}{W^HW}
e quindi la forma allineata si ottiene come:
\hat{W} = \frac{W^HYW}{W^HW}
equazione di trasformazione asimmetrica, sotto l'ulteriore ipotesi di normalizzazione W^HW = Y^HY = 1 si ottengono gli allineamenti:
\hat{W} = W^HYW \hat{Y} = Y^HWY
% Centriamo tutte le forme: Wc = W - repmat(mean(W,1),[size(W,1),1]); % Normaliziamole: Wcn = Wc./repmat(sqrt(sum(conj(Wc).*Wc,1)),[size(Wc,1),1]); % Allineiamo la rotazione sulla prima forma: Yr = repmat(Wcn(:,1),[1,size(Wcn,2)-1]); Wcnr = [Wcn(:,1),repmat(sum(conj(Wcn(:,2:end)).*Yr,1),[size(Wcn,1),1]).*Wcn(:,2:end)]; % Vediamo: figure; subplot(121); hold on; for i=1:size(Wcn,2); plotshape(pcru2dcomplex2shape(Wcn(:,i))); end axis equal; title('Forme normalizzate'); subplot(122); hold on; for i=1:size(Wcnr,2); plotshape(pcru2dcomplex2shape(Wcnr(:,i))); end axis equal; title('Forme allineate');

Una misura di distanza tra forme è definita dal valore ottenuto dalla minimizzazione, ovvero:
\epsilon^H\epsilon = \min_A (Y-(1_k,W)A)^H(Y-(1_k,W)A)
da cui sostituendo la soluzione per A si ottiene:
d(Y,W) = \sqrt{1 - \frac{Y^HW W^HY}{Y^HY W^HW}}
% Le forme sono già tutte normalizzate, calcolo le distanze dalla prima: Y = repmat(Wcnr(:,1),[1,size(Wcnr,2)]); dists = sqrt(1 - sum(conj(Y).*Wcnr,1).*sum(conj(Wcnr).*Y,1)); % Scegliamo la forma più distante dalla prima: [val,pos] = max(dists); % Vediamole come istogramma: figure; subplot(121); hist(dists); title('Istogramma delle distanze tra forme'); subplot(122); hold on; plotshape(pcru2dcomplex2shape(Wcnr(:,1))); plotshape(pcru2dcomplex2shape(Wcnr(:,pos)),true,'r'); axis equal; title('Prima forma e forma più distante da essa');

Altri risultati della Procrustes analysis
Altri strumenti sono messi a disposizione dalla Procrustes analysis, in particolare strumenti di calcolo della scala, della distanza tra forme (altre distanze diverse dalla full procrustes) della forma media, della "preforma"... in dsitools esistono alcune funzioni con prefisso "pcru" che implementano alcuni degli algoritmi descritti dalla procrustes analysis. Si osservi che alcuni algoritmi e alcune rappresentazioni sono state descritte in letteratura appositamente per il 2d (in dsitools prefisso "pcru2d") mentre altre sono generali e applicabili in spazi a dimensionalità arbitraria (ad esempio a forme geometriche tridimensionali).
In questa "puntata" non approfondiremo ulteriormente l'argomento essendo di nostro interesse il solo allineamento di forme 2d, un libro di riferimento è "Statistical Shape Analysis", Dryden e Mardia, Wiley.