Skip to content

Commit

Permalink
ENH: Simplification of the ImageSeriesReader nonuniform sampling dete…
Browse files Browse the repository at this point in the history
…ction
  • Loading branch information
vfonov authored and dzenanz committed Dec 11, 2019
1 parent 98c5620 commit 8c5d9e9
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 30 deletions.
19 changes: 10 additions & 9 deletions Modules/IO/ImageBase/include/itkImageSeriesReader.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#include "itkMath.h"
#include "itkProgressReporter.h"
#include "itkMetaDataObject.h"
#include <iomanip>

namespace itk
{
Expand Down Expand Up @@ -311,6 +312,7 @@ ImageSeriesReader<TOutputImage>::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)
Expand Down Expand Up @@ -436,17 +438,15 @@ ImageSeriesReader<TOutputImage>::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<bool>(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<double>(output->GetMetaDataDictionary(),
"ITK_non_uniform_sampling_deviation",
maxSpacingDeviation); // maximum deviation
Expand All @@ -471,7 +471,8 @@ ImageSeriesReader<TOutputImage>::GenerateData()
*newDictionary = reader->GetImageIO()->GetMetaDataDictionary();
if (nonUniformSampling)
{
EncapsulateMetaData<bool>(*newDictionary, "ITK_non_uniform_sampling", true); // slice-specific information
// slice-specific information
EncapsulateMetaData<double>(*newDictionary, "ITK_non_uniform_sampling_deviation", spacingDeviation);
}
m_MetaDataDictionaryArray.push_back(newDictionary);
}
Expand Down
29 changes: 8 additions & 21 deletions Modules/IO/ImageBase/test/itkImageSeriesReaderSamplingTest.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -45,43 +45,30 @@ itkImageSeriesReaderSamplingTest(int ac, char * av[])
Reader3DType::Pointer reader = Reader3DType::New();
reader->SetFileNames(fnames);
reader->Update();
bool globalNonUniformSampling = false;
if (itk::ExposeMetaData<bool>(
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<double>(
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;
}

// iterate over all slices to detect offending slice
for (auto d : *reader->GetMetaDataDictionaryArray())
{
itk::MetaDataDictionary theMetadata = *d;
bool nonUniformSampling = false;
if (itk::ExposeMetaData<bool>(theMetadata, "ITK_non_uniform_sampling", nonUniformSampling) && nonUniformSampling)
double samplingDeviation = 0.0;
if (itk::ExposeMetaData<double>(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;
}
}
}
Expand Down

0 comments on commit 8c5d9e9

Please sign in to comment.