[Insight-users] DICOM Series Read & Write

Martin SEISER m.seiser at 2die4.com
Thu Aug 4 10:17:34 EDT 2005


Hi to all,

during one of my projects at univerity I have encountered several problems when reading and writing DICOM series with ITK.

First of all ==> my code!;)

// TestITKDICOMCapabilities.cpp : Defines the entry point for the console application.
//

#include "itkImageSeriesReader.h"
#include "itkImageSeriesWriter.h"
#include "itkGDCMImageIO.h"
#include "itkGDCMSeriesFileNames.h"
#include "itkNumericSeriesFileNames.h"

int main(int argc, char* argv[]) {
	typedef signed short PixelType;
	const unsigned int Dimension = 3;
	typedef itk::Image<PixelType, Dimension> ImageType;
	typedef itk::ImageSeriesReader<ImageType> ReaderType;
	typedef itk::GDCMImageIO ImageIOType;
	typedef itk::GDCMSeriesFileNames NamesGeneratorType;
	typedef std::vector<std::string> FileNamesContainer;

	typedef signed short OutputPixelType;
	const unsigned int OutputDimension = 2;
	typedef itk::Image<OutputPixelType, OutputDimension> Image2DType;
	typedef itk::ImageSeriesWriter<ImageType, Image2DType> SeriesWriterType;

	ReaderType::Pointer reader = ReaderType::New();
	ImageIOType::Pointer dicomIO = ImageIOType::New();
	reader->SetImageIO(dicomIO);
	NamesGeneratorType::Pointer nameGenerator = NamesGeneratorType::New();
	std::string path = "C:\\load";
	nameGenerator->SetInputDirectory(path.c_str());
	FileNamesContainer fileNames = nameGenerator->GetInputFileNames();
	reader->SetFileNames(fileNames);
	reader->Update();

	typedef itk::MetaDataDictionary DictionaryType;
	const DictionaryType & dictionary = dicomIO->GetMetaDataDictionary();
	typedef itk::MetaDataObject<std::string> MetaDataStringType;
	DictionaryType::ConstIterator itr = dictionary.Begin();
	DictionaryType::ConstIterator end = dictionary.End();
	while (itr != end) {
		itk::MetaDataObjectBase::Pointer entry = itr->second;
		MetaDataStringType::Pointer entryvalue =
		dynamic_cast<MetaDataStringType *>( entry.GetPointer() ) ;
		if (entryvalue) {
			std::string tagkey = itr->first;
			std::string tagvalue = entryvalue->GetMetaDataObjectValue();
			std::cout << tagkey << " = " << tagvalue << std::endl;
		}
		++itr;
	}
	
	SeriesWriterType::Pointer writer = SeriesWriterType::New();
	writer->SetInput(reader->GetOutput());
	typedef itk::NumericSeriesFileNames NameGeneratorType;
	NameGeneratorType::Pointer namesGeneratorWriter = NameGeneratorType::New();
	std::string format = "C:\\save\\file";
	format += "%03d.";
	format += "dcm"; // filename extension
	namesGeneratorWriter->SetSeriesFormat(format.c_str());
	ImageType::ConstPointer inputImage = reader->GetOutput();
	ImageType::RegionType region = inputImage->GetLargestPossibleRegion();
	ImageType::IndexType start = region.GetIndex();
	ImageType::SizeType size = region.GetSize();
	const unsigned int firstSlice = start[2];
	const unsigned int lastSlice = start[2] + size[2] - 1;
	namesGeneratorWriter->SetStartIndex(firstSlice);
	namesGeneratorWriter->SetEndIndex(lastSlice);
	namesGeneratorWriter->SetIncrementIndex(1);
	writer->SetFileNames(namesGeneratorWriter->GetFileNames());

	DictionaryType & dictionaryToWrite = dicomIO->GetMetaDataDictionary();
	
	itk::EncapsulateMetaData<std::string>(dictionaryToWrite, "0010|0010", "Hugo");
	itk::EncapsulateMetaData<std::string>(dictionaryToWrite, "0010|0020", "007");
	itk::EncapsulateMetaData<std::string>(dictionaryToWrite, "0010|0030", "01.01.1800");

	writer->SetMetaDataDictionaryArray(reader->GetMetaDataDictionaryArray());


	writer->SetImageIO(dicomIO);

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

	return 0;
}

This code reads the series, displays the metadata and writes the series with different meta tags. This is as it should be!

But the tags aren't changed and i dont know why! And I have more questions:

1) Why does
         writer->SetMetaDataDictionaryArray(reader->GetMetaDataDictionaryArray());
   work
   and
         writer->SetMetaDataDictionary(reader->GetMetaDataDictionary());
   doesn't?
2) What is the connection between "MetaDataDictionaryArray" and "MetaDataDictionary"?
3) If I have to move the meta tag info across methods, do I have to move the whole Reader? Or is there a way to store a "MetaDataDictionaryArray"?

4) Why arent my TAGS CHANGED????

Would appreciate your help, time's getting short!:(

Thx it advance,

Martin



-- 
___________________________________________________________
Sign-up for Ads Free at Mail.com
http://promo.mail.com/adsfreejump.htm



More information about the Insight-users mailing list