[vtk-developers] Bug in vtkNIFTIImageReader's handling of left-handed images?

mbrown mbrown2 at ualberta.ca
Wed May 6 11:25:56 EDT 2015


Is the following behaviour a bug in vtkNIFTImageReader ?

If you load SPM8's EPI.nii MNI template file using vtkNIFTIImageReader, it
produces different q-form and s-form matrices. Note that the EPI.nii file
obeys radiological convention (i.e. left-right flipped, qfac=-1 and
left-handed s-form matrix), and vtkNIFTIImageReader flips the slice order
and changes the q-form and s-form matrices as described in
vtkNIFTIImageReader.cxx. To reproduce, in Python 2.7.3, running on Ubuntu
12.04, using vtk 6.2.0, do this:

import vtk
file_path = '<path/to/SPM8>/templates/EPI.nii'
r = vtk.vtkNIFTIImageReader()
r.SetFileName(file_path)
r.Update()
print(r.GetNIFTIHeader()) # original header values
print(r.GetQFormMatrix()) # q-form matrix, with modifications by
vtkNIFTIImageReader
print(r.GetSFormMatrix()) # s-form matrix, with modifications by
vtkNIFTIImageReader

The last three lines produce ...

original NIFTI header values (unnecessary fields not shown):
Dim: 3 91 109 91 1 1 1 1
PixDim: -1 2 2 2 0 0 0 0
QFormCode: 4
SFormCode: 4
QuaternB: 0
QuaternC: 1
QuaternD: 0
QoffsetX: 90
QoffsetY: -126
QoffsetZ: -72
SRowX: -2 0 0  90
SRowY:  0 2 0 -126
SRowZ:  0 0 2 -72

q-form matrix
-1  0  0   90
 0 -1  0 -126
 0  0 -1  108
 0  0  0  1

s-form matrix
-1  0  0   90
 0 -1  0 -126
 0  0 -1 -252
 0  0  0  1

I.e. the z-offset number in the fourth column is different between the
q-form and s-form matrices. I tracked down the cause. In
vtkNIFTIImageReader.cxx (accessed from
https://github.com/Kitware/VTK/blob/master/IO/Image/vtkNIFTIImageReader.cxx
on 2015-05-06):

lines 974-976, where it adjusts the q-form matrix when qfac<0:
      mmat[3] -= rmat[0][2]*hdr2->pixdim[3]*(hdr2->dim[3] - 1);
      mmat[7] -= rmat[1][2]*hdr2->pixdim[3]*(hdr2->dim[3] - 1);
      mmat[11] -= rmat[2][2]*hdr2->pixdim[3]*(hdr2->dim[3] - 1);

versus lines 1031-1033, where it adjusts the s-form matrix when qfac<0:
      mmat[3] -= hdr2->srow_x[2]*(hdr2->dim[3] - 1);
      mmat[7] -= hdr2->srow_y[2]*(hdr2->dim[3] - 1);
      mmat[11] -= hdr2->srow_z[2]*(hdr2->dim[3] - 1);

Importantly, the rmat matrix (computed on line 926) used in lines 974-976 is
positive definite whereas the matrix defined by srow_x,y,z and used in lines
1031-1033 has negative determinant, in the case of SPM8's EPI.nii file. This
means that rmat[2,2]=-1 and line 976 adds 180 to mmat[11] taking it from -72
to 108 in the case of EPI.nii. In contrast, srow_z[2]=2, and line 1033
subtracts 180 from mmat[11] taking it from -72 to -252.

Is this difference in behaviour intentional? If so, why?

Other tests suggest that the q-form code is correct and the s-form code is
incorrect. A possible fix would be to replace lines 1031-1033 with:
      mmat[3] += hdr2->srow_x[2]*(hdr2->dim[3] - 1);
      mmat[7] += hdr2->srow_y[2]*(hdr2->dim[3] - 1);
      mmat[11] += hdr2->srow_z[2]*(hdr2->dim[3] - 1);

What do you think? Thanks.
Matt

----------
Matthew Brown, PhD
Department of Psychiatry, University of Alberta
Edmonton, Canada





--
View this message in context: http://vtk.1045678.n5.nabble.com/Bug-in-vtkNIFTIImageReader-s-handling-of-left-handed-images-tp5731787.html
Sent from the VTK - Dev mailing list archive at Nabble.com.


More information about the vtk-developers mailing list