Skip to content

Commit

Permalink
Merge pull request #105 from phcerdan/fix_fftPadPositiveIndexImageFilter
Browse files Browse the repository at this point in the history
BUG: Fix origin of itkFFTPadPositiveIndexImageFilter
  • Loading branch information
phcerdan committed Jan 14, 2019
2 parents 85136d5 + 849966f commit ec52d67
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 18 deletions.
18 changes: 17 additions & 1 deletion include/itkFFTPadPositiveIndexImageFilter.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@

#include "itkFFTPadImageFilter.h"
#include "itkImageBoundaryCondition.h"
#include "itkConstantBoundaryCondition.h"
#include "itkPeriodicBoundaryCondition.h"
#include "itkChangeInformationImageFilter.h"

namespace itk
Expand Down Expand Up @@ -101,7 +103,20 @@ class FFTPadPositiveIndexImageFilter:
this->Modified();
}
}

itkGetConstMacro(HalfPadSize, SizeType);
void SetBoundaryConditionToConstant(const OutputImagePixelType & boundaryValue)
{
using BoundaryCondition = itk::ConstantBoundaryCondition< InputImageType, OutputImageType >;
static BoundaryCondition boundaryCondition;
boundaryCondition.SetConstant(boundaryValue);
this->SetBoundaryCondition(&boundaryCondition);
}
void SetBoundaryConditionToPeriodic()
{
using BoundaryCondition = itk::PeriodicBoundaryCondition< InputImageType, OutputImageType >;
static BoundaryCondition boundaryCondition;
this->SetBoundaryCondition(&boundaryCondition);
}
protected:
FFTPadPositiveIndexImageFilter();
~FFTPadPositiveIndexImageFilter() override {};
Expand All @@ -118,6 +133,7 @@ class FFTPadPositiveIndexImageFilter:
typename ChangeInfoFilterType::Pointer m_ChangeInfoFilter;
SizeValueType m_SizeGreatestPrimeFactor;
BoundaryConditionPointerType m_BoundaryCondition;
SizeType m_HalfPadSize;
}; // end of class
} // end namespace itk

Expand Down
9 changes: 9 additions & 0 deletions include/itkFFTPadPositiveIndexImageFilter.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ FFTPadPositiveIndexImageFilter< TInputImage, TOutputImage >
m_BoundaryCondition = m_FFTPadFilter->GetBoundaryCondition();
m_ChangeInfoFilter = ChangeInfoFilterType::New();
m_ChangeInfoFilter->ChangeRegionOn();
m_ChangeInfoFilter->ChangeOriginOn();
}

template< class TInputImage, class TOutputImage >
Expand Down Expand Up @@ -106,11 +107,14 @@ FFTPadPositiveIndexImageFilter< TInputImage, TOutputImage >
// make sure the total size is even
padSize += ( inputRegion.GetSize()[i] + padSize ) % 2;
}
m_HalfPadSize[i] = padSize/2;
index[i] = inputRegion.GetIndex()[i];
size[i] = inputRegion.GetSize()[i] + padSize;
}
RegionType region( index, size );
outputPtr->SetLargestPossibleRegion( region );
// In GenerateData the output will be grafted from a ChangeInformationFilter.
// That will set the correct Origin.
}

template< class TInputImage, class TOutputImage >
Expand Down Expand Up @@ -148,8 +152,13 @@ FFTPadPositiveIndexImageFilter< TInputImage, TOutputImage >
typename OutputImageType::IndexType negativeIndex =
m_FFTPadFilter->GetOutput()->GetLargestPossibleRegion().GetIndex();

auto outputNewOrigin = this->GetInput()->GetOrigin();
auto fakeOriginIndex = this->GetInput()->GetLargestPossibleRegion().GetIndex() - m_HalfPadSize;
this->GetInput()->TransformIndexToPhysicalPoint(fakeOriginIndex, outputNewOrigin);

m_ChangeInfoFilter->SetOutputOffset( outputIndex - negativeIndex);
itkDebugMacro(<< "Offset difference: " << outputIndex - negativeIndex);
m_ChangeInfoFilter->SetOutputOrigin( outputNewOrigin );
m_ChangeInfoFilter->SetInput(m_FFTPadFilter->GetOutput());
m_ChangeInfoFilter->GraftOutput(output);
m_ChangeInfoFilter->Update();
Expand Down
13 changes: 1 addition & 12 deletions test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -345,24 +345,13 @@ itk_add_test(NAME itkFrequencyShrinkEvenTest
2
)
##FFTPad
itk_add_test(NAME itkFFTPadPositiveIndexImageFilterTestZeroFluxNeumann
COMMAND IsotropicWaveletsTestDriver
itkFFTPadPositiveIndexImageFilterTest
DATA{Input/checkershadow_Lch_512x512.tiff}
${ITK_TEST_OUTPUT_DIR}/itkFFTPadPositiveIndexImageFilterTestZeroFluxNeumann.tiff 2 ZEROFLUXNEUMANN
)
# TODO: Add 2D Odd Data, current 512x512 input does not cover the class well. Other boundary conditions have been removed.
itk_add_test(NAME itkFFTPadPositiveIndexImageFilterTestConstant
COMMAND IsotropicWaveletsTestDriver
itkFFTPadPositiveIndexImageFilterTest
DATA{Input/checkershadow_Lch_512x512.tiff}
${ITK_TEST_OUTPUT_DIR}/itkFFTPadPositiveIndexImageFilterTestConstant.tiff 2 CONSTANT
)
itk_add_test(NAME itkFFTPadPositiveIndexImageFilterTestPeriodic
COMMAND IsotropicWaveletsTestDriver
itkFFTPadPositiveIndexImageFilterTest
DATA{Input/checkershadow_Lch_512x512.tiff}
${ITK_TEST_OUTPUT_DIR}/itkFFTPadPositiveIndexImageFilterTestPeriodic.tiff 2 PERIODIC
)
## ZeroDC
itk_add_test(NAME itkZeroDCImageFilterTest
COMMAND IsotropicWaveletsTestDriver
Expand Down
20 changes: 20 additions & 0 deletions test/itkFFTPadPositiveIndexImageFilterTest.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ int itkFFTPadPositiveIndexImageFilterTest( int argc, char * argv[] )
{
fftpad->SetBoundaryCondition( &constantBoundaryCondition );
TEST_SET_GET_VALUE( &constantBoundaryCondition, fftpad->GetBoundaryCondition() );
fftpad->SetBoundaryConditionToConstant(0);
}
else if ( boundaryCondition == "PERIODIC" )
{
Expand Down Expand Up @@ -102,6 +103,25 @@ int itkFFTPadPositiveIndexImageFilterTest( int argc, char * argv[] )
return EXIT_FAILURE;
}
}
auto inOrigin = reader->GetOutput()->GetOrigin();
auto outOrigin = fftpad->GetOutput()->GetOrigin();
std::cout << "InputOrigin: " << inOrigin << ". OutputOrigin: " << outOrigin << std::endl;

auto expectedOrigin = reader->GetOutput()->GetOrigin();
auto computedIndex =
reader->GetOutput()->GetLargestPossibleRegion().GetIndex() - fftpad->GetHalfPadSize();
reader->GetOutput()->TransformIndexToPhysicalPoint( computedIndex, expectedOrigin);
for ( unsigned int i = 0; i < Dimension; ++i )
{
if ( expectedOrigin[i] != outOrigin[i] )
{
std::cerr << "Test failed!" << std::endl;
std::cerr << "Origin is not updated." << std::endl;
std::cerr << "Dim: " << i << ". Expected: " << expectedOrigin[i] <<
". Output: " << outOrigin[i] << std::endl;
return EXIT_FAILURE;
}
}

auto writer = WriterType::New();
writer->SetInput( fftpad->GetOutput() );
Expand Down
6 changes: 1 addition & 5 deletions wrapping/itkFFTPadPositiveIndexImageFilter.wrap
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
itk_wrap_class("itk::FFTPadPositiveIndexImageFilter" POINTER)
foreach(d ${ITK_WRAP_IMAGE_DIMS})
foreach(t ${WRAP_ITK_REAL})
itk_wrap_template("${ITKM_I${t}${d}}" "${ITKT_I${t}${d}}")
endforeach()
endforeach()
itk_wrap_image_filter("${WRAP_ITK_ALL_TYPES}" 1)
itk_end_wrap_class()

0 comments on commit ec52d67

Please sign in to comment.