[Insight-developers] ITK_Origin + MetaDataDictionaryArray + GDCM2
Mathieu Malaterre
mathieu.malaterre at gmail.com
Mon Oct 5 12:13:59 EDT 2009
On Mon, Oct 5, 2009 at 6:09 PM, Daniele E. Domenichelli
<daniele.domenichelli at gmail.com> wrote:
> 2009/10/3 Mathieu Malaterre <mathieu.malaterre at gmail.com>:
>>> Using GDCM 1 user can set origin of the image adding to the
>>> MetaDataDictionaryArray the entry (0020|0037) because there is a check:
>
>
> Sorry... this is a typo, should be (0020|0032)
>
>
>>> <from itkGDCMImageIO.cxx>
>>>
>>> if( !header->GetValEntry(0x0020,0x0032 ) )
>>> {
>>> [write origin in str]
>>> header->InsertValEntry(str.str(),0x0020,0x0032);
>>> }
>>>
>>>
>>> Using GDCM 2 origin are calculated and tags are created by gdcm::image
>>
>> I did not quite follow your bug description. What I'd like to know is:
>> Is there is a difference in behavior in between GDCM 1.x and GDCM 2.x
>
>
> Yes, there is a difference, but now I'm not sure if this is a bug in
> ITK or in GDCM... I'll try to explain better:
>
> GDCM 1) Setting tag (0020|0032), this tag is attached in the produced DICOM
> GDCM 2) Tag (0020|0032) is discarded due to this:
>
>
> ----
>
> <from itkGDCMImageIO.cxx>
> 1328 #ifdef GDCM_MAJOR_VERSION < 2
> 1329 void GDCMImageIO::Write(const void* buffer)
> 1330 {
> [...]
> 1516 if( !header->GetValEntry(0x0020,0x0032 ) )
> 1517 {
> [write origin in str]
> 1543 header->InsertValEntry(str.str(),0x0020,0x0032);
> 1544 }
> [...]
> 1859 }
> 1860 #else
> 1861 void GDCMImageIO::Write(const void* buffer)
> 1862 {
> [...]
> 2012 image.SetOrigin(0, m_Origin[0] );
> 2013 image.SetOrigin(1, m_Origin[1] );
> 2014 image.SetOrigin(2, m_Origin[2] );
> [...]
> 2260 }
> 2261
> 2262 #endif
>
> ----
>
>
> So if tag (0020|0032) is set in MetaDataDictionary it should be passed
> to the image.
> But then if MediaStorage is SecondaryCaptureImageStorage (default for
> itk) this tag is removed from gdcm::ImageHelper
> Otherwise it is replaced with the value of origin set by
> gdcm::image::SetOrigin()
>
>
> ---
>
> <from GDCM2 gdcmImageHelper.cxx>
> 1256 if( ms == MediaStorage::SecondaryCaptureImageStorage )
> 1257 {
> 1258 Tag ipp(0x0020,0x0032);
> 1259 ds.Remove( ipp );
> 1260 }
> [...]
> 1316 // Image Position (Patient)
> 1317 gdcm::Attribute<0x0020,0x0032> ipp = {{0,0,0}}; // default value
> 1318 ipp.SetValue( origin[0], 0);
> 1319 ipp.SetValue( origin[1], 1);
> 1320 ipp.SetValue( origin[2], 2);
> 1321
> 1322 ds.Replace( ipp.GetAsDataElement() );
>
> ---
>
>
> So, using GDCM 1 if user sets tag (0020|0032), this tag is in
> MetaDataDictionary and in the output DICOM files
> Using GDCM 2 this tag is always discarded and due to ImageSeriesWriter
> that doesn't set ITK_Origin tag if a MetaDataDictionaryArray is set,
> the third value of origin vector is always = 0.
> If no MetaDataDictionary Array is set, this value seems to be written
> correctly using ITK_Origin.
>
>
> I hope this time you can follow my description...
Ok. If you can write out a SC Image Storage with an IPP or IOP then
this is a bug in GDCM 1.x. I need to make sure people understand that
SC Image Storage (even the new Enhanced SC Image Storage) does not
have those attributes. The major issue that I can think of is that a
series of 2d SC objects will never be loaded as 3D volume on any PACS
out there.
I believe the behavior in GDCM 2.x is the proper one (dciodvfy should
also report no error on those attributes)
HTH
--
Mathieu
More information about the Insight-developers
mailing list