Print

Print


Hi John or anyone else who can help,

Can you clarify the behaviour of spm_flip_analyze_images (set from 
defaults.analyze.flip or to 1 if the defaults global variable doesn't 
exist) in SPM5?

Should it ever be used after spm_vol has returned a structure with a 
matrix? For writing images for example? Or is the vol.mat treated as 
correct, once this has been set from spm_vol.

Is it only used on true Analyze images, and not on single volume .nii 
or on two-volume hdr/img NIfTI pairs?

It appears not to be used if the second pixdim is negative, (judging 
from @nifti/private/mayo2nifti1.m) but I'm not exactly sure for which 
images mayo2nifti1 is called, or where this pixdim comes from.

It seems to me that an image should remain the same if the voxel data 
is flipped AND the matrix is also altered, but as far as I can tell 
from mayo2nifti1 this behaviour could break down if someone had 
defaults.analzye.flip = 1. If image1 has negative pixdim, SPM will 
read it without flipping, but if image2 has flipped voxel data and a 
flipped matrix (hence should be equivalent to image1) SPM will flip 
the image, giving the wrong handedness cf. image1.

This is a bit of a special case, I know, but I just wanted to check...


Also, in John's reorient.m
   http://www.sph.umich.edu/~nichols/JG5/reorient.m
and consequently in my previous version of resize_img.m which was 
based on this, there is the following:

   tc = V.mat(1:3,1:4)*c;
   if spm_flip_analyze_images, tc(1,:) = -tc(1,:); end;

this seems wrong to me now, since if the flipping behaviour has been 
used already to set V.mat, then tc would seem to be correct, before it 
is altered.

Relatedly, there seems to be a problem with the bbvox_from_V function 
in spm_defs.m, for matrices with negative determinant (true e.g. for 
spm5/tpm/grey.nii) the sqrt(sum(sqr())) approach misses the negative 
voxel dimension and reverses the bounding box. This is not noticeable 
with e.g. grey.nii since the bounding box is symmetric in x, but if 
you reorient a copy of grey.nii shifting it to the right, the bounding 
box from bbvox_from_V seems incorrect.

I seem to get the right behaviour -- also for rotated images, which I 
don't think bbvox_from_V handles (?) -- with my new version of:
   http://www.cs.ucl.ac.uk/staff/gridgway/vbm/world_bb.m
which doesn't use spm_flip_analyze_images; but I want to double-check 
that this sounds like it should be correct in general.

One last thing (sorry to go on about this) reorient.m and my current 
resize_img, also have a line:
   if spm_flip_analyze_images, mat = diag([-1 1 1 1])*mat; end;
after forcing the vox sizes to be positive. I think this is okay, 
since this output matrix is used both in writing the headers and in 
reading the data from the existing image, so the physical orientation 
of the output should be correct. But I wonder if it is a better idea 
to set the voxel sizes from spm_imatrix (without abs() to force them 
positive), derive the output matrix from these, and then ignore 
analyze.flip, since this should mean that the resliced image matrix 
has the same sign determinant as the input. Right? I like the fact 
that this approach would just let spm_vol worry about analyze.flip, 
and assume that it does the right thing, but perhaps I am missing a 
reason why it is important to reconsider analyze.flip when reslicing?

Sorry for such a long (and boring -- I know everyone hates orientation 
issues) email, thanks very much for any help anyone can offer,

Ged.