<div dir="ltr">Hello All,<div><br></div><div>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.</div><div><br></div><div>Here is what I have so far:</div><div><br></div><div>//////////</div><div><div>  const std::string dataDir = argv[1];</div><div>  const std::string inputFile = dataDir + "/inputImage.nii.gz";</div><div>  const std::string outputDir = dataDir + "/test/";</div><div><br></div><div>  using ImageTypeToRead = itk::Image< float, 3 >;</div><div>  using ImageTypeToWrite = itk::Image< short, 3 >;</div><div>  auto inputImage = cbica::ReadImageWithOrientFix< itk::Image< float, 3 > >(inputFile);</div><div>  auto imageToWrite = inputImage;</div><div><br></div><div>  auto dicomIO = itk::GDCMImageIO::New();</div><div><br></div><div>  auto seriesWriter = itk::ImageSeriesWriter< ImageTypeToWrite, itk::Image<ImageTypeToWrite::PixelType, 2> >::New();</div><div><br></div><div>  auto namesGenerator = itk::NumericSeriesFileNames::New();</div><div>  auto start = imageToWrite->GetLargestPossibleRegion().GetIndex();</div><div>  auto size = imageToWrite->GetLargestPossibleRegion().GetSize();</div><div>  namesGenerator->SetSeriesFormat((outputDir + "/image%03d.dcm").c_str());</div><div>  namesGenerator->SetStartIndex(start[2]);</div><div>  namesGenerator->SetEndIndex(start[2] + size[2] - 1);</div><div>  namesGenerator->SetIncrementIndex(1);</div><div><br></div><div>  auto castFilter = itk::CastImageFilter<ImageTypeToRead, ImageTypeToWrite>::New();</div><div>  castFilter->SetInput(imageToWrite);</div><div>  castFilter->Update();</div><div><br></div><div>  seriesWriter->SetInput(castFilter->GetOutput());</div><div>  seriesWriter->SetImageIO(dicomIO);</div><div>  seriesWriter->SetFileNames(namesGenerator->GetFileNames());</div><div><br></div><div>  typename itk::ImageSeriesReader< ImageTypeToRead >::DictionaryArrayType outputArray;</div><div><br></div><div>  // this doesn't work at all - was kind of hoping it would do the heavy lifting for me</div><div>  //dicomIO->SetOrigin(0, imageToWrite->GetOrigin()[0]);</div><div>  //dicomIO->SetOrigin(1, imageToWrite->GetOrigin()[1]);</div><div>  //dicomIO->SetOrigin(2, imageToWrite->GetOrigin()[2]);</div><div>  //dicomIO->SetSpacing(0, imageToWrite->GetSpacing()[0]);</div><div>  //dicomIO->SetSpacing(1, imageToWrite->GetSpacing()[1]);</div><div>  //dicomIO->SetSpacing(2, imageToWrite->GetSpacing()[2]);</div><div>  //dicomIO->SetDimensions(0, imageToWrite->GetLargestPossibleRegion().GetSize()[0]);</div><div>  //dicomIO->SetDimensions(1, imageToWrite->GetLargestPossibleRegion().GetSize()[1]);</div><div>  //dicomIO->SetDimensions(2, imageToWrite->GetLargestPossibleRegion().GetSize()[2]);</div><div>  // this doesn't work at all</div><div><br></div><div>  for (size_t i = 0; i < imageToWrite->GetLargestPossibleRegion().GetSize()[2]; i++)</div><div>  {</div><div>    auto dict = new itk::ImageSeriesReader< ImageTypeToRead >::DictionaryType;</div><div>    typename ImageTypeToWrite::PointType position;</div><div>    typename ImageTypeToWrite::IndexType index;</div><div>    index[0] = 0;</div><div>    index[1] = 0;</div><div>    index[2] = i;</div><div>    imageToWrite->TransformIndexToPhysicalPoint(index, position);</div><div>    // tags extracted from dicom lookup <a href="http://dicomlookup.com/lookup.asp">http://dicomlookup.com/lookup.asp</a></div><div>    itk::EncapsulateMetaData<std::string>(*dict, "0020|0032", std::to_string(position[0]) + "\\" + std::to_string(position[1]) + "\\" + std::to_string(position[2])); // patient position</div><div>    itk::EncapsulateMetaData<std::string>(*dict, "0018|5100", std::to_string(position[0]) + "\\" + std::to_string(position[1]) + "\\" + std::to_string(position[2]));</div><div>    itk::EncapsulateMetaData<std::string>(*dict, "2020|0010", std::to_string(position[0]) + "\\" + std::to_string(position[1]) + "\\" + std::to_string(position[2]));</div><div>    itk::EncapsulateMetaData<std::string>(*dict, "0018|5101", std::to_string(position[0]) + "\\" + std::to_string(position[1]) + "\\" + std::to_string(position[2]));</div><div>    itk::EncapsulateMetaData<std::string>(*dict, "0018|0050", std::to_string(imageToWrite->GetSpacing()[2])); // Slice Thickness</div><div>    itk::EncapsulateMetaData<std::string>(*dict, "0018|0088", std::to_string(imageToWrite->GetSpacing()[2])); // Spacing Between Slices</div><div>    itk::EncapsulateMetaData<std::string>(*dict, "0008|0008", "DERIVED\\SECONDARY"); // Image Type</div><div>    itk::EncapsulateMetaData<std::string>(*dict, "0008|0064", "DV"); // Conversion Type</div><div><br></div><div>    outputArray.push_back(dict);</div><div>  }</div><div><br></div><div>  seriesWriter->SetMetaDataDictionaryArray(&outputArray); // no dictionary information present without seriesReader</div><div>  </div><div>  try</div><div>  {</div><div>    seriesWriter->Write();</div><div>  }</div><div>  catch (itk::ExceptionObject &e)</div><div>  {</div><div>    std::cerr << "Error occurred while trying to write the image '" << outputDir << "': " << e.what() << "\n";</div><div>    exit(EXIT_FAILURE);</div><div>  }</div></div><div><br></div>//////////<div><br></div><div>Thanks a ton,</div><div>Sarthak </div></div>