[Neuroimaging] [nibabel] sform/qform flipping left - right in the affine and (possibly) fsl

Samuel St-Jean stjeansam at gmail.com
Mon Jun 27 08:04:48 EDT 2016


So, to add a more practical example to what I outlined above, seems like
saving a dataset in this manner preserves the sform, but changes the qform.
According to the doc, they should both provide the same information in
reconstructing the affine (possible from different origins). So I compared
the header of an original nifti file and the same thing after saving it
without headers, and here are the interesting parts.

- sform is identical
- sform name changed from

sform_name     Scanner Anat
sform_code     1

to

sform_name     Aligned Anat
sform_code     2

- some qform fields went from

qform_name     Scanner Anat
qform_code     1
qto_xyz:1      1.796652  0.000000  0.000000  -115.754318
qto_xyz:2      0.000000  1.795833  -0.054337  -90.885376
qto_xyz:3      0.000000  0.054236  1.799180  54.572971

to

qform_name     Unknown
qform_code     0
qto_xyz:1      1.796652  0.000000  0.000000  0.000000
qto_xyz:2      0.000000  1.796652  0.000000  0.000000
qto_xyz:3      0.000000  0.000000  1.800000  0.000000

Which leaves me wondering what is to be trusted in these fields. Seems like
the translation of origin in qform changed (and the name is unknown, so
nibabel ignores it on loading), but the sform name changed without changing
the actual matrix and now has the translation of the qform. Is there a way
to know how these fields are consistent when recreated by nibabel versus
the original provided in the (now stripped) header? Or maybe the fsl suite
just does not respect some convention I am unaware of (like trusting
undefined qform over sform or something else like that), which is also
possible, and would fall out of scope of this mailing list.

Samuel

2016-06-24 8:35 GMT+02:00 Samuel St-Jean <stjeansam at gmail.com>:

> Hello,
>
> So this is probably gonna look as a confused question because I still do
> not fully understand the issue myself. Anyway, reading upon
> https://github.com/nipy/nibabel/pull/90 and playing with loading a nifti
> and saving it back, it seems like sometimes the affine, sform and qform do
> not fully agree upon something and end up overwriting each other.
>
> This also seems to only happen with data that went through fsl, like the
> HCP datasets. So basically a normal pipeline involving nibabel is like
>
>
> volume = nib.load('my_data.nii.gz')
> data = volume.get_data()
> affine volume.get_affine()
>
> ## Do stuff on data
>
> nib.save(nib.Nifti1Image(data, affine),'my_new_data.nii.gz')
>
>
> Note how I did not save the header in this case. Now, for almost all
> cases, this works fine and a new header get created. And now for the
> question :
>
> Is it a bad idea to strip out the header (since dtype, pixdim and other
> things might change depending on the processing involved)?
> Is it possible to save back exactly the same header / sform / qform so
> that data won't be flipped in e.g. fslvew afterward? Is it just because
> software don't play well together or there is an unseen issue I don't get
> here?
>
> I also remember a few years back playing the whole afternoon with get/set
> qform and sform rewriting our affines everytime, so I though might as well
> ask everyone since we never fully figured out the logic between what sets
> the affine in the header and why.
>
>
> Thanks for reading,
>
> Samuel
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/neuroimaging/attachments/20160627/b4cb494a/attachment.html>


More information about the Neuroimaging mailing list