Print

Print


Thanks Mark and Ged.  Ged, as it turned out your script produced the inverse
of the correct transform (but I am sure I feed it the correct one!).  Your
script proved to be an excellent stopgap solution until we get Mark's answer
implemented in the C++.

Peace,

Matt.

-----Original Message-----
From: FSL - FMRIB's Software Library [mailto:[log in to unmask]] On Behalf
Of Mark Jenkinson
Sent: Monday, July 27, 2009 6:54 AM
To: [log in to unmask]
Subject: Re: [FSL] FLIRT Affine Matricies Applied to mm Coordinates

Hi,

Yes, Ged is right - the neurological / radiological change
is what makes this difficult.  The document that Steve sent
is rather out of date now.

The simple description of what happens is this:
  - any "neurological" image has a "swap" applied to the
	x-direction
  - the matrix is applied to "scaled voxel" coordinates.
	That is, multiply the voxel coord by the (absolute)
	value of the voxel dimension (in mm)
  - voxel coords are in the nifti convention (starting at 0)
  - the "swap" in the x-direction is applied to the voxel
	coordinate

So a matrix equation which would map voxel to voxel
coordinates (nifti convention) from input to reference
image would be:
   M = Wref * Sref^{-1} * Mflirt * Sin * Win
where Mflirt is the flirt matrix, Sref is the scaling matrix
for the reference volume (diagonal values equal to
the absolute voxel dimensions and all non-diagonals zero),
Sin is the same for the input volume, Wref is the swap
matrix for the reference and Win is the same for the
input volume.  The swap matrix is the identity if that
image is in "radiological" order, otherwise it is:
  -1 0 0 Nx-1
   0 1 0 0
   0 0 1 0
   0 0 0 1

where Nx is the number of voxels in the x-direction
(of the appropriate image).

If you want to go to or from nifti mm coordinates, then
apply the appropriate sform or qform (your choice) to
the front (ref) or back (input) of the above equation.

Hope this helps.
All the best,
	Mark


On 27 Jul 2009, at 08:54, DRC SPM wrote:

> Hi Matt,
>
> This is a little tricky... I think your problems might come from the
> fact that your diffusion image is radiological (negative determinant
> from diag([-2 2 2 1])) but your structural is neurological (positive
> determinant from diag([1 1 1 1])).
>
> I've battled through this myself before, and your post has just
> prompted me to put the code online, which I'd been meaning to do for
> ages. You should be able to find it here:
>  http://www.nitrc.org/snippet/detail.php?type=package&id=1
> though downloading is currently a bit of a faff (I think NITRC are
> still developing their snippets library procedures). You'll have to
> download flirtmat_read (and name it flirtmat_read.m, not something
> like snippet_1.m!) and flirtmat2worldmat (similarly), then look at the
> help of the latter. Let me know if you have any problems -- with an
> email to ged.ridgway at gmail, since I'm not very active on here right
> now.
>
> Best of luck,
> Ged
>
>
> 2009/7/24 Matt Glasser <[log in to unmask]>:
>> My group is having difficulty implementing the application of a  
>> FLIRT affine
>> transform outside of FLIRT on mm coordinates.  Basically, we have  
>> vectors in
>> diffusion space that need to be moved into structural space without
>> resampling (or we would just use vecreg).  To avoid resampling, we  
>> are
>> converting the vectors to a format that stores the mm coordinates  
>> of their
>> origin (the center of the voxel in diffusion space) and x y and z  
>> components
>> of the unit vector.  Thus, we need to apply a diff2str.mat FLIRT  
>> transform
>> to each set of mm coordinates to find out where they will be in  
>> structural
>> space (where we have cortical surfaces).  This is proving less than
>> straightforward for our programmer to implement in Caret, potentially
>> because of differences in how the origin of the volumes are  
>> defined.  We
>> have the following example situation (which works in flirt or  
>> vecreg, but,
>> we need to do it on mm coordinates):
>>
>>
>>
>> A diffusion volume with the vectors has the following sform:
>>
>>
>>
>> sto_xyz:1      -2.000000  0.000000  0.000000  121.510132
>>
>> sto_xyz:2      0.000000  2.000000  0.000000  -101.654175
>>
>> sto_xyz:3      0.000000  0.000000  2.000000  -36.245544
>>
>> sto_xyz:4      0.000000  0.000000  0.000000  1.000000
>>
>> sform_xorient  Right-to-Left
>>
>> sform_yorient  Posterior-to-Anterior
>>
>> sform_zorient  Inferior-to-Superior
>>
>>
>>
>> An affine matrix diff2str.mat:
>>
>>
>>
>> 0.954197  0.0818732  -0.00957881  -45.0519
>>
>> -0.0968743  1.04984  0.0603049  -21.6026
>>
>> 0.0306892  -0.0608188  1.09415  25.3402
>>
>> 0  0  0  1
>>
>>
>>
>> And a structural volume with the following sform:
>>
>>
>>
>> sto_xyz:1      1.000000  0.000000  0.000000  -88.500000
>>
>> sto_xyz:2      0.000000  1.000000  0.000000  -123.500000
>>
>> sto_xyz:3      0.000000  0.000000  1.000000  -74.500000
>>
>> sto_xyz:4      0.000000  0.000000  0.000000  1.000000
>>
>> sform_xorient  Left-to-Right
>>
>> sform_yorient  Posterior-to-Anterior
>>
>> sform_zorient  Inferior-to-Superior
>>
>>
>>
>> My intuition tells me that some appropriate combination of these  
>> matrices
>> will lead to a mm to mm affine transform that we can apply to the  
>> vectors.
>>  The separate issue of rotating the vectors to account for the affine
>> transform, once we have the correct mm 2 mm one, has been addressed
>> elsewhere.
>>
>>
>>
>> Thanks,
>>
>>
>>
>> Matt.
>