Hi Cory,
It doesn't seem right to me that the coordinates are not correctly
applied in Paraview and that a user should have to apply a
transformation. I thought initially the issue was with VTK but on
emailing the devel group I got the following response
Hi Padraig,
What you are seeing is one of the big (very big) differences between
ITK images and VTK images. It comes about because in ITK, the
direction cosines are stored in the image class, but in VTK, they are
not, and they must instead be stored in a separate matrix. You're
probably wondering why this matters at all, since your image has
direction cosines of ((1,0,0),(0,1,0),(0,0,1)). Hopefully I'll be
able to provide an explanation that isn't too muddy.
In ITK, the transformation from the (I,J,K) indices of each voxel to
the (x,y,z) coordinates is as follows:
let q = (I,J,K)
let p = (x,y,z)
p = R*S*q + o
where R is ITK's Direction matrix, S is the "scale" matrix (a diagonal
matrix made from the Spacing), and "o" is ITK's Origin.
Since vtkImageData does not have a Direction matrix, but most medical
image formats do have a Direction, it is necessary for VTK medical
image readers to produce a vtkMatrix4x4 in addition to the
vtkImageData. In VTK, the equivalent equation is:
p = R*(S*q + o)
Or we can expand this,
p = R*S*q + R*o
See how the ITK Origin and the VTK Origin mean different things? The
ITK origin is rotated with respect to the VTK origin. In fact, the
way that VTK defines the image "Origin" is incompatible with NIFTI
(and with DICOM, too).
So, the vtkNIFTIImageReader always sets the VTK image Origin to
(0,0,0). Then, it stores an ITK-style Origin as the 4th column of the
SFormMatrix and the QFormMatrix. That's an advantage of using a 4x4
matrix: it can store both a rotation and an offset. When we introduce
this matrix "M" and set the VTK image Origin to (0,0,0),
p = M*S*q
Of course, now we have to make p and q into (I, J, K, 1) and (x, y, z,
1) in order to use the 4x4 matrix. I'll let you work out the rest of
the details.
In order to properly compute the bounds of an oriented image in VTK,
you have to compute the coordinates of the four corners and then
multiply them by the matrix M (i.e. by the SFormMatrix). In your
case, since the "orientation" is identity, you could simply add the
offset.
If you're wondering why the reader doesn't set the VTK image Origin to
be equal to the offset for axial images, it's to avoid inconsistency
between the way the reader treats axial images as compared to sagittal
or coronal.
For Paraview, you'll have to find a way to get Paraview to use the
SFormMatrix (or the QFormMatrix) that is provided by the reader.
Unfortunately, I don't know enough about Paraview to help with that...
hopefully one of the Paraview users around here can help.
Thanks
Pádraig
On 14/11/16 22:34, Cory Quammen wrote:
On Mon, Nov 14, 2016 at 5:25 PM, padraig <[email protected]> wrote:
I have been using the analyseniftiio plugin to open .nii files in paraview.
Ah, I see. I had forgotten about that one.
In Slicer 4.6.2 they do not occupy the same physical space. The direction is
different although the origin is the same.
I looked again in Slicer and you are right. Looking at
vtkNIfTIReader.cxx, the direction information seems to be ignored by
ParaView. Which makes sense because VTK and ParaView do not support
the concept of direction cosines, just origin and spacing. In
ParaView, you'll have to transform one of the volumes using the
Transform filter and scaling the Z direction by -1. Because the x and
y direction diagonals are also -1, you may want to scale those axes by
-1 as well.
HTH,
Cory
Thanks
On 14/11/16 22:11, Cory Quammen wrote:
Are you somehow opening these files in ParaView? I was not able to
either gzipped or not, which is what I expect because ParaView does
not have a Nifti reader to my knowledge.
In Slicer, which can open these files, the volumes are reported to
occupy the same space with an origin at (102.536, 106.413, 30.149).
Please provide more details, step-by-step, about how you are viewing
these files in ParaView.
Thanks,
Cory
On Mon, Nov 14, 2016 at 10:29 AM, padraig <[email protected]>
wrote:
Attached are two volumes that have an overlap in paraview but the ITK
volume
I find using the code below means there should be no overlap
On 14/11/16 15:09, Cory Quammen wrote:
MHA and NIFTII definitely contain position information that ParaView
should read. Do you have any small-ish representative volumes you can
share (privately with me if needed).
On Mon, Nov 14, 2016 at 10:04 AM, padraig <[email protected]>
wrote:
I have used MHA and NIFTII. I have converted the MHA into NIFTII using
both
c3d and ITK.
On 14/11/16 14:59, Cory Quammen wrote:
What file format are you using to load the volumes into ParaView? A
number of formats support volume positioning, so this should be
possible, unless you are loading a series of TIFF images, for example.
Thanks,
Cory
On Mon, Nov 14, 2016 at 5:32 AM, padraig <[email protected]>
wrote:
Dear list,
I have been having problems with the positioning of volumes using
Paraview.
ITK tells me that, using,
IteratorType it2( img_input,
img_input->GetLargestPossibleRegion()
);
it2.GoToBegin();
ImageType::IndexType begin = it2.GetIndex();
img_input->TransformIndexToPhysicalPoint(it2.GetIndex(),p0);
it2.GoToEnd();
--it2;
img_input->TransformIndexToPhysicalPoint(it2.GetIndex(),p1);
std::cout << p0 << p1 << std::endl;
two volumes I have have the positions
[-102.536, -106.413, 30.1491][102.512, 106.414, 177.564]
and
[-102.536, -106.413, 30.1491][102.512, 106.414, -117.265]
When I load these into Paraview they occupy the same volume. In
Slicer3D
the
volumes are distinct as I expect above.
Thanks
Pádraig
_______________________________________________
Powered by www.kitware.com
Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html
Please keep messages on-topic and check the ParaView Wiki at:
http://paraview.org/Wiki/ParaView
Search the list archives at: http://markmail.org/search/?q=ParaView
Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/paraview
_______________________________________________
Powered by www.kitware.com
Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html
Please keep messages on-topic and check the ParaView Wiki at:
http://paraview.org/Wiki/ParaView
Search the list archives at: http://markmail.org/search/?q=ParaView
Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/paraview