Differences between revisions 25 and 39 (spanning 14 versions)
Revision 25 as of 2009-03-24 13:40:34
Size: 10176
Comment:
Revision 39 as of 2019-03-14 12:07:33
Size: 8624
Editor: 172
Comment:
Deletions are marked like this. Additions are marked like this.
Line 9: Line 9:
or PDF:  or PDF:
Line 11: Line 11:
 * '''[[attachment:fscoordinates.pdf|FS Coordinates (PDF)|&do=get]]'''   * '''[[attachment:fscoordinates.pdf|FS Coordinates (PDF)|&do=get]]'''
Line 17: Line 17:
== 1.0 Coordinate System Overview Disclaimer: The stuff below may or may not be correct. == == Transformations between Freesurfer Surfaces and TrackVis ==
 * FreeSurferTrackVisTransforms
'''Also see:''' [[http://surfer.nmr.mgh.harvard.edu/fswiki/FreeSurferTrackVisTransforms|TrackVis Transforms]] '''<--- !!!'''
Line 19: Line 21:
'''''Disclaimer:''''' The stuff below may or may not be correct.Use the info above instead. == Matlab ==
You can load an MRI volume into matlab with
Line 21: Line 24:
Freesurfer uses at least 4 voxel coordinate systems and 4 "RAS" coordinate systems. mri = MRIread('file.mgz'); % Can also read mgh, nii, nii.gz, img

The mri structure will have several elements, including a 'vol' where
the pixel data will be. The voxel indices of the resulting volume
will relate to the FreeSurfer voxel indices in freeview/tkmedit like:

mri.vol(FSrow+1, FScol+1, FSslice+1) = mri(FScol,FSrow,FSslice)

The mri.vox2ras matrix uses FS indices, ie,
RAS = mri.vox2ras*[FScol FSrow FSslice 1]'


== Use Cases ==

Below are several cases in which someone has a coordinate in one coordinate system and wants to transform it to some other coordinate system (eg, a point on the surface to MNI305 space). Each computation shows the matrices needed and how to get them as well as a check using tkmedit/tksurfer. The equations are based on those in '''[[attachment:fscoordinates.ppt|FS Coordinates (PowerPoint)|&do=get]]'''. CRS is column-row-slice. RAS is right-anterior-superior.

The checks assume you have run tkmedit and tksurfer in the following way:

tkmedit subject orig.mgz -reg register.dat -ov mov.nii -surfs

tksurfer subject lh inflated -reg register.dat -ov mov.nii

Note on Talairach: FreeSurfer does not report true "Talairach" coordinates. The coordinates listed unter "Talairach" are actually based on Matthew Brett's 10/8/98 non-linear transform from MNI305 space (see http://www.mrc-cbu.cam.ac.uk/Imaging/mnispace.html). FreeSurfer also reports "Talairach MNI" coordinates. These are MNI305 space.


== Transforms within a subject's anatomical space ==

------------------------------------------------------------------
1. I have a point on the surface and want to compute the CRS for
voxel in the orig.mgz that corresponds to this point:

VoxCRS = inv(Torig)*[tkrR tkrA tkrS 1]'

where [tkrR tkrA tkrS] is the "Vertex RAS" as seen in the tksurfer
Tools window (also output of mris_convert). Torig is the Vox2tkrRAS
matrix obtained from "mri_info --vox2ras-tkr orig.mgz" (note: this is
the same for all orig volumes).

Test: click on a point in tksurfer. Use "Vertex RAS" to compute
Vox2CRS. Round Vox2CRS to the nearest integer. Hit Save Point in
tksurfer. In tkmedit, Goto Saved Point. Compare VoxCRS to "Volume
Index". Note: you may need to use the "Volume RAS" from tkmedit in the
computation above to get an exact match.

------------------------------------------------------------------
2. I have an RAS point on the surface (tkrR tkrA tkrS) ("Vertex RAS" from
tksurfer) and want to compute the MNI305 RAS that corresponds to this
point:

MNI305RAS = TalXFM*Norig*inv(Torig)*[tkrR tkrA tkrS 1]'
  TalXFM: subject/orig/transforms/talairach.xfm
  Norig: mri_info --vox2ras orig.mgz
  Torig: mri_info --vox2ras-tkr orig.mgz

Test: click on a point in tksurfer. Use "Vertex RAS" to compute
MNI305RAS. Compare MNI305RAS to "Vertex MNI Talairach". Also, hit Save
Point in tksurfer. In tkmedit, Goto Saved Point, compare MNI305RAS to
"MNI Coordinates". Note: you may need to use the "Volume RAS" from
tkmedit in the computation above to get an exact match.

------------------------------------------------------------------
3. I have a point on the surface ("Vertex RAS" in tksurfer) and want to
compute the Scanner RAS in orig.mgz that corresponds to this point:

ScannerRAS = Norig*inv(Torig)*[tkrR tkrA tkrS 1]'
  Norig: mri_info --vox2ras orig.mgz
  Torig: mri_info --vox2ras-tkr orig.mgz

Test: click on a point in tksurfer. Use "Vertex RAS" to compute
ScannerRAS. Save Point. In tkmedit, Goto Saved Point, compare
ScannerRAS to "Volume Scanner Coordinates".

----------------------------------------------------------------
4. I have a CRS from a voxel in the orig.mgz volume and want to
compute the RAS in surface space (tkrRAS) for this point:

tkrRAS = Torig*[C R S 1]'
  Torig: mri_info --vox2ras-tkr orig.mgz

Test: click on a point in tkmedit very close to the left hemi white
surface. Use the "Volume index" to compute tkrRAS. Hit "Save Point" in
tkmedit. In tksurfer, Goto Saved Point. Compare tkrRAS to "Vertex
RAS". It might not be exactly the same because you might not have
clicked exactly on a vertex in tkmedit.

== Transforms within subject across imaging modalities ==

------------------------------------------------------------------
5. I have a point on the surface ("Vertex RAS") and want to compute the CRS for the
corresponding voxel in my functional/diffusion/ASL/rawavg/etc "mov"
volume:

movCRS = inv(Tmov)*Reg*[tkrR tkrA tkrS 1]'
  Tmov: mri_info --vox2ras-tkr mov.nii
  Reg: register.dat
     tkregister2 --mov mov.nii --reg register.dat

Test: click on a point in tksurfer and hit Save Point. Compute movCRS
using the "Vertex RAS". Round movCRS to the nearest integer. In
tkmedit, Goto Saved Point. Compare movCRS to "Functional Overlay
Index Coordinates".

--------------------------------------------------------------
6. I have a CRS from a voxel in my functional/diffusion/ASL/rawavg/etc
"mov" volume and want to compute the CRS for the corresponding point in
the orig.mgz:

origCRS = inv(Torig) * Reg * Tmov * [movC movR movS 1]'
  Torig: mri_info --vox2ras-tkr orig.mgz
  Tmov: mri_info --vox2ras-tkr mov.nii
  Reg: register.dat
     tkregister2 --mov mov.nii --reg register.dat

Test: click on a point in tkmedit very close to the left hemi white
surface. Use the "Functional Overlay Index Coordinates" to compute
origCRS (round to the nearest integer). Compare origCRS to the "Volume
index". Note: you may need to use the "Volume RAS" from tkmedit in
the computation above to get an exact match.

--------------------------------------------------------------
7. I have a CRS from a voxel in my functional/diffusion/ASL/rawavg/etc
"mov" volume and want to compute the tkrRAS for the corresponding
point on the surface:

tkrRAS = inv(Reg) * Tmov * [movC movR movS 1]'
  Tmov: mri_info --vox2ras-tkr mov.nii
  Reg: register.dat
     tkregister2 --mov mov.nii --reg register.dat

Test: click on a point in tkmedit very close to the left hemi white
surface. Use the "Functional Overlay Index Coordinates" to compute
tkrRAS. Hit "Save Point" in tkmedit. In tksurfer, hit "Goto Saveed
Point". Compare tkrRAS to "Vertex RAS". It might not be exactly the
same because you might not have clicked exactly on a vertex in
tkmedit.

--------------------------------------------------------------
8. I have an RAS from a voxel in MNI305 space (fsaverage space) which
I want to convert to MNI152 space. Create a vector of the MNI305 space
point like v = [R A S 1]'. Multiply this vector by the matrix below
(ie, M*v)
Line 23: Line 166:
0. Stored in volume file
     original volume ========> RAS ("scanner RAS", c_(r,a,s)!=0 in general)
          | |
          | 1. calculated | identity
          | |
          V 2. calculated V
   conformed volume ========> RAS (to have the same c_(r,a,s) as above)
        L^3 with S mm voxel |
          | |
          | identity | 3. calculated (translation)
          | |
          V 4. fixed(standard) V
   conformed volume ========> SurfaceRAS with c_(r,a,s) = 0
      L^3 with S mm voxel
    0.9975 -0.0073 0.0176 -0.0429
    0.0146 1.0009 -0.0024 1.5496
   -0.0130 -0.0093 0.9971 1.1840
Line 38: Line 170:
Eg, if the RAS point is (10 -20 35), then v = [10 -20 35 1]', and M*v
= [10.695 -18.409 36.137 1], so the RAS in MNI152 space would be
10.695 -18.409 36.137.
Line 39: Line 174:
The functional analysis stream uses another coordinate system to map from the src volume. The above matrix is V152*inv(T152)*R*T305*inv(V305), where V152 and
V305 are the vox2ras matrices from the 152 and 305 spaces, T152 and
T305 are the tkregister-vox2ras matrices from the 152 and 305 spaces,
and R is from $FREESURFER_HOME/average/mni152.register.dat
Line 41: Line 179:
--------------------------------------------------------------------------
9. To convert a volume from fsaverage to mni152 space, you can use something like
Line 42: Line 182:
     original volume ========> RAS ("scanner RAS", c_(r,a,s) != 0 in general)
          | |
          | identity | calculated
          V 5. fixed("standard") V
     original volume ========> tkregRAS where c_(r,a,s) = 0
          | |
          | 6. calculated | mri2fmri (registration will give this)
          | |
          V 7. fixed("standard") V
     overlay volume ========> fRAS where c_(r,a,s) = 0
mri_vol2vol --reg $FREESURFER_HOME/average/mni152.register.dat --mov MNI152.nii.gz --targ orig.mgz --inv --o fsaverage.orig.mni152.mgz
Line 53: Line 184:
All these coordinate systems make it a rather difficult task to trace to the original source volume voxel index from surface or functional index. If you can follow the arrows, you can get the necessary transforms easily. where MNI152.nii.gz is the template volume, either 1mm or 2mm. eg, $FSLDIR/data/standard/MNI152_T1_2mm.nii.gz
Line 55: Line 186:
The transform 2 (CORONAL coordinates) is calculated so that the following equation holds. That is, the direction cosine part is fixed, but not the translation part. In this way, the conformed volume always in the CORONAL orientation.
To convert a segmentation to mni152, use something like
Line 58: Line 188:
              [-1 0 0 s1][S 0 0 0][L/2] [c_r] s1 = c_r + S*L/2
              [ 0 0 1 s2][0 S 0 0][L/2] = [c_a] ==> s2 = c_a - S*L/2
       [ 0 -1 0 s3][0 0 S 0][L/2] [c_s] s3 = c_s + S*L/2
              [ 0 0 0 1][0 0 0 1][ 1 ] [ 1 ]
mri_label2vol --reg $FREESURFER_HOME/average/mni152.register.dat --seg aparc+aseg.mgz --temp MNI152.nii.gz --o aparc+aseg.mni152.mgz
Line 63: Line 190:
where c_(r,a,s) is from the "scanner RAS". This "scanner RAS" has the physical meaning of "Right-Anterior-Superior" directions of the head.

The transform 4 (surface``RAS``From``Conformed``Voxel) is fixed as

{{{
              [-1 0 0 S*L/2][S 0 0 0]
              [ 0 0 1 -S*L/2][0 S 0 0]
       [ 0 -1 0 S*L/2][0 0 S 0]
              [ 0 0 0 1 ][0 0 0 1]
}}}

The transform 1 (conformed``Voxel``From``Voxel) is calculated by (in a matrix sense)

{{{
     xform1 = inv(xform2) * xform0 = [1/S 0 0 0][-1 0 0 s1] * xform0
                                      [ 0 1/S 0 0][ 0 0 -1 s3]
          [ 0 0 1/S 0][ 0 1 0 -s2]
                                      [ 0 0 0 1][ 0 0 0 1 ]
}}}
The transform 3(Surface``RAS``From``RAS) is calculated by (in a matrix sense). Note that it is independent of conformed voxel size S and the length L:

{{{
     xform3 = xform4 * inv(xform2) = [ 1 0 0 -c_r]
                                     [ 0 1 0 -c_a]
                                     [ 0 0 1 -c_s]
                                     [ 0 0 0 1 ]
}}}
Because of the xform3 (changing only translation part), it is easy to calculate Surface``RAS``From``Voxel (xform3*xform0) and is given by

{{{
     SurfaceRASFromVoxel = [ 3x3 part (t1 - c_r)]
                           [ same as (t2 - c_a)]
                           [ xform0 (t3 - c_s)]
                           [ 0 1 ]
}}}
where t1,t2,t3 are the translation part of xform0.

The transform 5 and the transform 7 are calculated by the requirement

{{{
              [-1 0 0 s1][xsize 0 0 0][width/2 ] [0]
              [ 0 0 1 s2][ 0 ysize 0 0][height/2] = [0]
       [ 0 -1 0 s3][ 0 0 zsize 0][depth/2 ] [0]
              [ 0 0 0 1][ 0 0 0 1][ 1 ] [1]
}}}
Here the name "RAS" lost the meaning completely. This "RAS" is just to be used for alignment purpose only. The width/height/depth are for the appropriate volume. The reason is that the original volume could be sagittal or horizontal.

== 2.0 Relationship between lores and hires surfaceRAS ==
{{{
                conformed vol -------------> surfRAS
                          | |
                          | | surfRASToRAS
                          V V
                 high res ------------> RAS
                          | |
                          | | Xfm
                          V V
                 low res ------------> RAS
                          | |
                          | | RASToSurfRAS
                          V V
                conformed vol -------------> surfRAS
}}}
Therefore, the map from the high res surfaceRAS to the low res surfaceRAS is given by

{{{
     highresSurfRASTolowresSurfRAS = RASTosurfRAS(lowres) * Xfm * sufRASToRAS(highres)
}}}
which is not equal to Xfm. In fact,

{{{
       RASTosurfRAS(lowres) = 1 0 0 -c_r(lowres) surfRASTORAS(highres) = 1 0 0 c_r(highres)
                              0 1 0 -c_a(lowres) 0 1 0 c_a(highres)
                              0 0 1 -c_s(lowres) 0 0 1 c_s(highres)
                              0 0 0 1 0 0 0 1
}}}

or write these as
{{{
       RASToSurfRAS(lowres) = [ 1 -C(lowres)] surfRASToRAS(highres) = [ 1 C(highres)]
                              [ 0 1 ] [ 0 1 ]

       Xfm = [ R T ]
                              [ 0 1 ]
}}}
Then,
{{{
       highresSurfRASTolowresSurfRAS = [ 1 -C(lowres)] x [ R T ] x [ 1 C(highres)]
                                       [ 0 1 ] [ 0 1 ] [ 0 1 ]

                                     = [ R R*C(highres)-C(lowres) + T ]
                                       [ 0 1 ]
}}}
The conclusion is that the transform is non-trivial. Even when R = 1 and T = 0 (no rotation), we have

{{{
      highresSurfRASTolowresSurfRAS = [ 1 C(highres)-C(lowres)]
                                       [ 0 1 ]
}}}
Therefore, when translating highres vertex positions into lowres vertex position, we must make sure that c_(ras) for highres and lowres must match exactly.

== 3.0 FreeSurferTalairach ==
 * FreeSurferTalairach

== 4.0 Direction cosines ==
The direction cosines tell you about how the acquired volume x, y, z axes correspond to the R(right), A(anterior), S(superier) axes. You can see this info by running the command, [[mri_info]] <volume>. For example, x_r = -1, x_a = 0, x_s = 0 means that the x axis points to the left (-1) of the R axis (no components along A and S axes). The '''CORONAL''' orientation, which is by the way the default freesurfer volume orientation, has x_r = -1, x_a = 0, x_s = 0, y_r = 0, y_a = 0, y_s = -1, z_r = 0, z_a = 1, z_s = 0. This means that the x axis points to the left, the y axis points to the inferior, and the z axis points to the anterior direction. The "c_ras" values specify where the volume center sits in the RAS coordinate system. That is, c_r, c_a. c_s are the RAS coordinate values of a voxel point (width/2, height/2, depth/2). Note that we use the convention of the voxel coordinate such that the center of a voxel corresponds to the
integer voxel coordinate position. This is not the usual convention taken by the graphics software like OpenGL. You have to watch out for this 1/2 voxel position shift.

Each volume format stores this direction cosine information in each own way. COR volume (COR-001, ...) stores it in COR-.info file. [[DICOM]] stores it in the file. Note that Analyze file (.img)stores it in .mat file, meanwhile bflort (.bfloat or .bshort) stores it in .bhdr file. For these formats it is essential to have these files.

== 5.0 MNI Talairach in tkmedit ==
[[tkmedit]] shows a non-identity Talairach even though talairach.xfm is an identity matrix. The reason is described in [[http://www.mrc-cbu.cam.ac.uk/Imaging/Common/mnispace.shtml|Cambride Imagers-MNI space]]. [[tkmedit]] uses Approach 2 described in the web page.

There are two talairach transformed used in [[tksurfer]]. One is MNI talairach and the other is modified talairach. The modified talairach is done in `tksurfer.c conv_initialize()`:

{{{
For Z < 0:

 conv_mnital_to_tal_m_ltz = MatrixIdentity (4, NULL);
  stuff_four_by_four (conv_mnital_to_tal_m_ltz,
        0.99, 0, 0, 0,
        0.00, 0.9688, 0.042, 0,
        0.00, -0.0485, 0.839, 0,
        0.00, 0, 0, 1);
}}}

{{{
For Z > 0:

  conv_mnital_to_tal_m_gtz = MatrixIdentity (4, NULL);
  stuff_four_by_four (conv_mnital_to_tal_m_gtz,
        0.99, 0, 0, 0,
        0.00, 0.9688, 0.046, 0,
        0.00, -0.0485, 0.9189, 0,
        0.00, 0, 0, 1);
}}}

top

FreeSurfer Coordinate Systems

The "official" FreeSurfer Coordinate definitions can be found in the following power-points slides (SEE THESE FIRST):

or PDF:

This also includes a little intro to Affine Transformations.

See also: VOX2RAS(PDF)

Transformations between Freesurfer Surfaces and TrackVis

Also see: TrackVis Transforms <--- !!!

Matlab

You can load an MRI volume into matlab with

mri = MRIread('file.mgz'); % Can also read mgh, nii, nii.gz, img

The mri structure will have several elements, including a 'vol' where the pixel data will be. The voxel indices of the resulting volume will relate to the FreeSurfer voxel indices in freeview/tkmedit like:

mri.vol(FSrow+1, FScol+1, FSslice+1) = mri(FScol,FSrow,FSslice)

The mri.vox2ras matrix uses FS indices, ie, RAS = mri.vox2ras*[FScol FSrow FSslice 1]'

Use Cases

Below are several cases in which someone has a coordinate in one coordinate system and wants to transform it to some other coordinate system (eg, a point on the surface to MNI305 space). Each computation shows the matrices needed and how to get them as well as a check using tkmedit/tksurfer. The equations are based on those in FS Coordinates (PowerPoint). CRS is column-row-slice. RAS is right-anterior-superior.

The checks assume you have run tkmedit and tksurfer in the following way:

tkmedit subject orig.mgz -reg register.dat -ov mov.nii -surfs

tksurfer subject lh inflated -reg register.dat -ov mov.nii

Note on Talairach: FreeSurfer does not report true "Talairach" coordinates. The coordinates listed unter "Talairach" are actually based on Matthew Brett's 10/8/98 non-linear transform from MNI305 space (see http://www.mrc-cbu.cam.ac.uk/Imaging/mnispace.html). FreeSurfer also reports "Talairach MNI" coordinates. These are MNI305 space.

Transforms within a subject's anatomical space


1. I have a point on the surface and want to compute the CRS for voxel in the orig.mgz that corresponds to this point:

VoxCRS = inv(Torig)*[tkrR tkrA tkrS 1]'

where [tkrR tkrA tkrS] is the "Vertex RAS" as seen in the tksurfer Tools window (also output of mris_convert). Torig is the Vox2tkrRAS matrix obtained from "mri_info --vox2ras-tkr orig.mgz" (note: this is the same for all orig volumes).

Test: click on a point in tksurfer. Use "Vertex RAS" to compute Vox2CRS. Round Vox2CRS to the nearest integer. Hit Save Point in tksurfer. In tkmedit, Goto Saved Point. Compare VoxCRS to "Volume Index". Note: you may need to use the "Volume RAS" from tkmedit in the computation above to get an exact match.


2. I have an RAS point on the surface (tkrR tkrA tkrS) ("Vertex RAS" from tksurfer) and want to compute the MNI305 RAS that corresponds to this point:

MNI305RAS = TalXFM*Norig*inv(Torig)*[tkrR tkrA tkrS 1]'

  • TalXFM: subject/orig/transforms/talairach.xfm Norig: mri_info --vox2ras orig.mgz Torig: mri_info --vox2ras-tkr orig.mgz

Test: click on a point in tksurfer. Use "Vertex RAS" to compute MNI305RAS. Compare MNI305RAS to "Vertex MNI Talairach". Also, hit Save Point in tksurfer. In tkmedit, Goto Saved Point, compare MNI305RAS to "MNI Coordinates". Note: you may need to use the "Volume RAS" from tkmedit in the computation above to get an exact match.


3. I have a point on the surface ("Vertex RAS" in tksurfer) and want to compute the Scanner RAS in orig.mgz that corresponds to this point:

ScannerRAS = Norig*inv(Torig)*[tkrR tkrA tkrS 1]'

  • Norig: mri_info --vox2ras orig.mgz Torig: mri_info --vox2ras-tkr orig.mgz

Test: click on a point in tksurfer. Use "Vertex RAS" to compute ScannerRAS. Save Point. In tkmedit, Goto Saved Point, compare ScannerRAS to "Volume Scanner Coordinates".


4. I have a CRS from a voxel in the orig.mgz volume and want to compute the RAS in surface space (tkrRAS) for this point:

tkrRAS = Torig*[C R S 1]'

  • Torig: mri_info --vox2ras-tkr orig.mgz

Test: click on a point in tkmedit very close to the left hemi white surface. Use the "Volume index" to compute tkrRAS. Hit "Save Point" in tkmedit. In tksurfer, Goto Saved Point. Compare tkrRAS to "Vertex RAS". It might not be exactly the same because you might not have clicked exactly on a vertex in tkmedit.

Transforms within subject across imaging modalities


5. I have a point on the surface ("Vertex RAS") and want to compute the CRS for the corresponding voxel in my functional/diffusion/ASL/rawavg/etc "mov" volume:

movCRS = inv(Tmov)*Reg*[tkrR tkrA tkrS 1]'

  • Tmov: mri_info --vox2ras-tkr mov.nii Reg: register.dat
    • tkregister2 --mov mov.nii --reg register.dat

Test: click on a point in tksurfer and hit Save Point. Compute movCRS using the "Vertex RAS". Round movCRS to the nearest integer. In tkmedit, Goto Saved Point. Compare movCRS to "Functional Overlay Index Coordinates".


6. I have a CRS from a voxel in my functional/diffusion/ASL/rawavg/etc "mov" volume and want to compute the CRS for the corresponding point in the orig.mgz:

origCRS = inv(Torig) * Reg * Tmov * [movC movR movS 1]'

  • Torig: mri_info --vox2ras-tkr orig.mgz Tmov: mri_info --vox2ras-tkr mov.nii Reg: register.dat
    • tkregister2 --mov mov.nii --reg register.dat

Test: click on a point in tkmedit very close to the left hemi white surface. Use the "Functional Overlay Index Coordinates" to compute origCRS (round to the nearest integer). Compare origCRS to the "Volume index". Note: you may need to use the "Volume RAS" from tkmedit in the computation above to get an exact match.


7. I have a CRS from a voxel in my functional/diffusion/ASL/rawavg/etc "mov" volume and want to compute the tkrRAS for the corresponding point on the surface:

tkrRAS = inv(Reg) * Tmov * [movC movR movS 1]'

  • Tmov: mri_info --vox2ras-tkr mov.nii Reg: register.dat
    • tkregister2 --mov mov.nii --reg register.dat

Test: click on a point in tkmedit very close to the left hemi white surface. Use the "Functional Overlay Index Coordinates" to compute tkrRAS. Hit "Save Point" in tkmedit. In tksurfer, hit "Goto Saveed Point". Compare tkrRAS to "Vertex RAS". It might not be exactly the same because you might not have clicked exactly on a vertex in tkmedit.


8. I have an RAS from a voxel in MNI305 space (fsaverage space) which I want to convert to MNI152 space. Create a vector of the MNI305 space point like v = [R A S 1]'. Multiply this vector by the matrix below (ie, M*v)

    0.9975   -0.0073    0.0176   -0.0429
    0.0146    1.0009   -0.0024    1.5496
   -0.0130   -0.0093    0.9971    1.1840

Eg, if the RAS point is (10 -20 35), then v = [10 -20 35 1]', and M*v = [10.695 -18.409 36.137 1], so the RAS in MNI152 space would be 10.695 -18.409 36.137.

The above matrix is V152*inv(T152)*R*T305*inv(V305), where V152 and V305 are the vox2ras matrices from the 152 and 305 spaces, T152 and T305 are the tkregister-vox2ras matrices from the 152 and 305 spaces, and R is from $FREESURFER_HOME/average/mni152.register.dat


9. To convert a volume from fsaverage to mni152 space, you can use something like

mri_vol2vol --reg $FREESURFER_HOME/average/mni152.register.dat --mov MNI152.nii.gz --targ orig.mgz --inv --o fsaverage.orig.mni152.mgz

where MNI152.nii.gz is the template volume, either 1mm or 2mm. eg, $FSLDIR/data/standard/MNI152_T1_2mm.nii.gz

To convert a segmentation to mni152, use something like

mri_label2vol --reg $FREESURFER_HOME/average/mni152.register.dat --seg aparc+aseg.mgz --temp MNI152.nii.gz --o aparc+aseg.mni152.mgz

CoordinateSystems (last edited 2019-07-29 17:18:06 by 172)