[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