Hi Matt,
The inversion is documented in the help:
% world matrix maps from NIfTI world coordinates in target to source. Note:
% mat.txt contains a mapping from source to target
I went for target->source because people are typically pulling images
back into the space of the target (-ref), rather than pushing
coordinates forward to the source (-in) space. But perhaps I could
have been clearer about that...
Anyway, glad it was of some help!
Ged
2009/7/28 Matt Glasser <[log in to unmask]>:
> 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.
>>
>
|