[Insight-users] ImageWriter does not write Orientation
(Direction Cosines)
Karthik Krishnan
Karthik.Krishnan at kitware.com
Thu Jul 14 23:36:59 EDT 2005
The MetaImage reader and writers propagate direction cosine information
now. So I think you should be able to use them fine.
As Gordon mentioned, the transpose was happening outside Nrrd or the
particular IO mechanism in question. It was due to a bug in
itkImageFileReader.txx.
This has been fixed in CVS.
Thanks
Regards
Karthik
On Thu, 2005-07-14 at 21:19 -0400, Gordon Kindlmann wrote:
> hello,
>
> >> Say I set the following direction cosines:
> >>
> >> 0.286406 0.118831 0.950711
> >> 0.948371 -0.176269 -0.263669
> >> 0.136249 0.977143 -0.16318
> >>
> >> then the NRRD IO writes:
> >>
> >> space directions:
> >> (0.24613,0.10212,0.817017)
> >> (0.815007,-0.151481,-0.22659)
> >> (0.681244,4.88571,-0.815902)
> >>
> >> if I read them with the NRRD IO, I read:
> >>
> >> 0.286406 0.948371 0.136249
> >> 0.118831 -0.176269 0.977143
> >> 0.950711 -0.263668 -0.163181
> >
> > Hmm. Let me investigate this.
>
> Okay, now I have looked into this, and I am convinced that something
> (outside NrrdIO) is transposing the direction cosines somewhere between
> the read and write. I add some debugging code to the very end of
> NrrdImageIO::Read like:
>
> std::vector<double> dir(3);
> double spc;
> for (unsigned int axi=0; axi < 3; axi++) {
> spc = this->GetSpacing(axi);
> dir = this->GetDirection(axi);
> fprintf(stderr, "on read: dir[%d] = %g*(%g %g %g)\n", axi, spc,
> dir[0], dir[1], dir[2]);
> }
>
> and got (via "bin/itkIOTests itkNrrdImageReadWriteTest", which as far
> as I can tell does the simplest possible sequence of reading an image
> and immediately writing it out, with no funny business in the middle):
>
> on read: dir[0] = 1*(1 0 0)
> on read: dir[1] = 1*(0.707107 0.707107 0)
> on read: dir[2] = 1*(0 0 1)
>
> which, by the way, is correct given the field in the NRRD header:
>
> space directions: (1,0,0) (0.707107,0.707107,0) (0,0,1)
>
> And then, at the start of NrrdImageIO::Write, the same debugging code
> (except for changing "read" to "write") produces:
>
> on write: dir[0] = 1*(1 0.707107 0)
> on write: dir[1] = 1*(0 0.707107 0)
> on write: dir[2] = 1*(0 0 1)
>
> which is wrong, and which also corresponds to the behavior Bryn
> observed, whereby the direction cosines seem to have been transformed.
>
> Can someone more versed than I in the details of Image IO help resolve
> where this transposition might be happening?
>
> Karthik, can you reproduce the same behavior in the orientation
> handling that you just added to MetaIO?
>
> thanks,
> Gordon
>
> _______________________________________________
> Insight-users mailing list
> Insight-users at itk.org
> http://www.itk.org/mailman/listinfo/insight-users
More information about the Insight-users
mailing list