Dear Xuemei,

Hi experts,
We performed non-linear registration using the following command:
flirt -in con01_T1.nii -ref MNI152_T1_2mm -omat flirt_mat -out flirt_out
fnirt --ref=MNI152_T1_2mm --in=con01_T1.nii --aff=flirt_mat --cout=warp --iout=fnirt_out

this command is unlikely to give you good results. You should add
—config=T1_2_MNI152_2mm.cnf
to your command.


Assume that (x,y,z) is in the original image(e.g con01_T1.nii) in ”mm coordinates”, which corresponds to the index (i,j,k) in the reference image. And (x’,y’,z’) is the final location in the reference image, then the transform is given by
(x',y',z',1).T = A*(x,y,z,1).T + (dx(i,j,k),dy(i,j,k),dz(i,j,k),0).T
Where A is the 4*4 affine matrix (e.g flirt_mat), d is the displacements field, and .T denotes the transpose.

Suppose (x’,y’,z’) is known, we want to obtain (x,y,z) in the original image. Our solving process is as follows:
First we separate the nonlinear part from warp using “fnirtfileutils” command.
fnirtfileutils --in=warp --ref=MNI152_T1_2mm --out=displacement_field

Then we apply the output to the following formula.
(x,y,z,1).T = A.inv()*((x’,y’,z’,1).T - (dx(i,j,k),dy(i,j,k),dz(i,j,k),0).T)
Where A.inv() denotes the inverse of the affine matrix.

No, this isn’t quite correct. The inverse of the non-linear part is not identical to the negation.

Use the invwarp command

invwarp —warp=<your cout file> —out=my_inverted_warp —ref=con01_T1.nii

and then you can apply “my_inverted_warp” directly to any image in standard space.

Jesper


Is above process correct? And if there exits other methods that can realize that?
Would someone give me some suggestions?

Xuemei