[ITK-users] Writing a DICOM file while preserving input image properties

Sarthak P scapegoat.sarthak at gmail.com
Wed Mar 8 15:11:59 EST 2017


Hello All,

I am trying to write a DICOM image but I want to preserve the properties
from the input image (origin, direction, spacing, etc.). The ITK examples
do not show how to do this properly and anything I have done with the dicom
tags hasn't worked. Any help would be much appreciated.

Here is what I have so far:

//////////
  const std::string dataDir = argv[1];
  const std::string inputFile = dataDir + "/inputImage.nii.gz";
  const std::string outputDir = dataDir + "/test/";

  using ImageTypeToRead = itk::Image< float, 3 >;
  using ImageTypeToWrite = itk::Image< short, 3 >;
  auto inputImage = cbica::ReadImageWithOrientFix< itk::Image< float, 3 >
>(inputFile);
  auto imageToWrite = inputImage;

  auto dicomIO = itk::GDCMImageIO::New();

  auto seriesWriter = itk::ImageSeriesWriter< ImageTypeToWrite,
itk::Image<ImageTypeToWrite::PixelType, 2> >::New();

  auto namesGenerator = itk::NumericSeriesFileNames::New();
  auto start = imageToWrite->GetLargestPossibleRegion().GetIndex();
  auto size = imageToWrite->GetLargestPossibleRegion().GetSize();
  namesGenerator->SetSeriesFormat((outputDir + "/image%03d.dcm").c_str());
  namesGenerator->SetStartIndex(start[2]);
  namesGenerator->SetEndIndex(start[2] + size[2] - 1);
  namesGenerator->SetIncrementIndex(1);

  auto castFilter = itk::CastImageFilter<ImageTypeToRead,
ImageTypeToWrite>::New();
  castFilter->SetInput(imageToWrite);
  castFilter->Update();

  seriesWriter->SetInput(castFilter->GetOutput());
  seriesWriter->SetImageIO(dicomIO);
  seriesWriter->SetFileNames(namesGenerator->GetFileNames());

  typename itk::ImageSeriesReader< ImageTypeToRead >::DictionaryArrayType
outputArray;

  // this doesn't work at all - was kind of hoping it would do the heavy
lifting for me
  //dicomIO->SetOrigin(0, imageToWrite->GetOrigin()[0]);
  //dicomIO->SetOrigin(1, imageToWrite->GetOrigin()[1]);
  //dicomIO->SetOrigin(2, imageToWrite->GetOrigin()[2]);
  //dicomIO->SetSpacing(0, imageToWrite->GetSpacing()[0]);
  //dicomIO->SetSpacing(1, imageToWrite->GetSpacing()[1]);
  //dicomIO->SetSpacing(2, imageToWrite->GetSpacing()[2]);
  //dicomIO->SetDimensions(0,
imageToWrite->GetLargestPossibleRegion().GetSize()[0]);
  //dicomIO->SetDimensions(1,
imageToWrite->GetLargestPossibleRegion().GetSize()[1]);
  //dicomIO->SetDimensions(2,
imageToWrite->GetLargestPossibleRegion().GetSize()[2]);
  // this doesn't work at all

  for (size_t i = 0; i <
imageToWrite->GetLargestPossibleRegion().GetSize()[2]; i++)
  {
    auto dict = new itk::ImageSeriesReader< ImageTypeToRead
>::DictionaryType;
    typename ImageTypeToWrite::PointType position;
    typename ImageTypeToWrite::IndexType index;
    index[0] = 0;
    index[1] = 0;
    index[2] = i;
    imageToWrite->TransformIndexToPhysicalPoint(index, position);
    // tags extracted from dicom lookup http://dicomlookup.com/lookup.asp
    itk::EncapsulateMetaData<std::string>(*dict, "0020|0032",
std::to_string(position[0]) + "\\" + std::to_string(position[1]) + "\\" +
std::to_string(position[2])); // patient position
    itk::EncapsulateMetaData<std::string>(*dict, "0018|5100",
std::to_string(position[0]) + "\\" + std::to_string(position[1]) + "\\" +
std::to_string(position[2]));
    itk::EncapsulateMetaData<std::string>(*dict, "2020|0010",
std::to_string(position[0]) + "\\" + std::to_string(position[1]) + "\\" +
std::to_string(position[2]));
    itk::EncapsulateMetaData<std::string>(*dict, "0018|5101",
std::to_string(position[0]) + "\\" + std::to_string(position[1]) + "\\" +
std::to_string(position[2]));
    itk::EncapsulateMetaData<std::string>(*dict, "0018|0050",
std::to_string(imageToWrite->GetSpacing()[2])); // Slice Thickness
    itk::EncapsulateMetaData<std::string>(*dict, "0018|0088",
std::to_string(imageToWrite->GetSpacing()[2])); // Spacing Between Slices
    itk::EncapsulateMetaData<std::string>(*dict, "0008|0008",
"DERIVED\\SECONDARY"); // Image Type
    itk::EncapsulateMetaData<std::string>(*dict, "0008|0064", "DV"); //
Conversion Type

    outputArray.push_back(dict);
  }

  seriesWriter->SetMetaDataDictionaryArray(&outputArray); // no dictionary
information present without seriesReader

  try
  {
    seriesWriter->Write();
  }
  catch (itk::ExceptionObject &e)
  {
    std::cerr << "Error occurred while trying to write the image '" <<
outputDir << "': " << e.what() << "\n";
    exit(EXIT_FAILURE);
  }

//////////

Thanks a ton,
Sarthak
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/insight-users/attachments/20170308/f59eccc2/attachment.html>


More information about the Insight-users mailing list