diff --git a/Modules/IO/DCMTK/src/itkDCMTKFileReader.cxx b/Modules/IO/DCMTK/src/itkDCMTKFileReader.cxx index e2e72c1407d..d068bb9bfed 100644 --- a/Modules/IO/DCMTK/src/itkDCMTKFileReader.cxx +++ b/Modules/IO/DCMTK/src/itkDCMTKFileReader.cxx @@ -1326,7 +1326,15 @@ ::GetSpacing(double * const spacing) const // slice thickness spacing[0] = _spacing[1]; spacing[1] = _spacing[0]; - if(this->GetElementDS(0x0018,0x0050,1,&_spacing[2],false) == EXIT_SUCCESS) + /* + * According Dicom standard (DICOM PS3.6 2016b - Data Dictionary) + * (0028, 0030) indicates physical X,Y spacing inside a slice; + * (0018, 0088) indicates physical Z spacing between slices; + * which above are also consistent with Dcom2iix software. + * when we can not get (0018, 0088),we will revert to previous + * behavior and use (0018, 0050) thickness as a proxy to spacing. + * */ + if(GetElementDS(0x0018,0x0088,1,&_spacing[2], false) == EXIT_SUCCESS) { spacing[2] = _spacing[2]; } @@ -1341,8 +1349,8 @@ ::GetSpacing(double * const spacing) const // functional group, and then the per-frame functional group unsigned short candidateSequences[2] = { - 0x9229, // check for Shared Functional Group Sequence first - 0x9230, // check the Per-frame Functional Groups Sequence + 0x9229, // check for Shared Functional Group Sequence first + 0x9230, // check the Per-frame Functional Groups Sequence }; for(unsigned short candidateSequence : candidateSequences) { @@ -1359,12 +1367,27 @@ ::GetSpacing(double * const spacing) const rval = item.GetElementSQ(0x0028,0x9110,subSequence,false); if(rval == EXIT_SUCCESS) { - if(subSequence.GetElementDS(0x0028,0x0030,2,_spacing,false) == EXIT_SUCCESS - && subSequence.GetElementDS(0x0018,0x0050,1,&_spacing[2]) == EXIT_SUCCESS) + /* + * According Dicom standard (DICOM PS3.6 2016b - Data Dictionary) + * (0028, 0030) indicates physical X,Y spacing inside a slice; + * (0018, 0088) indicates physical Z spacing between slices; + * which above are also consistent with Dcom2iix software. + * when we can not get (0018, 0088),we will revert to previous + * behavior and use (0018, 0050) thickness as a proxy to spacing. + * */ + if(subSequence.GetElementDS(0x0028,0x0030,2,_spacing,false) == EXIT_SUCCESS) { spacing[0] = _spacing[1]; spacing[1] = _spacing[0]; - spacing[2] = _spacing[2]; + if (subSequence.GetElementDS(0x0018,0x0088,1,&_spacing[2], false) == EXIT_SUCCESS) + { + spacing[2] = _spacing[2]; + } + else + { + // punt, zSpace of 1 + spacing[2] = 1.0; + } break; } }