I've been trying to solve a problem. I'm surprised I haven't been able to find anything really useful on the net.
I know that from the eigenvalues of the covariance matrix of the ellipse, the major and the minor axis of the ellipse can be computed. As the following:
a1 = 2*sqrt(e1)
a2 = 2*sqrt(e2)
where a1
and a2
are the major and minor axis, e1
and e2
are the eigenvalues of covariance matrix.
My question is: given an edge points (xi,yi)
of the image ellipse, how it possible to find the 2×2 covariance matrix of that ellipse?
Just by pure reverse engineering (I'm not familiar anymore with this material), I can do this:
%// Generate circle
R = 189;
t = linspace(0, 2*pi, 1000).';
x = R*cos(t);
y = R*sin(t);
%// Find the radius?
[~,L] = eig( cov([x,y]) );
%// ...hmm, seems off by a factor of sqrt(2)
2*sqrt( diag(L) )
%// so it would come out right when I'd include a factor of 1/2 in the sqrt():
2*sqrt( diag(L)/2 )
So, let's test that theory for general ellipses:
%// Random radii
a1 = 1000*rand;
a2 = 1000*rand;
%// Random rotation matrix
R = @(a)[
+cos(a) +sin(a);
-sin(a) +cos(a)];
%// Generate pionts on the ellipse
t = linspace(0, 2*pi, 1000).';
xy = [a1*cos(t) a2*sin(t);] * R(rand);
%// Find the deviation from the known radii
%// (taking care of that the ordering may be different)
[~,L] = eig(cov(xy));
min(abs(1-bsxfun(@rdivide, 2*sqrt( diag(L)/2 ), [a1 a2; a2 a1])),[],2)
which always returns something acceptably small.
So, seems to work :) Can anyone verify that this is indeed correct?