Quite often you need to convert the coordinates of some voxels in MNI space to regular matrix coordinates. Below is a script to do so:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% mni2cor %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function coordinate = mni2cor(mni, T) % function coordinate = mni2cor(mni, T) % convert mni coordinate to matrix coordinate % % mni: a Nx3 matrix of mni coordinate % T: (optional) transform matrix % coordinate is the returned coordinate in matrix % % caution: if T is not specified, we use: % T = ... % [-4 0 0 84;... % 0 4 0 -116;... % 0 0 4 -56;... % 0 0 0 1]; % % xu cui % 2004-8-18 % if isempty(mni) coordinate = []; return; end if nargin == 1 T = ... [-4 0 0 84;... 0 4 0 -116;... 0 0 4 -56;... 0 0 0 1]; end coordinate = [mni(:,1) mni(:,2) mni(:,3) ones(size(mni,1),1)]*(inv(T))'; coordinate(:,4) = []; coordinate = round(coordinate); return;

If you need to convert from matrix coordinates to MNI space, then here is the code:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% cor2mni %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function mni = cor2mni(cor, T) % function mni = cor2mni(cor, T) % convert matrix coordinate to mni coordinate % % cor: an Nx3 matrix % T: (optional) rotation matrix % mni is the returned coordinate in mni space % % caution: if T is not given, the default T is % T = ... % [-4 0 0 84;... % 0 4 0 -116;... % 0 0 4 -56;... % 0 0 0 1]; % % xu cui % 2004-8-18 % last revised: 2005-04-30 if nargin == 1 T = ... [-4 0 0 84;... 0 4 0 -116;... 0 0 4 -56;... 0 0 0 1]; end cor = round(cor); mni = T*[cor(:,1) cor(:,2) cor(:,3) ones(size(cor,1),1)]'; mni = mni'; mni(:,4) = []; return;

thanks – exactly what I needed!

My transformation matrix was the following:

[ans.hdr.hist.srow_x; ans.hdr.hist.srow_y; ans.hdr.hist.srow_z; 0 0 0 1]

Dear Xu,

thanks for the code. Can you give me a hint how to obtain the transformation matrix? I know that I have to define several fiducials on my images (like anterior and posterior commissure), but I don’t know of any convenient way (i.e. software) to do this and get mni coordinates from voxel indices. Are you aware of a simple way to do that?

Thanks a lot,

Michael

P.S.: Great motto for your blog ðŸ™‚

@Michael

If you have an image, then use V=spm_vol(‘example.img’); then V.mat is T

@Xu Cui

As far as I know, this only results in valid mni coordinates, as long as the image is in alignment with normal space, i.e., with MNI152 – in all other cases it will give me an arbitrary transformation matrix.

Dear Xu,

thanks, very helpful. This helps me a lot! One related question: I have a set of images that are in a coordinate space and a 4×4 transformation matrix that I can use to covert the cooridnates into mni [3 0 0 81; 0 3 0 -115; 0 0 3 -70; 0 0 0 1]; I could now apply this transformation while looping over all voxels, but that seems cumbersome. Is there a function that could transform the whole 3D (or 4d – 3D +timeseries) from its space into MNI?

Best, Ralf

@ralf

This function can take Nx3 matrix (N voxels at the same time)

Dear Dr. Cui,

I obtained a transformation matrix from an image preprocessed in SPM (normalized to MNI template already) but when I use this function, the location showing up in the mask is L/R flipped: e.g., in MNI coordinate it was on the left but after putting into the matrix space, it showed up on the right of the image. Is there a parameter i should obtain from spm_vol to know if my data is L/R flipped?

Thanks!

Dear Dr. Cui,

I have a problem. I first time have to MNI coordinates to matrix space convert. What am I going to change in the code?

When entered values mni e.g. -41 -4 10 I have error and the program does not work.

Is it working for lots of coordinates?

function coordinate=mni2cor(-41,-4,10), T)

if isempty(mni)

coordinate= [];

return;

end

if nargin ==1

T = …

[-4 0 0 -84; …

0 4 0 -116;…

0 0 4 -56;…

0 0 0 1];

end

coordinate=[mni(:,1) mni(:,2) mni(:,3) ones(size(mni,1),1)]*(inv(T))’;

coordinate(:,4)=[];

coordinate=round(coordinate);

return;

Best,Ila

@Ila

It does work for a lot of coordinates.

Your input should be Nx3 matrix, each row is a coordinate.

Dear Dr. Cui,

Thank you for your answer. I understand what do you write, but can you give me an example on one of coordination? Unfortunately, it is not clear for me and my friends.

I need easy example how define mni?

These are my hard beginnings..

Best, Ila

@Ilona

mni2cor([-41, -4, 10])

mni2cor([-41, -4, 10; -42, -4, 16])

mni2cor([-41, -4, 10], T) % if you have your own T

Dear Dr. Cui,

Thank you for your answer.

Ok so I have somewhere else error.I will think about it.

Dear Dr Cui,

My aim is to write a matlabs function to convert an MNI coordinate into voxel space of the AAL template which can then give me the anatomical labelling. MRIcron already does this, but I wanted to automate this in script form rather than GUI form.

I was hoping to use your mni2cor function but the result doesn’t match with the MNI-voxel conversion as found in MRIcron or SPM. For example, the x y z MNI coordinate of 39,4,58 in the aal template is equivalent to the voxel coordinates of 130 130 130. However, if I use your mni2cor function, leaving the T undefined, gives me the coordinate of 11 30 29 rather than the expected 130 130 130.

I am sure I missing something here, and I suspect it has something to do with how the image (aal) is sliced. Would you be able to help?

Thank you in advance,

Francesca

Oh I just figured it out: the transformation is based on the ratio between MNI and cor, which I can easily calculate. So basically the problem, now solved, was that I needed to define T.

Thank you anyway.

@Francesca

Yes, the T parameter is important.

Hi Xu,

I have a matrix (9142×9142 single) that represents correlation matrix between two brain areas, and I want to get brain images showing the correlation. Is this program usable for that? Not sure about the input matrix.

Thanks,

Fran

@Fran

xjview does not display a correlation matrix, unfortunately.

Dear Dr Cui

I want to use your code to convert FEM based head model to MNI space. Could you kindly give me any reference of yours so that i can refer it on my publication.

Regards

Dr.Rajan Kashyap

@Rajan

Thank you for citing us. You may refer to this blog post http://www.alivelearn.net/?p=1434

@Xu Cui