[Insight-users] read a meta image and write a volume to DICOM

wordon m9421001 at gmail.com
Sun Sep 18 22:30:05 EDT 2005


Luis and Diego:
thanks for your help.
I have read the section about 'Reading and Writing Images' in the softwareguide,
and try to write a program based on ' ImageReadImageSeriesWrite.cxx '
and ' DicomSeriesReadSeriesWrite.cxx '.

The code as follows: (the goal is read a meta image and write to DICOM series)

int main( int argc, char *argv[] )
{
  if (argc < 2 )
    {
    std::cout << "Usage: EXE_Name InputFile" << std::endl;
    return EXIT_FAILURE;
    }

  typedef itk::Image< unsigned char, 3 >      ImageType;
  typedef itk::ImageFileReader< ImageType >   ReaderType;

  ReaderType::Pointer reader = ReaderType::New();
  reader->SetFileName( argv[1] );

    try
    {
    reader->Update();
    }
  catch (itk::ExceptionObject &excp)
    {
    std::cerr << "Exception thrown while writing the image" << std::endl;
    std::cerr << excp << std::endl;

    return EXIT_FAILURE;
    }

  typedef itk::Image< unsigned char, 2 >     Image2DType;
  typedef itk::ImageSeriesWriter< ImageType, Image2DType > WriterType;
  WriterType::Pointer writer = WriterType::New();

  typedef itk::GDCMImageIO	ImageIOType;
  ImageIOType::Pointer gdcmImageIO=ImageIOType::New();

  writer->SetImageIO(gdcmImageIO);
  writer->SetInput( reader->GetOutput() );  

  typedef itk::GDCMSeriesFileNames	NamesGeneratorType;
  NamesGeneratorType::Pointer namesGenerator=NamesGeneratorType::New();

   writer->SetFileNames(namesGenerator->GetOutputFileNames());
 
   writer->SetMetaDataDictionaryArray(reader->GetMetaDataDictionaryArray());

    try
    {
    writer->Update();
    }
  catch( itk::ExceptionObject & excp )
    {
    std::cerr << "Exception thrown while writing the series " << std::endl;
    std::cerr << excp << std::endl;
    }

  return EXIT_SUCCESS;
}


But this code has a error message:

error C2039: 'GetMetaDataDictionaryArray' : is not a member of
'ImageFileReader<class itk::Image<unsigned char,3>,class
itk::DefaultConvertPixelTraits<unsigned char> >'
Error executing cl.exe.

My question is :
1)if I want to read image using ImageFileReader<> directly,the
GetMetaDataDictionaryArray can't use in writer.In this situation,how
should I write the meta image to DICOM series as Luis said previously?

2)If I can get the DICOM series,can I use the code as
DicomSeriesReadImageWrite2.cxx to read series and write it to DICOM
volume?

                                                                         Thanks 
                                                                      
                        Wordon


2005/9/16, Luis Ibanez <luis.ibanez at kitware.com>:
> 
> Hi Wordon,
> 
> 1) Yes, it is correct to read a MetaImage with just an ImageFileReader<>
> 
> 2) No, it is not right to write a volume as a DICOM file by using only
>     the ImageFileWriter.  You MUST use the ImageSeriesWriter as explained
>     in detail in the ITK Software Guide
> 
>         http://www.itk.org/ItkSoftwareGuide.pdf
> 
>     in the Chapter "Reading and Writing Images".
> 
>     Note that you must also connect the GDCMImageIO.
> 
>     You will find the relevant source code examples in the directory
> 
>                  Insight/Examples/IO
> 
> 
> 3) A Series is when you store an N-Dimensional image by using
>     multiple files that have dimensions inferior to N.
>     The typical case is to use many 2D files for saving the slices
>     of a 3D volume.
> 
>     It is also common to have many 3D files for saving a 4D image,
>     like for functional MRI, or PET studies, or Cardiac CT
> 
>     With ITK you can write an N-Dimensional image as a series of
>     files with image of Dimension M, where M < N.
> 
> 
> 4) If you store a volume (a 3D image) in DICOM, it will be stored
>     in a series of 2D images.
> 
> 
> Please read the ITK Software Guide,
> 
> 
>     Regards,
> 
> 
>        Luis
> 
> 
> ----------------------------
> 陳政煒 wrote:
> > Hi,Luis and all ITK user:
> >
> > I want to read a meta image and use the data '
> > BrainProtonDensity3Slices.mha' & ' BrainProtonDensity3Slices.raw ' in
> > Insight\Examples\Data.
> > ( I want to read a 3D raw image )
> >
> > And then wirte the meta image  into a volume of DICOM format.
> > (.mhd or .mha --> .dcm)
> >
> >
> > My code as follows :
> >
> > #include "itkImageFileReader.h"
> > #include "itkImageFileWriter.h"
> > #include "itkImage.h"
> > #include "itkRescaleIntensityImageFilter.h"
> > #include "itkMetaDataDictionary.h"
> > #include "itkMetaDataObject.h"
> > #include "itkGDCMImageIO.h"
> >
> > #include <list>
> > #include <fstream>
> >
> > int main(int ac, char* av[])
> > {
> >
> >   if(ac < 3)
> >     {
> >     std::cerr << "Usage: " << av[0] << " InputMETAFile OutputDICOM\n";
> >     return EXIT_FAILURE;
> >     }
> >
> >   typedef itk::Image<unsigned char, 3> ImageType;
> >
> >   typedef itk::ImageFileReader< ImageType > VolumeReaderType;
> >
> >   VolumeReaderType::Pointer reader = VolumeReaderType::New();
> >
> >   reader->SetFileName( av[1] );
> >
> >   try
> >     {
> >     reader->Update();
> >     }
> >   catch (itk::ExceptionObject & e)
> >     {
> >     std::cerr << "exception in file reader " << std::endl;
> >     std::cerr << e.GetDescription() << std::endl;
> >     std::cerr << e.GetLocation() << std::endl;
> >     return EXIT_FAILURE;
> >     }
> >
> >
> >   typedef itk::GDCMImageIO        ImageIOType;
> >
> >   ImageIOType::Pointer gdcmImageIO = ImageIOType::New();
> >
> >
> >   typedef itk::Image<unsigned char, 3> WriteType;
> >   typedef itk::ImageFileWriter<WriteType>     Writer1Type;
> >   Writer1Type::Pointer writer1=Writer1Type::New();
> >
> >   writer1->SetFileName( av[2] );
> >   writer1->SetImageIO( gdcmImageIO );
> >   writer1->SetInput( reader->GetOutput() );
> >
> >
> >   try
> >     {
> >     writer1->Update();
> >     }
> >   catch (itk::ExceptionObject & e)
> >     {
> >     std::cerr << "exception in file writer " << std::endl;
> >     std::cerr << e.GetDescription() << std::endl;
> >     std::cerr << e.GetLocation() << std::endl;
> >     return EXIT_FAILURE;
> >     }
> >
> >
> >
> >   return EXIT_SUCCESS;
> >
> > }
> >
> > My code can run,but the DICOM image in output is not correctly.
> > It has a problem like loss some information in output file.
> >
> > My questions:
> > 1)Is it right to read the 3D meta image use ImageFileReader directly?
> > 2)Is it right to write the data into a volume of DICOM use
> > ImageFileWriter directly?
> > 3)What are difference between series and volume?
> > 4)If I want to get a 3D DICOM file in one file.Is it a volume?
> >
> > Thanks a lot. : -)
> >                                                               Wordon
> > _______________________________________________
> > 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