diff --git a/Modules/IO/ImageBase/include/itkImageSeriesReader.hxx b/Modules/IO/ImageBase/include/itkImageSeriesReader.hxx index b47cf9064ab..cf6452842f7 100644 --- a/Modules/IO/ImageBase/include/itkImageSeriesReader.hxx +++ b/Modules/IO/ImageBase/include/itkImageSeriesReader.hxx @@ -26,6 +26,7 @@ #include "itkMath.h" #include "itkProgressReporter.h" #include "itkMetaDataObject.h" +#include namespace itk { @@ -311,6 +312,7 @@ ImageSeriesReader::GenerateData() const bool insideRequestedRegion = requestedRegion.IsInside(sliceStartIndex); const int iFileName = (m_ReverseOrder ? numberOfFiles - i - 1 : i); bool nonUniformSampling = false; + double spacingDeviation = 0.0; // check if we need this slice if (!insideRequestedRegion && !needToUpdateMetaDataDictionaryArray) @@ -436,17 +438,15 @@ ImageSeriesReader::GenerateData() outputSpacing[this->m_NumberOfDimensionsInImage])) // either non-uniform sampling or missing slice { nonUniformSampling = true; - itkWarningMacro(<< "Non unform sampling or missing slices detected , expected " - << outputSpacing[this->m_NumberOfDimensionsInImage] << " got: " << dirNnorm); - - EncapsulateMetaData(output->GetMetaDataDictionary(), - "ITK_non_uniform_sampling", - true); // set metadata for the series reader output + spacingDeviation = Math::abs(outputSpacing[this->m_NumberOfDimensionsInImage] - dirNnorm); + itkWarningMacro(<< "Non uniform sampling or missing slices detected , expected " << std::setprecision(14) + << outputSpacing[this->m_NumberOfDimensionsInImage] << " got: " << dirNnorm + << " Deviation of:" << spacingDeviation << std::defaultfloat); needToUpdateMetaDataDictionaryArray = true; - if (Math::abs(outputSpacing[this->m_NumberOfDimensionsInImage] - dirNnorm) > maxSpacingDeviation) + if (spacingDeviation > maxSpacingDeviation) { - maxSpacingDeviation = Math::abs(outputSpacing[this->m_NumberOfDimensionsInImage] - dirNnorm); + maxSpacingDeviation = spacingDeviation; EncapsulateMetaData(output->GetMetaDataDictionary(), "ITK_non_uniform_sampling_deviation", maxSpacingDeviation); // maximum deviation @@ -471,7 +471,8 @@ ImageSeriesReader::GenerateData() *newDictionary = reader->GetImageIO()->GetMetaDataDictionary(); if (nonUniformSampling) { - EncapsulateMetaData(*newDictionary, "ITK_non_uniform_sampling", true); // slice-specific information + // slice-specific information + EncapsulateMetaData(*newDictionary, "ITK_non_uniform_sampling_deviation", spacingDeviation); } m_MetaDataDictionaryArray.push_back(newDictionary); } diff --git a/Modules/IO/ImageBase/test/itkImageSeriesReaderSamplingTest.cxx b/Modules/IO/ImageBase/test/itkImageSeriesReaderSamplingTest.cxx index e99af43ad76..4d53133774a 100644 --- a/Modules/IO/ImageBase/test/itkImageSeriesReaderSamplingTest.cxx +++ b/Modules/IO/ImageBase/test/itkImageSeriesReaderSamplingTest.cxx @@ -45,28 +45,15 @@ itkImageSeriesReaderSamplingTest(int ac, char * av[]) Reader3DType::Pointer reader = Reader3DType::New(); reader->SetFileNames(fnames); reader->Update(); - bool globalNonUniformSampling = false; - if (itk::ExposeMetaData( - reader->GetOutput()->GetMetaDataDictionary(), "ITK_non_uniform_sampling", globalNonUniformSampling) && - globalNonUniformSampling) - { - std::cout << "output ITK_non_uniform_sampling detected " << std::endl; - } - else - { - std::cout << "output ITK_non_uniform_sampling not found" << std::endl; - return EXIT_FAILURE; - } - - double globalSamplingDeviation = 0.0; + double maxSamplingDeviation = 0.0; if (itk::ExposeMetaData( - reader->GetOutput()->GetMetaDataDictionary(), "ITK_non_uniform_sampling_deviation", globalSamplingDeviation)) + reader->GetOutput()->GetMetaDataDictionary(), "ITK_non_uniform_sampling_deviation", maxSamplingDeviation)) { - std::cout << "output ITK_non_uniform_sampling_deviation = " << globalSamplingDeviation << std::endl; + std::cout << "global ITK_non_uniform_sampling_deviation detected : " << maxSamplingDeviation << std::endl; } else { - std::cout << "output ITK_non_uniform_sampling_deviation not found" << std::endl; + std::cout << "global ITK_non_uniform_sampling_deviation not found" << std::endl; return EXIT_FAILURE; } @@ -74,14 +61,14 @@ itkImageSeriesReaderSamplingTest(int ac, char * av[]) for (auto d : *reader->GetMetaDataDictionaryArray()) { itk::MetaDataDictionary theMetadata = *d; - bool nonUniformSampling = false; - if (itk::ExposeMetaData(theMetadata, "ITK_non_uniform_sampling", nonUniformSampling) && nonUniformSampling) + double samplingDeviation = 0.0; + if (itk::ExposeMetaData(theMetadata, "ITK_non_uniform_sampling_deviation", samplingDeviation)) { - std::cout << "slice ITK_non_uniform_sampling detected" << std::endl; + std::cout << "slice ITK_non_uniform_sampling_deviation detected: " << samplingDeviation << std::endl; } else { - std::cout << "slice ITK_non_uniform_sampling not detected" << std::endl; + std::cout << "slice ITK_non_uniform_sampling_deviation not detected" << std::endl; } } }