1
/*=========================================================================
3
Program: Insight Segmentation & Registration Toolkit
4
Module: $RCSfile: itkDisplacementFieldJacobianDeterminantFilterTest.cxx,v $
6
Date: $Date: 2008-12-08 01:10:43 $
7
Version: $Revision: 1.2.4.1 $
9
Copyright (c) Insight Software Consortium. All rights reserved.
10
See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
12
This software is distributed WITHOUT ANY WARRANTY; without even
13
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14
PURPOSE. See the above copyright notices for more information.
16
=========================================================================*/
18
#pragma warning ( disable : 4786 )
23
#include "itkDisplacementFieldJacobianDeterminantFilter.h"
24
#include "itkNullImageToImageFilterDriver.txx"
25
#include "itkVector.h"
27
static bool TestDisplacementJacobianDeterminantValue(void)
29
std::cout.precision(9);
30
bool testPassed = true;
31
const unsigned int ImageDimension = 2;
33
typedef itk::Vector<float,ImageDimension> VectorType;
34
typedef itk::Image<VectorType,ImageDimension> FieldType;
36
// In this case, the image to be warped is also a vector field.
37
typedef FieldType VectorImageType;
38
typedef VectorImageType::PixelType PixelType;
39
typedef VectorImageType::IndexType IndexType;
41
//=============================================================
43
std::cout << "Create the dispacementfield image pattern." << std::endl;
44
VectorImageType::RegionType region;
45
//NOTE: Making the image size much larger than necessary in order to get
46
// some meaningful time measurements. Simulate a 256x256x256 image.
47
VectorImageType::SizeType size = {{4096, 4096}};
48
region.SetSize( size );
50
VectorImageType::Pointer dispacementfield = VectorImageType::New();
51
dispacementfield->SetLargestPossibleRegion( region );
52
dispacementfield->SetBufferedRegion( region );
53
dispacementfield->Allocate();
58
typedef itk::ImageRegionIteratorWithIndex<VectorImageType> Iterator;
59
Iterator inIter( dispacementfield, region );
60
for( ; !inIter.IsAtEnd(); ++inIter )
62
const unsigned int i=inIter.GetIndex()[0];
63
const unsigned int j=inIter.GetIndex()[1];
64
values[0]=0.125*i*i+0.125*j;
65
values[1]=0.125*i*j+0.25*j;
67
//std::cout << "Setting: " << values << " at " << inIter.GetIndex() << std::endl;
71
//|-------------------------------------------|
72
//| [0.25;0.5] | [0.375;0.75] | [0.75;1] |
73
//|-------------------------------------------|
74
//| [0.125;0.25] | [0.25;0.375] | [0.625;0.5] |
75
//|-------------------------------------------|
76
//| [0.0;0.0] | [0.125;0.0] | [0.5;0] |
77
//|-------------------------------------------|
79
//J(1,1) = [ (.625-.125)/2 (.5-.25)/2; (.375-.125)/2 (.75-0.0)/2] =[ .25 .125; .125 .375]
80
//det((J+I)(1,1))=((.25+1.0)*(.375+1.0))-(.125*.125) = 1.703125;
81
const float KNOWN_ANSWER=(((.25+1.0)*(.375+1.0))-(.125*.125));
82
itk::DisplacementFieldJacobianDeterminantFilter<VectorImageType,float>::Pointer
84
itk::DisplacementFieldJacobianDeterminantFilter<VectorImageType,float>::New();
86
filter->SetInput(dispacementfield);
88
itk::Image<float,2>::Pointer output=filter->GetOutput();
90
VectorImageType::IndexType index;
93
//std::cout << "Output " << output->GetPixel(index) << std::endl;
94
if(vcl_abs(output->GetPixel(index) - KNOWN_ANSWER) > 1e-13)
96
std::cout << "Test failed." << KNOWN_ANSWER << "!=" << output->GetPixel(index) << std::endl;
101
std::cout << "Test passed." << std::endl;
107
itkDisplacementFieldJacobianDeterminantFilterTest(int , char * [] )
109
bool ValueTestPassed=TestDisplacementJacobianDeterminantValue();
112
typedef itk::Vector<float, 3> VectorType;
113
typedef itk::Image< VectorType, 3> VectorImageType;
114
typedef itk::Image< float, 3> ScalarVectorImageType;
118
typedef itk::DisplacementFieldJacobianDeterminantFilter<VectorImageType,float> FilterType;
119
FilterType::Pointer filter = FilterType::New();
120
filter->Print(std::cout);
127
itk::NullImageToImageFilterDriver< VectorImageType, ScalarVectorImageType > test1;
128
test1.SetImageSize(sz);
129
test1.SetFilter(filter.GetPointer());
131
filter->Print(std::cout);
133
// Run the Test again with ImageSpacingOn
134
filter->SetUseImageSpacingOn();
136
filter->Print(std::cout);
138
// Run the Test again with specified weights
139
float weights[3] = {1.0,2.0,3.0};
140
filter->SetDerivativeWeights(weights);
142
filter->Print(std::cout);
145
catch(itk::ExceptionObject &err)
147
std::cerr << err << std::endl;
150
if(ValueTestPassed == false)