[Insight-users] Writing DICOM series
    Luis Ibanez 
    luis.ibanez at kitware.com
       
    Sun Apr 18 12:36:06 EDT 2010
    
    
  
Hi Dev,
One of the many Great Things about Open Source
is that you can see how things are implemented.     :-)
Open the file:
     Insight/Code/IO/itkGDCMImageIO.cxx
Note the command
     #if GDCM_MAJOR_VERSION < 2
in line 1318.
and its corresponding #else and #endif in lines
1841 and 2229 respectively.
Then got to lines 1944-1952
      else if( key == ITK_Origin )
        {
        typedef Array< double > DoubleArrayType;
        DoubleArrayType originArray;
        ExposeMetaData< DoubleArrayType >( dict, key, originArray );
        m_Origin[0] = originArray[0];
        m_Origin[1] = originArray[1];
        m_Origin[2] = originArray[2];
        }
and lines 1984-1986:
  image.SetOrigin(0, m_Origin[0] );
  image.SetOrigin(1, m_Origin[1] );
  image.SetOrigin(2, m_Origin[2] );
That will  show you that, in summary, when using GDCM 2.0
the position ("origin") of the image, is not taken from the
DICOM tag: 0x0020,0x0032 , but from the image content
specified in
                    image->GetOrigin().
The behavior that you described in your email:
      Using the origin provided by the user
      in the tag 0x0020,0x0032)
only happens when you use a GDCM version < 2,
as you can verify in the lines 1473-1492:
  // In the case where user specifically set the Image Position (Patient)
either
  // directly or indirectly using SetMetaDataDictionaryArray, we should not
try
  // to override it's input
  if( !header->GetValEntry(0x0020,0x0032 ) )
    {
    str.str("");
    str << m_Origin[0] << "\\" << m_Origin[1] << "\\";
    if( m_Origin.size() == 3 )
      {
      str << m_Origin[2];
      }
    else // We are coming from the default SeriesWriter which is passing us
a 2D image
      // therefore default to a Z position = 0, this will make the image at
least valid
      // if not correct
      {
      str << 0.;
      }
    header->InsertValEntry(str.str(),0x0020,0x0032); // Image Position
(Patient)
    }
These lines above are only used when
      #if GDCM_MAJOR_VERSION < 2
Therefore,
The safest way of changing the image origin
is actually by using the:
      itkChangeInformationImageFilter
http://www.itk.org/Doxygen/html/classitk_1_1ChangeInformationImageFilter.html
Please note however, that changing the origin of
an image is a very dramatic action, particularly if
you are dealing with DICOM image, and that you
must have a *very strong* justification for doing so.
In general changing the image parameters by hand,
is a dangerous thing to do.
Please let us know if you have other questions.
 Enjoy the Freedom to understand
 how Software Works   :-)
 Enjoy Open Source !
          Luis
--------------------------------------------------------------------------
On Fri, Apr 16, 2010 at 5:15 AM, dev hurmex <dev at hurmex.fi> wrote:
> Hi,
>
> I use ITK 3.16 + GDCM2.
>
> I write a volume as DICOM series. I set the image position (tag(0020,0032))
> before writing.
> Why the writer (itk::ImageSeriesWriter ) changes it during writing process?
>
> How the image position compute inside ITK or GDCM?
>
> _____________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Kitware offers ITK Training Courses, for more information visit:
> http://www.kitware.com/products/protraining.html
>
> Please keep messages on-topic and check the ITK FAQ at:
> http://www.itk.org/Wiki/ITK_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.itk.org/mailman/listinfo/insight-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20100418/91538ee0/attachment-0001.htm>
    
    
More information about the Insight-users
mailing list