Print

Print


John,
Thanks for your info. I understand it better now and I also think I've 
solved my problem without using Coreg as there are reasons I want to 
avoid it - see what you think. You may have an alternative suggestion or 
point out a hole in my logic.

This is my solution:
-------------------
A = spm_vol('A.img');
B = spm_vol('B.img');
C = spm_vol('C.img');
Initially all .mat arrays are the same = M0
Realign C->B, new C.mat = Mcb
Then realign B->A, new B.mat = Mba
Realignment of original C->A would give C.mat = Mca where
Mca = Mba *  inv(M0) * Mcb
I've tested this and it seems to be accurate to 2dp (which seems 
appropriate).


This is why I'm doing it (comments welcome, if you have the time):
-------------------------------------------------------------------
I am using the Realign function in SPM5 to realign frames in a PET 
dynamic. The PET was acquired over 3 hours with a break in the middle - 
so there are 2 sessions.

Within session, Realign seems to do quite well but the alignment between 
sessions is not so good - you can see this in the mismatch of activity 
curves in small regions. Within session movement is expected to be (and 
apparently is) small compared to the between sessions (i.e. the patient 
& bed do not go back in the same position).

I am guessing the poor between session realignment is because the 
algorithm realigns sessions using the *first* frame from each which do 
not have good stats. I would like to try it with *mean* images from each 
session, hence:

1. realign each frame to the mean within each session.
2. realign the means of each session (mean2 -> mean1).
3. apply this transform to the frames of session 2 by replacing .mat in 
each frame with recalcuated .mat - see above.
Is there an obvious flaw in this plan?

Coreg allows you to apply a single transform to a set of images but I 
have noticed that the coregistration yields 'noiser' realignment 
parameters (though I have to proof they are not more correct).

* Could this be due to the choice of optimization technique?
* Does Coreg have a least-squares option?
* Is this optimization the only difference between Realign & Coreg?

-----------------------------------------------
Joel Dunn
Research Associate
PET Imaging Centre
Guy's, King's and St Thomas' School of Medicine
Lower Ground Floor, Lambeth Wing,
St Thomas' Hospital, Lambeth Palace Road,
London SE1 7EH UK            Tel: 020 7188 8381
Email: [log in to unmask]   Fax: 020 7620 0790
----------------------------------------------- 



John Ashburner wrote:
> The way that the matrices work is a bit different from the principles 
> suggested in your email.  The idea is to align the images so that SPM 
> considers them all to be in alignment with each other. Suppose you have the 
> following, where A, B and C are all aligned with each other (as shown using 
> Check Reg):
>
> A = spm_vol('A.img');
> B = spm_vol('B.img');
> C = spm_vol('C.img');
>
> Then to map from voxels in A to voxels in B, you would use the matrix that 
> maps from voxels in A, to real-world coordinates, and then from real-world 
> coordinates to voxels in B:
>
>     inv(B.mat) * A.mat
> or:
>     B.mat\A.mat
>
> So, if you have some voxel indices i, j and k for the image A, these would 
> correspond to the following indices in B:
>
>     ijk = B.mat\A.mat*[i; j; k; 1];
>     disp(ijk(1:3)')
>
> Note that the order of the multiplications is from right to left, and the 
> steps can be broken down into:
>
>     xyz = A.mat*[i; j; k; 1];
>     ijk = B.mat*xyz;
>     disp(ijk(1:3)')
>
> or as:
>
>     M = B.mat\A.mat
>     ijk = M*[i; j; k; 1];
>     disp(ijk(1:3)')
>
> To map from voxels in B to voxels in A, you would use:
>
>     A.mat\B.mat
>
> Similarly, to map from voxels in C to voxels in A, you would use:
>
>     A.mat\C.mat
>
> By now, you may be getting the picture.
>
> If you are sequentially aligning images together, then you may need to make 
> use of the "other" files.  Here are some examples that should (in principle) 
> work:
>
> --- Example 1 ---
> In this example, both B and C are moved into alignment with A.
>
> 1st coreg
> source image: B <- moved to align with A
> reference image: A
> other images: none
>
> 2nd coreg
> source image: C <- moved to align with A
> reference image: A
> other images: none <- no need for any "other" image to be moved.
>
> --- example 2 ---
> In this example, B and A are first aligned.  Then A is aligned with C, so B 
> also needs to be moved with it.
>
> 1st coreg
> source image: B
> reference image: A
> other images: none
>
> 2nd coreg
> source image: A <- This image gets moved, so you need to move B with it
> reference image: C
> other images: B <- B is in alignment with A, so you move it when you move A.
>
> Best regards,
> -John
>
>
>
> On Thursday 22 January 2009 18:13, Joel Dunn wrote:
>   
>> Hi,
>> How can I calculate SPM transform matrices after successive realignments?
>> E.g. I have 3 images, A B & C.
>>
>> where V=spm_vol(image);
>>
>> If I know the V.mat when C is realigned to B and B realigned to A, what is
>> the V.mat to map C to A?
>>
>> Sounds simple but so am I.
>> Joel
>>