[Insight-users] Spacing and DICOM reader

Miller, James V (Research) millerjv at crd.ge.com
Fri, 2 Apr 2004 09:52:40 -0500


Ivan, 

On the first point: A 2D DICOM file can have information in it that
specifies where it lives in a 3D world.  But DICOMImageIO2 was only paying
attention to the first two dimensions specified.  I am making a change now
that will have the DICOMImageIO2 say a 2D image has a 3D position and 3D
spacing. So these fields will be set.  Not that when reading a single DICOM
image, the third component of the spacing will default to the slice
thickness (if specified).  When an ImageSeriesReader is used to read a DICOM
series, the third component of spacing will be determined by the actual
difference in position of two adjacent slices (which is can be different
than the slice thickness). 

I'll post another note when I check in these changes to the CVS repository.

On the second point: After the ITK 1.4 release, DICOMImageIO2 was made the
default DICOM reader.  So when you did not set the ImageIO object on the
SeriesReader, the SeriesReader (via the factory mechanism) defaulted to
using DICOMImageIO (and not DICOMImageIO2).  This explains why you had
problems when you did not set the ImageIO object.  In ITK 1.6, you would not
need to set the ImageIO since the default is DICOMImageIO2.




-----Original Message-----
From: Ivan Bricault [mailto:Ivan.Bricault at imag.fr]
Sent: Friday, April 02, 2004 2:06 AM
To: insight-users at itk.org
Subject: [Insight-users] Spacing and DICOM reader


Hi all,
I have had some troubles using ITK DICOM reader.
I am using ITK 1.4 so I don't know if something has changed in more 
recent ITK versions.

1/  In the file "itDICOMImageIO2.cxx", function "void 
DICOMImageIO2::ReadImageInformation()"
one can see:

"-----------------
  for (int i = 0; i < 2; i++)
    {
    this->SetOrigin(i, origin[i]);
    this->SetSpacing(i, spacing[i]);
    this->SetDimensions(i, dims[i]);
    }
---------------------"

Because the "for" loop stops at i=1, the "z" coordinate of the origin is 
not properly initialized - the same for z spacing.
This problem is solved with a "for (int i = 0; i < 3; i++)" loop.

2/ This second point appears to be completely independent of point 1/ above.

I wrote some code to read a series of DICOM CT files.
This first version explicitly specifies the use of the DICOMImageIO2 
reader.
It works perfectly; in particular, it sets the "z" spacing to the 
correct value, which is 5 for my data:

------------------------
#include "itkImageSeriesReader.h"
#include "itkDICOMImageIO2.h"

typedef ..... ImageType;
typedef itk::ImageSeriesReader<ImageType> SeriesReaderType;
typedef itk::DICOMImageIO2  DICOMReaderType;
SeriesReaderType::Pointer seriesReader = SeriesReaderType::New();
DICOMReaderType::Pointer DICOMreader = DICOMReaderType::New();

while (....)
{
     fileName = .....
     seriesReader->AddFileName(fileName);
}
seriesReader->SetImageIO(DICOMreader);
seriesReader->Update();
--------------------------

The same code WITHOUT the line "seriesReader->SetImageIO(DICOMreader);"
correctly reads the data, EXCEPT that the "z" spacing value is now 
incorrectly set to 1 instead of 5
("x" and "y" spacing values are still OK).
What may be the explanation for that ?
Thanks for your advices !



_______________________________________________
Insight-users mailing list
Insight-users at itk.org
http://www.itk.org/mailman/listinfo/insight-users