views:

346

answers:

4

I'm currently working on replicating some of the functionality of Matlab's regionprops function in Octave. However, I have a bit of a hangup on a subset of the functionality. The 'Eccentricity', 'MajorAxisLength', 'MinorAxisLength' and 'Orientation' properties are my sticking point. In the documentation, they all derive from "...the ellipse that has the same second-moments as the region."

So my question is, what are these second-moments, and how do I find them?

I was looking at this link: http://en.wikipedia.org/wiki/Image%5Fmoments

Honestly, it's just left me more confused. Can anyone point me towards something a little more beginner friendly? Thanks.

A: 

Check out pages 13 and 14 of this lecture. The rest of it might be useful as an example ..

Jacob
A: 

Not exactly the answer you seek, but it might help someone.

I wrote this book on the subject of mechanics and wrote m-files to calculate the area moment of inertia:

Mastering Mechanics using MATLAB 5

The code from it can be found here:

File Exchange

Chapter 9 should be of interest. I suspect you could use the code as a starting point.

MatlabDoug
A: 

I'm not exactly sure, but doesn't this refer to the statistical notion of moments (as in moment generating function):

Central Moments (moments about the mean):
   mu_k = E[(X − E[X])^k] ,    where E is the expected value

Thus the first four moments are respectively: {1, variance, skewness, kurtosis}.
But again I might be wrong ;)

Amro
+5  A: 

By "second moments", the documentation means the second central moment.

In the case of one-dimensional data, this would be the variance (or square of the standard deviation).

In your case, where you have two-dimensional data, the second central moment is the covariance matrix.

If X is an n-by-2 matrix of the points in your region, you can compute the covariance matrix Sigma in MATLAB like this (untested):

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

Now, what does this have to do with ellipses? Well, what you're doing here is, in effect, fitting a multivariate normal distribution to your data. The covariance matrix determines the shape of that distribution, and the contour lines of a multivariate normal distribution -- wait for it -- are ellipses!

The directions and lengths of the ellipse's axes are given by the eigenvectors and eigenvalues of the covariance matrix:

[V, D]=eig(Sigma);

The columns of V are now the eigenvectors (i.e. the directions of the axes), and values on the diagonal of D are the eigenvalues (i.e. the lengths of the axes). So you already have the 'MajorAxisLength' and 'MinorAxisLength'. The orientation is probably just the angle between the major axis and the horizontal (hint: use atan2 to compute this from the vector pointing along the major axis). Finally, the eccentricity is

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

where a is the length of the major axis and b is the length of the minor axis.

Martin B
Thank you. This is very well written, and looks like exactly what I need.
BigBeagle
+1 - SO needs more elegant explanations like this.....when it comes to math, at least.
Jacob
Btw, you can calculate covariance in MATLAB directly with `cov` but your code was obviously more instructive.
Jacob
Additionally, `eigshow` is a nice MATLAB demo to play with if you want a feel for SVD or eigenvalue decomposition.
Jacob