[Insight-developers] Fwd: [Insight-users] DicomSeriesReaderSeriesWriter.cxx doesnot write Image position Patient and image orientation patient Z values
Mathieu Malaterre
mathieu.malaterre at gmail.com
Mon Jun 9 10:30:06 EDT 2008
while working on a issue (from itk-users list), I realized there is
still some issue with the trick with 'ITK_Origin' in Series writer.
The following code:
cat itkImageSeriesWriter.txx
...
if( m_ImageIO )
{
DictionaryType & dictionary = m_ImageIO->GetMetaDataDictionary();
typename InputImageType::SpacingType spacing2 =
inputImage->GetSpacing();
// origin of the output slice in the
// N-Dimensional space of the input image.
typename InputImageType::PointType origin2;
inputImage->TransformIndexToPhysicalPoint( inIndex, origin2 );
const unsigned int inputImageDimension = TInputImage::ImageDimension;
typedef Array< double > DoubleArrayType;
DoubleArrayType originArray( inputImageDimension );
DoubleArrayType spacingArray( inputImageDimension );
for( unsigned int d = 0; d < inputImageDimension; d++ )
{
originArray[ d ] = origin2[ d ];
spacingArray[ d ] = spacing2[ d ];
}
EncapsulateMetaData< DoubleArrayType >( dictionary,
ITK_Origin, originArray );
EncapsulateMetaData< DoubleArrayType >( dictionary,
ITK_Spacing, spacingArray );
EncapsulateMetaData< unsigned int >( dictionary,
ITK_NumberOfDimensions, inputImageDimension );
}
...
does not produce the expected Image Position (Patient).
Steps to reproduce, you simply need to run the
DicomSeriesReadSeriesWrite.cxx example. You need to comment out the
lines:
// seriesWriter->SetMetaDataDictionaryArray(
// reader->GetMetaDataDictionaryArray() );
then run like this:
$ make DicomSeriesReadSeriesWrite && ./bin/DicomSeriesReadSeriesWrite
../Insight/Testing/Data/Input/DicomSeries bla
It will produce the following Image Position (Patient):
$ dcmdump ../Insight/Testing/Data/Input/DicomSeries/Image00*.dcm | grep ImagePos
(0020,0032) DS [-112\ -21.688\ 126.894] # 22, 3
ImagePositionPatient
(0020,0032) DS [-112\-20.2729\ 127.641] # 22, 3
ImagePositionPatient
(0020,0032) DS [-112\-18.8578\ 128.388] # 22, 3
ImagePositionPatient
$ dcmdump bla/Image007* | grep ImagePos
(0020,0032) DS [-112\-18.8578\ 128.388] # 22, 3
ImagePositionPatient
(0020,0032) DS [-112\-18.8578\ 128.388] # 22, 3
ImagePositionPatient
(0020,0032) DS [-112\-18.8578\ 128.388] # 22, 3
ImagePositionPatient
Indeed the Spacing Beween Slices is correct (1.6) but the direction is
not respected.
Is this the intended behavior, does the user has to explicitely make
use of an itk::OrientedImage for this to work ?
Thanks
-Mathieu
---------- Forwarded message ----------
From: Mathieu Malaterre <mathieu.malaterre at gmail.com>
Date: Mon, Jun 9, 2008 at 4:22 PM
Subject: Re: [Insight-users] DicomSeriesReaderSeriesWriter.cxx doesnot
write Image position Patient and image orientation patient Z values
To: Sachin Jambawalikar <sachinjam at gmail.com>
Cc: insight-users at itk.org
On Sun, Jun 8, 2008 at 3:17 AM, Sachin Jambawalikar <sachinjam at gmail.com> wrote:
> Hi all,
>
> I was trying to use the DicomSeriesWriter.cxx examples in the
> Examples/IO directory to just read a dicom series and write it to a
> new directory.
> The series writer produces the dicom files fine but when you see the
> dicom header the
> tags are wrong for example
>
> the original file tag values are :
>
> 0020,0032,Image Position Patient=
> -102.34347617253\-156.03754969686\-62.252762846648
> 0020,0037,Image Orientation (Patient)=
> 0.99587732553482\0.07696951180696\0.04800064116716\-0.0597707442939\0.95484501123428\-0.2910300195217
>
> and the tags for the generated dcm file is:
> 0020,0032,Image Position Patient= -102.343475\-156.037552\0.000000
> 0020,0037,Image Orientation (Patient)=
> 0.995877\-0.059771\0.000000\0.076970\0.954845\0.000000
>
> I guess the problem is in the itk:ImageSeriesWriter() which assumes
> the output datatype to be 2D and hence wihle writing the metadata info
> trunctates it only for the image dimension
> I''ve used the
> inputdict=reader->GetMetaDataDictionaryArray() ;
> std::string imagepositionpatient;
> itk::ExposeMetaData<std::string>(*inputDict, "0020|0032",
> imagepositionpatient) and it reads the right values.
>
> I want to use this to read a dicom series process the dicom series
> and save this processed data as a new series in the study.
> The wrong IPP and IOP tags causes problems when viewing this
> generated series in any pacs viewer when the study is loaded.
>
> Is there a way around this or am I doing something wrong ??()
>
> Thanks
>
> Regards
> Sachin Jambawalikar
> _______________________________________________
> Insight-users mailing list
> Insight-users at itk.org
> http://www.itk.org/mailman/listinfo/insight-users
>
Sachin,
I have just patch ITK:
$ cvs ci -m"ENH: When used explicitely makes use of the
SetMetaDataDictionaryArray/GetMetaDataDictionaryArray we should use
information from the meta data dict. I did not handle the spacing,
since spacing in DICOM is also 2D thus it SHOULD match whatever
information was in the dict. Only Orienation and Position are 3D in a
2D image, which is difficult to handle in ITK"
/cvsroot/Insight/Insight/Code/IO/itkGDCMImageIO.cxx,v <-- itkGDCMImageIO.cxx
new revision: 1.143; previous revision: 1.142
If you could try that ASAP, I believe this fix the issue you are seeing.
Steps:
$ make DicomSeriesReadSeriesWrite && ./bin/DicomSeriesReadSeriesWrite
../Insight/Testing/Data/Input/DicomSeries bla
$ dcmdump ../Insight/Testing/Data/Input/DicomSeries/Image00*.dcm | grep ImageOr
(0020,0037) DS [ 1\ 0\ 0\ 0\0.466651\ -0.884442] # 32, 6
ImageOrientationPatient
(0020,0037) DS [ 1\ 0\ 0\ 0\0.466651\ -0.884442] # 32, 6
ImageOrientationPatient
(0020,0037) DS [ 1\ 0\ 0\ 0\0.466651\ -0.884442] # 32, 6
ImageOrientationPatient
$ dcmdump bla/Image007* | grep ImageOri
(0020,0037) DS [ 1\ 0\ 0\ 0\0.466651\ -0.884442] # 32, 6
ImageOrientationPatient
(0020,0037) DS [ 1\ 0\ 0\ 0\0.466651\ -0.884442] # 32, 6
ImageOrientationPatient
(0020,0037) DS [ 1\ 0\ 0\ 0\0.466651\ -0.884442] # 32, 6
ImageOrientationPatient
And same for Position:
$ dcmdump bla/Image007* | grep ImagePos
(0020,0032) DS [-112\ -21.688\ 126.894] # 22, 3
ImagePositionPatient
(0020,0032) DS [-112\-20.2729\ 127.641] # 22, 3
ImagePositionPatient
(0020,0032) DS [-112\-18.8578\ 128.388] # 22, 3
ImagePositionPatient
$ dcmdump ../Insight/Testing/Data/Input/DicomSeries/Image00*.dcm | grep ImagePos
(0020,0032) DS [-112\ -21.688\ 126.894] # 22, 3
ImagePositionPatient
(0020,0032) DS [-112\-20.2729\ 127.641] # 22, 3
ImagePositionPatient
(0020,0032) DS [-112\-18.8578\ 128.388] # 22, 3
ImagePositionPatient
Please note, that you *HAVE TO* use the
SetMetaDataDictionaryArray/GetMetaDataDictionaryArray API for this to
works.
Thanks,
--
Mathieu
--
Mathieu
More information about the Insight-developers
mailing list