Hey,
read the help on spm_coreg function. it is important to know what
direction you want to go. that is to say, if you are co-registering your
target image to your source image, then you only want to apply the
transformation to your target image and not the source, then reslice
your target image.
(hope i am not confusing you)
for instance, say i am co-registering T2 image to T1:
T1_vol = spm_vol(T1);
T2_vol = spm_vol(T2);
x = spm_coreg(T2_vol, T1_vol);
M = spm_matrix(x);
spm_get_space(T2, M * T2_vol.mat);
% for re-slicing i usually construct my flags first:
flags= struct('interp',5,'mask',1,'mean',0,'which',1,'wrap',[0 0 0]');
% then the files i want to re-slice, source file first (in our example
T1 image)
files = {T1;t2}
spm_reslice(files, flags);
note that here i have used b-splies degree of 5 for interpolation, if
you chose any method other than tri-linear or nearest neighbor, you will
have negative intensities in your image that you need to take care of.
so,
T2_img = spm_read_vols(T2_vol);
T2_img(T2_img < 0) = 0 ;
spm_write_vols(T2, T2_img);
Hope this helps
-P
On Wed, 2010-06-02 at 11:39 -0700, Dan Golding wrote:
> Thanks Pouria and Bas
>
> So I should use spm_get_space on the target image? I understood
> spm_get_space to be changing the header of the files it act on which
> is why I assumed it should be used on the source image which is the
> one I want to warp?
>
> Also would you mind filling in the dots on your spm_reslice(...) line
> as I think I must be using the function incorrectly at the moment as
> it doesn't seem to change my image at all. Which files should I run it
> on and in what order?
>
> Am I correct in saying that if I modify the header of a nifti image
> using spm_get_space and then use spm_reslice on the image, when I view
> the image in another software package it should have changed. Or have
> I misunderstood?
>
> Thanks
> Dan
>
> On Wed, Jun 2, 2010 at 6:30 PM, Pouria Mojabi <[log in to unmask]>
> wrote:
> Hey Dan,
>
> I usually do it this way:
>
> src = spm_vol(src image)
> trg = spm_vol(trg image)
>
> x = spm_coreg(trg, src)
> A = spm_matrix(x)
>
>
> Now, i suggest this way of using spm_get_space:
> spm_get_space(trgimage, A * trg.mat)
>
> and then
> spm_reslice(....)
>
>
> hope this helps
>
> -P
>
>
>
>
>
> On Wed, 2010-06-02 at 07:48 -0700, Dan Golding wrote:
> > Hi,
> >
> > Thanks for the responses. I've been trying to work this out
> over the
> > last couple of weeks. The reason I have to work with the
> matrix
> > algebra is that I need to apply this transformation to a
> completely
> > different data set and so I am currently trying to reapply
> the
> > transform on the original data to see if I can replicate
> what spm is
> > doing. But I have having trouble getting spm to apply an
> affine
> > transform from the command line. Here is what I have been
> trying
> > (ignore the file names), perhaps someone can point out what
> I'm doing
> > wrong? (Note I am trying to transform ef1t to look like
> fu2t)
> >
> > src = spm_vol('EF1T_t1.nii');
> > trg = spm_vol('FU2T_t1.nii');
> >
> > x = spm_coreg(trg, src);
> > A = spm_matrix(x)*spm_get_space('fu2t_t1.nii');
> >
> > spm_get_space('ef1t_t1.nii',A);
> > spm_reslice(['fu2t_t1.nii';'ef1t_t1.nii'])
> >
> >
> > However this is not changing the image at all. I also tried
> > spm_reslice('ef1t_t1.nii') which also did not help. I guess
> I'm not
> > using the reslice function correctly, or else I haven't
> changed the
> > header in EF1T_t1.nii correctly to contain the tranform.
> >
> > How do I do this?
> >
> > Thanks
> > Dan
> >
> >
> > On Fri, May 21, 2010 at 6:33 PM, John Ashburner
> > <[log in to unmask]> wrote:
> > After alignment and the modification of the headers,
> mapping
> > from voxel
> > to voxel is by A\B or B\A. Coregistration estimates
> a
> > rigid-body matrix
> > (R), which is used to update the voxel-to-world
> mapping of the
> > moved
> > image so that the A\B or B\A thing does as it
> should.
> >
> > Best regards.
> > -John
> >
> >
> > On Fri, 2010-05-21 at 15:55 +0200, Neggers, S.F.W.
> wrote:
> > > Just to verify:
> > >
> > > The method I suggested was : voxel-to-world
> matrices A and B
> > division,
> > > eg A/B, or A*inv(B) which is the same
> mathematically. This
> > in my
> > > experience maps a coordinate in world space of
> image 1 to
> > the world
> > > space of image 2, assuming both images overlapped
> in voxel
> > space. I just
> > > guessed that is what Dan asked for, but I could
> easily be
> > mistaken. I
> > > use this to map a world space point p in an image
> to the
> > same location
> > > in that image after coregistration.
> > >
> > > John: what you suggest maps voxels in one image to
> voxels in
> > another
> > > image, right? This of course is something
> different.
> > >
> > > Don't want to cause any confusion, so just
> checking...
> > >
> > > So Dan, just pick what you need for the problem
> you are
> > working on.
> > >
> > > Have a nice weekend,
> > >
> > > Bas
> > >
> > > --------------------------------------------------
> > > Dr. S.F.W. Neggers
> > > Division of Brain Research
> > > Rudolf Magnus Institute for Neuroscience
> > > Utrecht University Medical Center
> > > Visiting : Heidelberglaan 100, 3584 CX Utrecht
> > > Room B.01.1.03
> > > Mail : Huispost B.01.206, P.O. Box 85500
> > > 3508 GA Utrecht, the Netherlands
> > > Tel : +31 (0)88 7559609
> > > Fax : +31 (0)88 7555443
> > > E-mail : [log in to unmask]
> > > Web : http://www.neuromri.nl/people/bas-neggers
> > > http://www.neuralnavigator.com
> > > --------------------------------------------------
> > >
> > >
> > >
> > > > -----Oorspronkelijk bericht-----
> > > > Van: SPM (Statistical Parametric Mapping)
> > > > [mailto:[log in to unmask]] Namens John
> Ashburner
> > > > Verzonden: vrijdag 21 mei 2010 15:24
> > > > Aan: [log in to unmask]
> > > > Onderwerp: Re: [SPM] Finding affine
> transformation
> > parameters
> > > >
> > > > To register two images of the same subject, the
> objective
> > is
> > > > to be able to map from voxels in one image to
> voxels in
> > the
> > > > other. Doing this requires the "voxel to world"
> matrices
> > in
> > > > the headers. So, to go from image 1 (whos
> voxel-to-world
> > > > mapping is M1) to image 2 (whose mapping is M2),
> you would
> > need to:
> > > >
> > > > 1) Map from voxels in image 1 to world space
> (multiply by
> > M1)
> > > > 2) Rotate and translate this world space into
> alignment
> > with
> > > > the world space of image 2 (multiply by R)
> > > > 3) Map from this world space back to voxels in
> image 2
> > > > (multiply by the inverse of M2).
> > > >
> > > > So the overall matrix is: M2\R*M1
> > > > And the mapping from voxels in image 2 to those
> in image 1
> > is:
> > > > inv(M1)*inv(R)*M2
> > > >
> > > >
> > > > The six parameters computed by spm_coreg are as
> described
> > in
> > > > spm_matrix.m . They paramaterise R (or its
> inverse).
> > Going
> > > > back from a matrix R to the parameters can be
> done by
> > spm_imatrix.
> > > >
> > > > Best regards,
> > > > -John
> > > >
> > > >
> > > > On Fri, 2010-05-21 at 13:42 +0100, Dan Golding
> wrote:
> > > > > Hi,
> > > > >
> > > > > I would like to find the 12 parameters for an
> affine
> > > > transformation between two nifti images. I have
> been
> > looking
> > > > into using spm_coreg and spm_matrix but I
> couldn't quite
> > > > understand how to use them form their help.
> spm_coreg
> > outputs
> > > > 6 parameters, I'm not sure what these 6 are?
> > > > >
> > > > > Also is there a function that does the reverse
> of
> > > > spm_matrix, i.e. one that can take an affine
> > transformation
> > > > matrix and split it into 3 rotations, 3 scalings
> etc...?
> > > > >
> > > > > Thanks
> > > > > Dan
> > > > >
> > > >
> > > > --
> > > > John Ashburner <[log in to unmask]>
> > > >
> > >
> > >
> >
> ------------------------------------------------------------------------------
> > >
> > > De informatie opgenomen in dit bericht kan
> vertrouwelijk
> > zijn en is
> > > uitsluitend bestemd voor de geadresseerde. Indien
> u dit
> > bericht onterecht
> > > ontvangt, wordt u verzocht de inhoud niet te
> gebruiken en de
> > afzender direct
> > > te informeren door het bericht te retourneren. Het
> > Universitair Medisch
> > > Centrum Utrecht is een publiekrechtelijke
> rechtspersoon in
> > de zin van de W.H.W.
> > > (Wet Hoger Onderwijs en Wetenschappelijk
> Onderzoek) en staat
> > geregistreerd bij
> > > de Kamer van Koophandel voor Midden-Nederland
> onder nr.
> > 30244197.
> > >
> > > Denk s.v.p aan het milieu voor u deze e-mail
> afdrukt.
> > >
> > >
> >
> ------------------------------------------------------------------------------
> > >
> > > This message may contain confidential information
> and is
> > intended exclusively
> > > for the addressee. If you receive this message
> > unintentionally, please do not
> > > use the contents but notify the sender immediately
> by return
> > e-mail. University
> > > Medical Center Utrecht is a legal person by public
> law and
> > is registered at
> > > the Chamber of Commerce for Midden-Nederland under
> no.
> > 30244197.
> > >
> > > Please consider the environment before printing
> this e-mail.
> > >
> >
> >
> > --
> >
> > John Ashburner <[log in to unmask]>
> >
> >
> >
>
>
>
|