2009-10-07 6 views
6

Je travaille actuellement sur la réplication de certaines fonctionnalités de la fonction regionprops de Matlab dans Octave. Cependant, j'ai un peu de raccroche sur un sous-ensemble de la fonctionnalité. Les propriétés 'Excentricité', 'MajorAxisLength', 'MinorAxisLength' et 'Orientation' sont mon point de friction. Dans la documentation, ils dérivent tous de "... l'ellipse qui a les mêmes seconds moments que la région". Donc, ma question est: quels sont ces deuxièmes moments, et comment les trouver?Quels sont les deuxièmes moments d'une région?

Je regardais ce lien: http://en.wikipedia.org/wiki/Image_moments

Honnêtement, il est juste m'a laissé plus confus. Quelqu'un peut-il me diriger vers quelque chose d'un peu plus amical débutant? Merci.

Répondre

18

Par "deuxième moments", la documentation signifie que le deuxième central moment.

Dans le cas de données unidimensionnelles, il s'agit du variance (ou le carré de l'écart-type).

Dans votre cas, où vous avez des données bidimensionnelles, le deuxième moment central est le covariance matrix.

Si X est une matrice n par 2 des points dans votre région, vous pouvez calculer la matrice de covariance Sigma dans Matlab ce (non testé):

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

Maintenant, qu'est-ce que cela a à faire avec des ellipses? Eh bien, ce que vous faites ici est, en effet, d'adapter un multivariate normal distribution à vos données. La matrice de covariance détermine la forme de cette distribution, et les courbes de niveau d'une distribution normale multivariée - attendez-la - are ellipses!

Les orientations et les longueurs des axes de l'ellipse sont donnés par les vecteurs propres et les valeurs propres de la matrice de covariance:

[V, D]=eig(Sigma); 

Les colonnes de V sont maintenant les vecteurs propres (à savoir les directions des axes), et les valeurs sur la diagonale de D sont les valeurs propres (c'est-à-dire les longueurs des axes). Donc vous avez déjà les 'MajorAxisLength' et 'MinorAxisLength'. L'orientation est probablement juste l'angle entre l'axe principal et l'axe horizontal (indice: utilisez atan2 pour calculer ceci à partir du vecteur pointant le long de l'axe principal). Enfin, le eccentricity est

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

où est la longueur de l'axe principal et b est la longueur de l'axe mineur.

+0

Merci. Ceci est très bien écrit, et ressemble exactement à ce dont j'ai besoin. – BigBeagle

+1

+1 - SO a besoin d'explications plus élégantes comme ça ... quand il s'agit de mathématiques, au moins. – Jacob

+1

Btw, vous pouvez calculer la covariance dans MATLAB directement avec 'cov' mais votre code était évidemment plus instructif. – Jacob

0

Pas exactement la réponse que vous cherchez, mais cela peut aider quelqu'un.

J'ai écrit ce livre sur le sujet de la mécanique et a écrit des fichiers m afin de calculer le moment d'inertie de zone:

Mastering Mechanics using MATLAB 5

Le code de celui-ci se trouve ici:

File Exchange

Le chapitre 9 devrait être intéressant. Je suppose que vous pourriez utiliser le code comme point de départ.

1

Je ne suis pas sûr, mais ne pas parler de la statistical notion de moments (comme dans la fonction de génération de moment):

Moments Central (moments sur la moyenne):
    mu_k = E[(X − E[X])^k] ,     où E est la valeur attendue

Ainsi, les quatre premiers moments sont respectivement: {1, variance, asymétrie, kurtosis}.
Mais encore une fois je peux me tromper;)

Questions connexes