[Insight-users] RE: Reading and writing out DICOM images

Luis Ibanez luis.ibanez at kitware.com
Mon, 05 Jan 2004 10:51:06 -0500


Hi Radhika,

Dov Grobgeld recently made available his code for
writing DICOM files. We just need to find some time
for converting this code to ITK. This issue has been
entered as a feature request in the bug tracker:
Bug # 476
http://www.itk.org/Bug/bug.php?op=show&bugid=476&pos=1

Note that the bug tracker offers the functionality
of "voting" for a bug. Just look for the "Vote for
this bug" link on the bottom bar of the link above.
This is the mechanism for increasing the priority
of bugs to be fixed.

You have *many* choices of file formats in ITK.
Please look at the FAQ entry describing the image
file formats supported by the toolkit.
http://www.itk.org/cgi-bin/InsightFAQ/InsightFAQ?req=show&file=faq01.007.htp

For a file format that associates an overlay you
may want to look at the Brains2 file format, and
the Brains-Mask format. This was developed at the
University of Iowa for storing segmentations along
with original image data.
http://www.itk.org/Insight/Doxygen/html/classitk_1_1Brains2MaskImageIO.html


Regards,


   Luis


---------------------------------
Radhika Sivaramakrishna wrote:
> Hi Luis,
> 
> I think it would be useful to have the capability to be able to save in 
> DICOM. For example, in my case, we receive a large number of cases of 
> scans taken at different times. The data are stored in DICOM format and 
> directly used for viewing etc. Often times, we would like to register a 
> scan taken at a later time to a baseline scan and resave data in the 
> original DICOM format
> 
> instead of a new format. Also, sometimes we would like to add an overlay 
> (for example outline of an organ etc) on the original data and save that.
> 
> Does ITK support other formats, where I can conveniently associate an 
> overlay with a particular image etc?
> 
> Thanks
> Radhika
> 
> 
> -----Original Message-----
> From: Luis Ibanez [mailto:luis.ibanez at kitware.com]
> Sent: Tuesday, December 30, 2003 2:27 PM
> To: Radhika Sivaramakrishna
> Cc: 'insight-users at itk.org'
> Subject: Re: Reading and writing out DICOM images
> 
> 
> Hi Radhika,
> 
> There is no option in ITK for writing image as DICOM
> slice files.
> 
> It is questionable whether you should save processed
> files in DICOM format given that this format is mostly
> intended for representing the data as originaly aquired
> from scanners and in general from imaging devices.
> 
> What is your motivation for saving the images as
> DICOM files ?
> 
> Is there a particular reason why you cannot use any
> of the other formats available in ITK:
> 
>   - Analyze
>   - MetaImage
>   - VTK
>   - GIPL
>   - IPL
>   - Stimulate
>   - Brains2
> 
> You may find useful to take advantage of these
> formats that provide a native representation for
> 3D data instead of saving it in groups of slice
> files.
> 
> 
> Please let us know,
> 
> 
>   Thanks,
> 
> 
> 
>      Luis
> 
> 
> 
> ------------------------------
> Radhika Sivaramakrishna wrote:
> 
>  > Hi Luis,
>  > Thanks for the detailed explanation and the code. If I want to write out
>  > the image as another DICOM series in a different directory, what is the
>  > procedure?
>  >
>  > Radhika
>  >
>  >
>  > -----Original Message-----
>  > From: Luis Ibanez [mailto:luis.ibanez at kitware.com]
>  > Sent: Tuesday, December 30, 2003 1:17 AM
>  > To: Radhika Sivaramakrishna
>  > Cc: 'insight-users at itk.org'
>  > Subject: Re: Reading and writing out DICOM images
>  >
>  >
>  > Hi Radhika,
>  >
>  > The DICOMImageIO by itself can only read 2D slices.
>  >
>  > In order to read volumes from Dicom files you should
>  > use the ImageSeriesReader in combination with the
>  > DICOMSeriesFileNames class.
>  >
>  > An example has been added to the repository for
>  > illustrating how to do this. You will find this
>  > example under
>  >
>  >   Insight/Examples/IO/DicomSeriesReadImageWrite.cxx
>  >
>  > Note that this example is using "unsigned short" as
>  > pixel type. If your Dicom files are coming from
>  > CT they are likely of pixel type "signed short".
>  > You may want to modify the code according to the
>  > real encoding of your data.
>  >
>  > The code is pasted below:
>  >
>  > --------------------------------------------------
>  >
>  > #include "itkDICOMImageIO2.h"
>  > #include "itkImageSeriesReader.h"
>  > #include "itkDICOMSeriesFileNames.h"
>  > #include "itkImageFileWriter.h"
>  >
>  > int main( int argc, char* argv[] )
>  > {
>  >
>  >    if( argc < 3 )
>  >      {
>  >      std::cerr << "Usage: " << argv[0] << " DicomDirectory
>  > outputFileName  [seriesName]" << std::endl;
>  >      return EXIT_FAILURE;
>  >      }
>  >
>  >    typedef itk::Image<unsigned short,3>            ImageType;
>  >    typedef itk::ImageSeriesReader< ImageType >     ReaderType;
>  >
>  >    itk::DICOMImageIO2::Pointer dicomIO = itk::DICOMImageIO2::New();
>  >
>  >    // Get the DICOM filenames from the directory
>  >    itk::DICOMSeriesFileNames::Pointer nameGenerator =
>  > itk::DICOMSeriesFileNames::New();
>  >    nameGenerator->SetDirectory( argv[1] );
>  >
>  >
>  >    typedef std::vector<std::string> seriesIdContainer;
>  >    const seriesIdContainer & seriesUID = nameGenerator->GetSeriesUIDs();
>  >
>  >    seriesIdContainer::const_iterator seriesItr = seriesUID.begin();
>  >    seriesIdContainer::const_iterator seriesEnd = seriesUID.end();
>  >
>  >    std::cout << std::endl << "The directory: " << std::endl;
>  >    std::cout << std::endl << argv[1] << std::endl << std::endl;
>  >    std::cout << "Contains the following DICOM Series: ";
>  >    std::cout << std::endl << std::endl;
>  >
>  >    while( seriesItr != seriesEnd )
>  >      {
>  >      std::cout << seriesItr->c_str() << std::endl;
>  >      seriesItr++;
>  >      }
>  >
>  >    std::cout << std::endl << std::endl;
>  >    std::cout << "Now reading series: " << std::endl << std::endl;
>  >
>  >    typedef std::vector<std::string> fileNamesContainer;
>  >    fileNamesContainer fileNames;
>  >
>  >    if( argc < 4 ) // If no optional third argument
>  >      {
>  >      std::cout << seriesUID.begin()->c_str() << std::endl;
>  >      fileNames = nameGenerator->GetFileNames();
>  >      }
>  >    else
>  >      {
>  >      std::cout << argv[3] << std::endl;
>  >      fileNames = nameGenerator->GetFileNames( argv[3] );
>  >      }
>  >    std::cout << std::endl << std::endl;
>  >
>  >    ReaderType::Pointer reader = ReaderType::New();
>  >    reader->SetFileNames( fileNames );
>  >    reader->SetImageIO( dicomIO );
>  >
>  >    try
>  >      {
>  >      reader->Update();
>  >      }
>  >    catch (itk::ExceptionObject &ex)
>  >      {
>  >      std::cout << ex << std::endl;
>  >      return EXIT_FAILURE;
>  >      }
>  >
>  >    typedef itk::ImageFileWriter< ImageType > WriterType;
>  >    WriterType::Pointer writer = WriterType::New();
>  >
>  >    std::cout  << "Writing the image as " << std::endl << std::endl;
>  >    std::cout  << argv[2] << std::endl << std::endl;
>  >
>  >    writer->SetFileName( argv[2] );
>  >
>  >    writer->SetInput( reader->GetOutput() );
>  >
>  >    try
>  >      {
>  >      writer->Update();
>  >      }
>  >    catch (itk::ExceptionObject &ex)
>  >      {
>  >      std::cout << ex;
>  >      return EXIT_FAILURE;
>  >      }
>  >
>  >
>  >    return EXIT_SUCCESS;
>  >
>  > }
>  >
>  >
>  >
>  > --------------------------------------------------
>  >
>  >
>  > In order to use this program from the command line
>  > you must provide as first argument the directory
>  > where your DICOM slices are located, and as a second
>  > argument the filename of the output image. In order
>  > to produce Analyze you just need to provide an output
>  > filename with extension ".hdr". You could produce
>  > VTK files by using .vtk, or MetaImages by using .mhd.
>  >
>  > Note that you may have multiple DICOM series in the
>  > same directory. The current program will simply take
>  > the first series.  If you want to select a particular
>  > series you can provide the optional third parameter
>  > with the string identifying the desired series.  If the
>  > optional parameter is missing, this example will print
>  > out all the available series and simply read the first
>  > one.
>  >
>  >
>  >
>  > Please let us know if you have further questions,
>  >
>  >
>  >     Thanks
>  >
>  >
>  >       Luis
>  >
>  >
>  > ---------------------------------
>  > Radhika Sivaramakrishna wrote:
>  >  > Hi Luis,
>  >  >
>  >  > I was trying to modify the example in the Software guide to use an
>  >  > ImageIO class explicitly to read a DICOM series and write it out 
> as a 3D
>  >  > Analyze format
>  >  >
>  >  > image. I am not sure how to specify the DICOM series in the input 
> file
>  >  > name. I tried giving one of the files in the sequence [this only 
> wrote
>  >  > out that particular slice]
>  >  >
>  >  >  as well as tried to use a *.dcm wildcard method which gave an 
> error. I
>  >  > have the same doubt for writing out a DICOM series. How do I 
> specify the
>  >  > filename?
>  >  >
>  >  >
>  >  >
>  >  > Thanks
>  >  >
>  >  > Radhika
>  >  >
>  >  >
>  >  >
>  >  > -----------------------------------------------------
>  >  >
>  >  > Confidentiality Notice.
>  >  >
>  >  > This email message is for the sole use of the intended 
> recipient(s) and
>  >  > may contain confidential and privileged information. Any unauthorized
>  >  > review, use, disclosure or distribution is prohibited. If you are not
>  >  > the intended recipient, please contact the sender by reply email and
>  >  > destroy all copies of the original message. If you are the intended
>  >  > recipient, please be advised that the content of this message is 
> subject
>  >  > to access, review and disclosure by the sender's Email System
>  > Administrator.
>  >  >
>  >
>  >
>  >                                                    
>  > -----------------------------------------------------
>  > Confidentiality Notice.
>  > This email message is for the sole use of the intended recipient(s) and
>  > may contain confidential and privileged information. Any unauthorized
>  > review, use, disclosure or distribution is prohibited. If you are not
>  > the intended recipient, please contact the sender by reply email and
>  > destroy all copies of the original message. If you are the intended
>  > recipient, please be advised that the content of this message is subject
>  > to access, review and disclosure by the sender's Email System 
> Administrator.
>  >
> 
> 
>                                                     
> ----------------------------------------------------- 
> Confidentiality Notice.
> This email message is for the sole use of the intended recipient(s) and 
> may contain confidential and privileged information. Any unauthorized 
> review, use, disclosure or distribution is prohibited. If you are not 
> the intended recipient, please contact the sender by reply email and 
> destroy all copies of the original message. If you are the intended 
> recipient, please be advised that the content of this message is subject 
> to access, review and disclosure by the sender's Email System Administrator.
>