2009-10-07 7 views
6

Attualmente sto lavorando alla replica di alcune delle funzionalità della funzione regionprops di Matlab in Octave. Tuttavia, ho un po 'di blocco su un sottoinsieme della funzionalità. Le proprietà "Eccentricità", "MajorAxisLength", "MinorAxisLength" e "Orientation" sono il mio punto critico. Nella documentazione, derivano tutti da "... l'ellisse che ha gli stessi secondi momenti della regione".Quali sono i secondi momenti di una regione?

Quindi la mia domanda è: quali sono questi secondi momenti e come li trovo?

stavo guardando questo link: http://en.wikipedia.org/wiki/Image_moments

Onestamente, è solo mi ha lasciato più confuso. Qualcuno può indicarmi qualcosa di più amichevole per i principianti? Grazie.

risposta

18

Con "secondi momenti", la documentazione indica il secondo central moment.

Nel caso di dati unidimensionali, questo sarebbe il variance (o quadrato della deviazione standard).

Nel tuo caso, dove hai dati bidimensionali, il secondo momento centrale è il covariance matrix.

Se X è una matrice n-by-2 dei punti nella vostra regione, è possibile calcolare la matrice di covarianza Sigma in MATLAB come questo (non testata):

mu=mean(X,1); 
X_minus_mu=X-repmat(mu, size(X,1), 1); 
Sigma=(X_minus_mu'*X_minus_mu)/size(X,1); 

Ora, che cosa ha a che fare con ellissi? Bene, quello che stai facendo qui è, in effetti, adattando uno multivariate normal distribution ai tuoi dati. La matrice di covarianza determina la forma di quella distribuzione e le curve di livello di una distribuzione normale multivariata - aspettalo - are ellipses!

le direzioni e lunghezze degli assi dell'ellisse sono dati dai autovettori e autovalori della matrice di covarianza:

[V, D]=eig(Sigma); 

Le colonne V ora sono gli autovettori (ossia le direzioni degli assi), e valori sulla diagonale di D sono gli autovalori (cioè le lunghezze degli assi). Quindi hai già "MajorAxisLength" e "MinorAxisLength". L'orientamento è probabilmente solo l'angolo tra l'asse maggiore e l'orizzontale (suggerimento: usare atan2 per calcolare questo dal vettore che punta lungo l'asse maggiore). Infine, il eccentricity è

sqrt(1-(b/a)^2) 

dove a è la lunghezza dell'asse maggiore e b è la lunghezza dell'asse minore.

+0

Grazie. Questo è molto ben scritto e sembra esattamente ciò di cui ho bisogno. – BigBeagle

+1

+1 - SO ha bisogno di spiegazioni più eleganti come questa ... quando si tratta di matematica, almeno. – Jacob

+1

Btw, puoi calcolare la covarianza in MATLAB direttamente con 'cov' ma il tuo codice era ovviamente più istruttivo. – Jacob

0

Non esattamente la risposta che si cerca, ma potrebbe aiutare qualcuno.

Ho scritto questo libro sul tema della meccanica e scrisse m-file per calcolare il momento nell'area di inerzia:

Mastering Mechanics using MATLAB 5

Il codice da esso può essere trovato qui:

File Exchange

Il capitolo 9 dovrebbe essere di interesse. Sospetto che potresti usare il codice come punto di partenza.

1

io non sono esattamente sicuro, ma non si riferisca alla statistical notion di moments (come nella funzione generatrice dei momenti):

momenti centrali (momenti intorno alla media):
    mu_k = E[(X − E[X])^k] ,     dove E è il valore atteso

Così i primi quattro momenti sono rispettivamente: {1, varianza, asimmetria, curtosi}.
Ma di nuovo potrei sbagliarmi;)