[Insight-users] Basic Read/Write of DICOM Image - Wrong Metadata

M. Wirtzfeld wirtzfeld at rogers.com
Tue Sep 9 12:42:52 EDT 2008



Hello,

I am working with DICOM images and presently need to read and write  
these image types (only in 2-dimensions) directly using ITK.  I am  
following the code verbatim shown in  Section 7.12.2, "Reading and  
Writing a 2D Image", of "The ITK Software Guide, Second Edition  
(Update for ITK Version 2.4)".

The DICOM meta-data for both saved images (direct and rescaled) is  
not correct with respect to the voxel-size (verified using MicroView  
and MIPAV).  I have not tried to validate all meta-data fields in the  
newly saved images given this initial inconsistency.

The source-code directly from the text of the respective section is  
shown below.  It is compiled against version 3.4 of the ITK project.

I do not understand why this basic example is not working.  For the  
first image saved, the text says, "We need to explicitly set the  
proper image IO (GDCMImageIO) to the writer filter since the input  
DICOM dictionary is being passed along the writing process. The  
dictionary contains all necessary information that a valid DICOM file  
should contain, like Patient Name, Patient ID, Institution Name,  
etc.".  But the results are not correct.

Suggestions?


Thank you,

Michael.


---------------------------------------------

#include "itkImage.h"

#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkRescaleIntensityImageFilter.h"
#include "itkGDCMImageIO.h"



int main( int argc, char * argv[] ) {
	
	if( argc < 3 ) {
		
		std::cerr << "Usage: " << std::endl;
		std::cerr << argv[0] << "  < argument_1 >  <argument_2>   
<argument_3>  <argument_4> " << std::endl;
		
		/* argument_1 -> Input-image filename.
		 * argument_2 -> Direct-save of given input-image filename.
		 * argument_3 -> Intermediate - n/a.
		 * argument_4 -> Rescaled with passed along Meta-data filename.
		 */
		
		
		return EXIT_FAILURE;
	}
	
	
	typedef short InputPixelType;
	typedef float OutputPixelType;

	typedef itk::Image< InputPixelType, 2 > InputImageType;
	typedef itk::Image< OutputPixelType, 2 > OutputImageType;

	typedef itk::ImageFileReader< InputImageType > ReaderType;
	
	typedef itk::GDCMImageIO ImageIOType;
	ImageIOType::Pointer gdcmImageIO = ImageIOType::New();


	ReaderType::Pointer reader = ReaderType::New();
	reader->SetFileName( argv[1] );
	reader->SetImageIO( gdcmImageIO );
	
	
	try {
		reader->Update();
	}
	catch ( itk::ExceptionObject & anException ) {
		
		std::cerr << "\n\n** Exception in File Reader:  " << anException <<  
" **\n\n" << std::endl;
		return EXIT_FAILURE;
		
	};
	
	
	typedef itk::ImageFileWriter < InputImageType > Writer1Type;
	
	Writer1Type::Pointer writer1 = Writer1Type::New();
	
	writer1->SetFileName( argv[2] );
	writer1->SetInput( reader->GetOutput() );
	writer1->SetImageIO( gdcmImageIO );
	
	try {
		writer1->Update();
	}
	catch ( itk::ExceptionObject & anException ) {

		std::cerr << "\n\n** Exception in File Writer1:  " << anException  
<< " **\n\n" << std::endl;
		return EXIT_FAILURE;

	};
	
	
	
	typedef unsigned char WritePixelType;
	typedef itk::Image < WritePixelType, 2 > WriteImageType;
	typedef itk::RescaleIntensityImageFilter < InputImageType,  
WriteImageType > RescaleFilterType;
	
	RescaleFilterType::Pointer rescaler = RescaleFilterType::New();
	
	rescaler->SetOutputMinimum( 0 );
	rescaler->SetOutputMaximum( 255 );
	
	typedef itk::ImageFileWriter < WriteImageType > Writer2Type;
	
	Writer2Type::Pointer writer2 = Writer2Type::New();
	
	writer2->SetFileName( argv[3] );
	
	rescaler->SetInput( reader->GetOutput() );
	writer2->SetInput( rescaler->GetOutput() );
	
	
	typedef itk::ImageFileWriter < WriteImageType > Writer3Type;
	
	Writer3Type::Pointer writer3 = Writer3Type::New();
	
	writer3->SetFileName( argv[4] );
	writer3->SetInput( rescaler->GetOutput() );
	
	writer3->UseInputMetaDataDictionaryOff();
	writer3->SetImageIO( gdcmImageIO );
	
	
	try {
		writer3->Update();
	}
	catch ( itk::ExceptionObject & anException ) {

		std::cerr << "\n\n** Exception in File Writer3:  " << anException  
<< " **\n\n" << std::endl;
		return EXIT_FAILURE;

	};
	
	
	return EXIT_SUCCESS;
}



More information about the Insight-users mailing list