Dear all,<br><br>I&#39;m trying to make a simple function that translates a dicom volume by a certain amount.<br>It first opens all dicom slides of an mri scan.<br><br>To do this, I pasted DicomSeriesReadImageWrite2.cxx and ResampleImageFilter.cxx and adjusted<br>

the latter so it accepts 3 dimensions instead of two and uses integer instead of unsigned char.<br><br>The function compiles and a .vtk volume is written. However, there&#39;s no image data in the file.<br>It does display all pixels with value 100, as I set  by: filter-&gt;SetDefaultPixelValue( 100 );<br>

<br>questions:<br>1) am I too naive to think that the ResampleImageFilter can easily be extended from 2 to 3 dimensions?<br>2) if not, what did I do wrong?<br><br>I pasted the source code below.<br><br>//////////////////////////////////////////////////////////////////////////////////////////////////<br>

#if defined(_MSC_VER)<br>#pragma warning ( disable : 4786 )<br>#endif<br><br>#ifdef __BORLANDC__<br>#define ITK_LEAN_AND_MEAN<br>#endif<br><br>#include &quot;itkOrientedImage.h&quot;<br>#include &quot;itkGDCMImageIO.h&quot;<br>

#include &quot;itkGDCMSeriesFileNames.h&quot;<br>#include &quot;itkImageSeriesReader.h&quot;<br>#include &quot;itkImageFileWriter.h&quot;<br>#include &quot;itkResampleImageFilter.h&quot;<br><br>#include &quot;itkAffineTransform.h&quot;<br>

#include &quot;itkNearestNeighborInterpolateImageFunction.h&quot;<br>// Software Guide : EndCodeSnippet<br><br>int main( int argc, char* argv[] )<br>{<br><br>  if( argc &lt; 3 )<br>    {<br>    std::cerr &lt;&lt; &quot;Usage: &quot; &lt;&lt; std::endl;<br>

    std::cerr &lt;&lt; argv[0] &lt;&lt; &quot; DicomDirectory  outputFileName  [seriesName]&quot; <br>              &lt;&lt; std::endl;<br>    return EXIT_FAILURE;<br>    }<br><br>  typedef signed short    PixelType;<br>
  const unsigned int      Dimension = 3;<br>
<br>  typedef itk::OrientedImage&lt; PixelType, Dimension &gt;         ImageType;<br><br>  typedef itk::ImageSeriesReader&lt; ImageType &gt;        ReaderType;<br>  ReaderType::Pointer reader = ReaderType::New();<br><br>
  typedef itk::GDCMImageIO       ImageIOType;<br>
  ImageIOType::Pointer dicomIO = ImageIOType::New();<br>  <br>  reader-&gt;SetImageIO( dicomIO );<br><br>  typedef itk::GDCMSeriesFileNames NamesGeneratorType;<br>  NamesGeneratorType::Pointer nameGenerator = NamesGeneratorType::New();<br>

<br>  nameGenerator-&gt;SetUseSeriesDetails( true );<br>  nameGenerator-&gt;AddSeriesRestriction(&quot;0008|0021&quot; );<br><br>  nameGenerator-&gt;SetDirectory( argv[1] );<br><br>  try<br>    {<br>    std::cout &lt;&lt; std::endl &lt;&lt; &quot;The directory: &quot; &lt;&lt; std::endl;<br>

    std::cout &lt;&lt; std::endl &lt;&lt; argv[1] &lt;&lt; std::endl &lt;&lt; std::endl;<br>    std::cout &lt;&lt; &quot;Contains the following DICOM Series: &quot;;<br>    std::cout &lt;&lt; std::endl &lt;&lt; std::endl;<br>

<br>    typedef std::vector&lt; std::string &gt;    SeriesIdContainer;<br>    <br>    const SeriesIdContainer &amp; seriesUID = nameGenerator-&gt;GetSeriesUIDs();<br>    <br>    SeriesIdContainer::const_iterator seriesItr = seriesUID.begin();<br>

    SeriesIdContainer::const_iterator seriesEnd = seriesUID.end();<br>    while( seriesItr != seriesEnd )<br>      {<br>      std::cout &lt;&lt; seriesItr-&gt;c_str() &lt;&lt; std::endl;<br>      seriesItr++;<br>      }<br>

<br>    std::string seriesIdentifier;<br><br>    if( argc &gt; 3 ) // If no optional series identifier<br>      {<br>      seriesIdentifier = argv[3];<br>      }<br>    else<br>      {<br>      seriesIdentifier = seriesUID.begin()-&gt;c_str();<br>

      }<br><br>    std::cout &lt;&lt; std::endl &lt;&lt; std::endl;<br>    std::cout &lt;&lt; &quot;Now reading series: &quot; &lt;&lt; std::endl &lt;&lt; std::endl;<br>    std::cout &lt;&lt; seriesIdentifier &lt;&lt; std::endl;<br>

    std::cout &lt;&lt; std::endl &lt;&lt; std::endl;<br><br>    typedef std::vector&lt; std::string &gt;   FileNamesContainer;<br>    FileNamesContainer fileNames;<br><br>    fileNames = nameGenerator-&gt;GetFileNames( seriesIdentifier );<br>

    reader-&gt;SetFileNames( fileNames );<br>    try<br>      {<br>      reader-&gt;Update();<br>      }<br>    catch (itk::ExceptionObject &amp;ex)<br>      {<br>      std::cout &lt;&lt; ex &lt;&lt; std::endl;<br>      return EXIT_FAILURE;<br>

      }<br>    }<br>  catch (itk::ExceptionObject &amp;ex)<br>    {<br>    std::cout &lt;&lt; ex &lt;&lt; std::endl;<br>    return EXIT_FAILURE;<br>    }<br>//  return EXIT_SUCCESS;<br><br>//////////////////////////////////////////////////////////////////////////////////////<br>

// FROM HERE ADJUSTED ResampleImageFilter.cxx CODE<br>/////////////////////////////////////////////////////////////////////////////////////<br><br>//  const     unsigned int   Dimension = 3;<br>  typedef   unsigned char  InputPixelType;<br>

  typedef   unsigned char  OutputPixelType;<br>  typedef itk::Image&lt; InputPixelType,  Dimension &gt;   InputImageType;<br>//  typedef itk::Image&lt; OutputPixelType, Dimension &gt;   OutputImageType;<br> <br>  typedef itk::Image&lt; PixelType, Dimension &gt;   OutputImageType;<br>

  // typedef itk::ImageFileReader&lt; InputImageType  &gt;  ReaderType;<br><br>  typedef itk::ImageFileWriter&lt; ImageType &gt;  WriterType;<br>  WriterType::Pointer writer = WriterType::New();<br><br><br>  writer-&gt;SetFileName( argv[2] );<br>

<br>//  typedef itk::ResampleImageFilter&lt;ImageType,OutputImageType&gt; FilterType;<br>  typedef itk::ResampleImageFilter&lt;ImageType,ImageType&gt; FilterType;<br>  FilterType::Pointer filter = FilterType::New();<br><br>

  typedef itk::AffineTransform&lt; double, Dimension &gt;  TransformType;<br>  TransformType::Pointer transform = TransformType::New();<br>  filter-&gt;SetTransform( transform );<br><br><br>  typedef itk::NearestNeighborInterpolateImageFunction&lt;ImageType, double &gt;  InterpolatorType;<br>

  InterpolatorType::Pointer interpolator = InterpolatorType::New();<br>  filter-&gt;SetInterpolator( interpolator );<br><br>  <br>  filter-&gt;SetDefaultPixelValue( 100 ); // if pixel in output image not defined, what value?<br>

<br><br>  double spacing[ Dimension ];<br>  spacing[0] = 0.29; // pixel spacing in millimeters along X<br>  spacing[1] = 0.29; // pixel spacing in millimeters along Y<br>  spacing[2] = 3.3; <br><br>  filter-&gt;SetOutputSpacing( spacing );<br>

<br>  double origin[ Dimension ];<br>  origin[0] = 0.0;  // X space coordinate of origin<br>  origin[1] = 0.0;  // Y space coordinate of origin<br>  origin[2] = 0.0;<br><br>  filter-&gt;SetOutputOrigin( origin );<br>  ImageType::DirectionType direction;<br>

  direction.SetIdentity();<br>  filter-&gt;SetOutputDirection( direction );<br>  ImageType::SizeType   size;<br><br>  size[0] = 560;  // number of pixels along X<br>  size[1] = 560;  // number of pixels along Y<br>  size[2] = 300;<br>

<br>  filter-&gt;SetSize( size );<br>  filter-&gt;SetInput( reader-&gt;GetOutput() );<br>//  writer-&gt;SetInput( filter-&gt;GetOutput() );<br>//  writer-&gt;Update();<br>  TransformType::OutputVectorType translation;<br>

  translation[0] = 0;  // X translation in millimeters<br>  translation[1] = 0;  // Y translation in millimeters<br>  translation[2] = 0;<br><br>  transform-&gt;Translate( translation );<br>  // Software Guide : EndCodeSnippet<br>

<br>   writer-&gt;SetInput( filter-&gt;GetOutput() );<br><br>    std::cout  &lt;&lt; &quot;Writing the image as &quot; &lt;&lt; std::endl &lt;&lt; std::endl;<br>    std::cout  &lt;&lt; argv[2] &lt;&lt; std::endl &lt;&lt; std::endl;<br>

    writer-&gt;Update();<br><br>}<br>