[Insight-users] Problem with saving Image Position value in "z" axis

Bill Lorensen bill.lorensen at gmail.com
Fri Apr 15 12:26:39 EDT 2011


What version of itk are you using?

On Thu, Apr 14, 2011 at 5:16 AM, Bc. Michal Srna <michal at srna.info> wrote:
> Hello,
>
> I have used part of this code to generate MetaDataDictionary:
>
> http://www.itk.org/Wiki/ITK/Examples/DICOM/ResampleDICOM
>
> Everything works, as I need, but I have just one problem in part regarding
> saving Image Position (origin) for "z" axis. "x,y" are stored well, but "z"
> value of Image Position is 0.
>
> Here is that part of the code for saving the Image position:
>
>                         ImageType::PointType position;
>                         ImageType::IndexType index;
>                         index[0] = 0;
>                         index[1] = 0;
>                         index[2] = f;
>
> reader->GetOutput()->TransformIndexToPhysicalPoint(index, position);
>
>                         value.str("");
>                         value << position[0] << "\\" << position[1] << "\\"
> << position[2];
>
>
> itk::EncapsulateMetaData<std::string>(*dict,"0020|0032", value.str()); //WHY
> NOT WORKING??
>
> position[2] contains the correct value, but I don't know, why is that value
> not saved and instead of that value is stored just 0?
>
> I think I should add also the whole code for generating my
> MetaDataDictionary for see my problem in context.
>
> At first it opens original data, from which I read original meta data. Then
> I modify some parts of those meta data in for cycle creating meta data for
> each slice.
>
> I confirmed, that original data contains correct value of Image Position in
> "z" axis. But I need to recalculate that value and store new value. Problem
> is, as I told, that this value is not saved and instead of it, there is just
> 0.
>
> Here is the whole code, spacing[x] is derived from other part of the whole
> code, I don't want to copy here:
>
> /*opening original data for getting meta data dictionry for saving it into
> output 2D series files*/
>             typedef itk::GDCMImageIO ImageIOType;
>             typedef itk::GDCMSeriesFileNames NamesGeneratorType;
>             typedef itk::ImageSeriesReader< ImageType > ReaderType;
>
>             ImageIOType::Pointer gdcmIO = ImageIOType::New();
>             ReaderType::Pointer reader = ReaderType::New();
>
>             NamesGeneratorType::Pointer namesGenerator =
> NamesGeneratorType::New();
>             namesGenerator->SetInputDirectory( StudyFolderName );
>             const ReaderType::FileNamesContainer & filenames =
> namesGenerator->GetInputFileNames();
>
>             reader->SetImageIO( gdcmIO );
>             reader->SetFileNames( filenames );
>
>             reader->Update();
>
>         /*creating MetaDataDictionary for each slice*/
>
>             /*Copy the dictionary from the first image and override slice
> specific fields*/
>                 ReaderType::DictionaryRawPointer inputDictionary =
> (*(reader->GetMetaDataDictionaryArray()))[0];
>                 ReaderType::DictionaryArrayType dictionaryOutputArray;
>
>             /*To keep the new series in the same study as the original we
> need to keep the same study UID. But we need new series and frame of
> reference UID's.*/
>                 #if ITK_VERSION_MAJOR >= 4
>                   gdcm::UIDGenerator suid;
>                   std::string seriesUID = suid.Generate();
>                   gdcm::UIDGenerator fuid;
>                   std::string frameOfReferenceUID = fuid.Generate();
>                 #else
>                   std::string seriesUID = gdcm::Util::CreateUniqueUID(
> gdcmIO->GetUIDPrefix());
>                   std::string frameOfReferenceUID =
> gdcm::Util::CreateUniqueUID( gdcmIO->GetUIDPrefix());
>                 #endif
>                   std::string studyUID;
>                   std::string sopClassUID;
>                   itk::ExposeMetaData<std::string>(*inputDictionary,
> "0020|000d", studyUID);
>                   itk::ExposeMetaData<std::string>(*inputDictionary,
> "0008|0016", sopClassUID);
>                   gdcmIO->KeepOriginalUIDOn();
>
>                 for (unsigned int f = 0; f < size[2]; f++)
>                 {
>                     // Create a new dictionary for this slice
>                         ReaderType::DictionaryRawPointer dict = new
> ReaderType::DictionaryType;
>
>                     // Copy the dictionary from the first slice
>                         CopyDictionary (*inputDictionary, *dict);
>
>                     // Set the UID's for the study, series, SOP  and frame
> of reference
>
> itk::EncapsulateMetaData<std::string>(*dict,"0020|000d", studyUID);
>
> itk::EncapsulateMetaData<std::string>(*dict,"0020|000e", seriesUID);
>
> itk::EncapsulateMetaData<std::string>(*dict,"0020|0052",
> frameOfReferenceUID);
>
>                     #if ITK_VERSION_MAJOR >= 4
>                         gdcm::UIDGenerator sopuid;
>                         std::string sopInstanceUID = sopuid.Generate();
>                     #else
>                         std::string sopInstanceUID =
> gdcm::Util::CreateUniqueUID( gdcmIO->GetUIDPrefix());
>                     #endif
>
> itk::EncapsulateMetaData<std::string>(*dict,"0008|0018", sopInstanceUID);
>
> itk::EncapsulateMetaData<std::string>(*dict,"0002|0003", sopInstanceUID);
>
>                     // Change fields that are slice specific
>                         itksys_ios::ostringstream value;
>                         value.str("");
>                         value << f + 1;
>
>                     // Image Number
>
> itk::EncapsulateMetaData<std::string>(*dict,"0020|0013", value.str());
>
>                     // Series Description - Append new description to
> current series description
>                         std::string oldSeriesDesc;
>                         itk::ExposeMetaData<std::string>(*inputDictionary,
> "0008|103e", oldSeriesDesc);
>
>                         value.str("");
>                         value << oldSeriesDesc
>                               << spacing[0] << ", "
>                               << spacing[1] << ", "
>                               << spacing[2];
>
>                     // This is an long string and there is a 64 character
> limit in the standard
>                         unsigned lengthDesc = value.str().length();
>
>                         std::string seriesDesc( value.str(), 0,
>                                                 lengthDesc > 64 ? 64
>                                                 : lengthDesc);
>
> itk::EncapsulateMetaData<std::string>(*dict,"0008|103e", seriesDesc);
>
>                     // Series Number
>                         value.str("");
>                         value << 1001;
>
> itk::EncapsulateMetaData<std::string>(*dict,"0020|0011", value.str());
>
>                     //Image Position Patient: This is calculated by
> computing the physical coordinate of the first pixel in each slice.
>                         ImageType::PointType position;
>                         ImageType::IndexType index;
>                         index[0] = 0;
>                         index[1] = 0;
>                         index[2] = f;
>
> reader->GetOutput()->TransformIndexToPhysicalPoint(index, position);
>
>                         value.str("");
>                         value << position[0] << "\\" << position[1] << "\\"
> << position[2];
>
>
> itk::EncapsulateMetaData<std::string>(*dict,"0020|0032", value.str()); //WHY
> NOT WORKING??
>
>                     // Slice Location: For now, we store the z component of
> the Image Position Patient.
>                         value.str("");
>                         value << position[2];
>
> itk::EncapsulateMetaData<std::string>(*dict,"0020|1041", value.str());
>
>                     // Spacing Between Slices
>                         value.str("");
>                         value << spacing[2];
>
> itk::EncapsulateMetaData<std::string>(*dict,"0018|0088", value.str());
>
>                     // Change specific values
>                         //  itk::EncapsulateMetaData<std::string>(*dict,
> "0028|0100", "16" );
>
>
>                     // Save the dictionary
>                         dictionaryOutputArray.push_back(dict);
>                   }
>
> Thanks guys in advance...
>
> --
> S pozdravem Bc. Michal Srna
>
> Fotografické portfolio:
> http://michalsrna.cz
>
> _____________________________________
> 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