Login  Register

Re: Transform stack using eigenvectors

Posted by Michael Doube on Aug 27, 2008; 8:11am
URL: http://imagej.273.s1.nabble.com/Transform-stack-using-eigenvectors-tp3695184p3695187.html

Hi all

My implementation of this is here:
http://doube.org/plugins.html

It's set up for my particular situation: 16-bit, HU calibrated stacks of
CT images (dry bones in air), in which the specimen is already pretty
much aligned with its long axis parallel to the stack's Z axis (i.e.
most rotation is in the x-y plane).  Only nearest neighbour
interpolation is used, and the output stack has the same dimensions as
the input stack: data falling outside those dimensions are clipped - so
there's lots of room for improvement!

Cheers

Mike

Stephan Saalfeld wrote:

> Hi Mike,
>
> once you have the axes x'=(x1,y1,z1), y'=(x2,y2,z2), z'=(x3,y3,z3) of
> the new coordinate frame you can easily write down the linear component
> of the homogeneous matrix that transfers your coordinates into this
> coordinate frame as:
>
>  x' y' z'
>
>  |  |  |
>  v  v  v
>
>  x1 x2 x3
>  y1 y2 y3  } = A
>  z1 z2 z3
>
> such that Aa = a'.  If you want to map an image into the `normalized'
> coordinate space, you will typically iterate over the pixels in the
> target image and pick the corresponding coordinates from the
> source---for this you will have to invert A.
>
> I have in mind, that eigenvectors are only defined up to a rotation of
> 180deg such that you would have to find out where is top and where is
> bottom for each of them.  I would be glad if someone could prove me
> wrong with this, particularly because I don't find any reference about
> it any more...
>
> Best regards,
> Stephan
>
>
> On Thu, 2008-08-21 at 16:19 +0100, Michael Doube wrote:
>  
>> To answer my own question:
>>
>> The aligned position is the 3 dot products of the original coordinate
>> (x,y,z) and the 3 eigenvectors (the principal axes).  Each eigenvector
>> is a normal to the plane that contains the other 2 eigenvectors because
>> they are orthogonal.  A plane is defined by the vector of its normal and
>> the position of the plane on that normal.  The dot product of a plane
>> and a point is the distance between plane and point, assuming that
>> (0,0,0) is a solution for the plane.  So if you subtract the centroid
>> from the point and work out the 3 dot products corresponding to the 3
>> eigenplanes, you have the distance along each of the eigenvectors which
>> defines the point in the principal axis coordinate frame, and hence
>> gives you 'aligned' coordinates.  Then the aligned coordinates can be
>> drawn in ordinary image coordinates and the object is aligned according
>> to its principal axes.
>>
>> If that makes no sense or is blatantly wrong, please email me, otherwise
>> it's going in a plugin tonight...
>>
>> Mike
>>    
>>> -----Original Message-----
>>> From: ImageJ Interest Group [mailto:[hidden email]] On Behalf Of
>>> Michael Doube
>>> Sent: Friday, August 15, 2008 5:57 PM
>>> To: [hidden email]
>>> Subject: Transform stack using eigenvectors
>>>
>>> Hi all
>>>
>>> I have written a plugin that calculates the 3D moments of inertia of a
>>> bone imaged in CT, using the Jama package and eigen decomposition.
>>>
>>> Now that I have a set of eigenvalues and eigenvectors I want to align my
>>> object such that its principal axes are parallel with the x,y,z axes of
>>> a new stack.
>>>
>>> Can anyone shed some light as to how to best achieve this?
>>>
>>> Mike
>>>
>>>  
>>>