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

Bc. Michal Srna michal at srna.info
Fri Apr 15 12:46:34 EDT 2011


Sorry for forgetting to mention it - ITKv4, latest from Git.

2011/4/15 Bill Lorensen <bill.lorensen at gmail.com>

> 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
> >
> >
>



-- 
S pozdravem Bc. Michal Srna

Fotografické portfolio:
http://michalsrna.cz
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20110415/65f9841c/attachment.htm>


More information about the Insight-users mailing list