[Insight-users] strange dicom output file
Harvey Cline
harvey.cline at kitware.com
Wed Nov 4 14:48:13 EST 2009
Hi Ming
In reading a dicom series and writing a 3D dicom image of a medical
data set, I found that the input pixel type was ignored by the DICOM
reader. Apparently the DICOM header tags set the pixel type to short
and do not respond to a typedef unsigned short PixelType in my case.
Displaying all the information in the header with another open source
program like Osirix may be of help in solving this problem
Harvey
On Wed, Nov 4, 2009 at 10:38 AM, Ming Chao <mingchao2005 at gmail.com> wrote:
> Hi ITKers.
> Recently I was asking questions here about how to write out an multiframe
> dicom file. Thanks for all the help.
> As a matter of fact, it is not so hard to save a 3D volumetric image into a
> multiframe dicom file. Please see the attached code. But I do encounter a
> problem in the output dicom file. Basically the range of the voxel values of
> the output file much narrower than expected ( I attached the images from
> the output dicom and original dicom). I double checked the data types and
> they seemed fine. Could anyone help? thanks.
> Ming
>
> int main( int argc, char* argv[] ) {
> // Verify the number of parameters in the command line
> if( argc < 4 ) {
> std::cerr << "Usage: " << std::endl;
> std::cerr << argv[0] << " vtkImage InputDicomImage ";
> std::cerr << " OutputImage \n";
> return EXIT_FAILURE;
> }
> // the following is for an input 2D dicom file
> typedef unsigned short InputPixelType;
> const unsigned int InputDimension = 3;
> typedef itk::Image< InputPixelType, InputDimension > InputImageType;
> typedef itk::ImageFileReader< InputImageType > InputReaderType;
> InputReaderType::Pointer reader1 = InputReaderType::New();
> reader1->SetFileName( argv[1] );
> typedef itk::GDCMImageIO InputImageIOType;
> InputImageIOType::Pointer gdcmImageIO = InputImageIOType::New();
> reader1->SetImageIO( gdcmImageIO );
> reader1->Update();
> std::cout << " (1) first dicom file is read in successfully ...." <<
> std::endl;
> // The following is a print out of the tag info
> typedef itk::MetaDataDictionary DictionaryType;
> const DictionaryType & dictionary = gdcmImageIO->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;
> }
> // the following is for a 3D volume file
> typedef float PixelType;
> const unsigned int Dimension = 3;
> typedef itk::Image< PixelType, Dimension > ImageType;
> typedef itk::ImageFileReader< ImageType > ReaderType;
> ReaderType::Pointer reader2 = ReaderType::New();
> reader2->SetFileName( argv[2] );
> reader2->Update();
> std::cout << " (2) the 3D volume file is read in successfully ...." <<
> std::endl;
> // the following is for an output 3D dicom file
> typedef float OutputPixelType;
> const unsigned int OutputDimension = 3;
> typedef itk::Image< OutputPixelType, OutputDimension > OutputImageType;
> typedef itk::ImageSeriesWriter< ImageType, OutputImageType >
> OutputWriterType;
> OutputWriterType::Pointer writer = OutputWriterType::New();
> writer->SetFileName( argv[3] );
> writer->SetInput( reader2->GetOutput() );
> writer->SetMetaDataDictionary( reader1->GetMetaDataDictionary() );
> gdcmImageIO->KeepOriginalUIDOn();
> writer->SetImageIO( gdcmImageIO );
> writer->Update();
> std::cout << " (3) the output dicom file is saved successfully and we are
> done...." << std::endl;
>
> return 0;
>
> _____________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Kitware offers ITK Training Courses, for more information visit:
> http://www.kitware.com/products/protraining.html
>
> Please keep messages on-topic and check the ITK FAQ at:
> http://www.itk.org/Wiki/ITK_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.itk.org/mailman/listinfo/insight-users
>
>
More information about the Insight-users
mailing list