1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
|
/*=========================================================================
Program: Insight Segmentation & Registration Toolkit
Module: itkBSplineResampleImageFunctionTest.cxx
Language: C++
Date: $Date$
Version: $Revision$
Copyright (c) Insight Software Consortium. All rights reserved.
See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
Portions of this code are covered under the VTK copyright.
See VTKCopyright.txt or http://www.kitware.com/VTKCopyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#if defined(_MSC_VER)
#pragma warning ( disable : 4786 )
#endif
#include "itkBSplineResampleImageFunction.h"
#include "itkBSplineInterpolateImageFunction.h"
#include "itkBSplineDecompositionImageFilter.h"
#include "itkFilterWatcher.h"
#include "itkImage.h"
#include "itkSize.h"
#include "itkRandomImageSource.h"
#include "vnl/vnl_sample.h"
int itkBSplineResampleImageFunctionTest(int, char* [] )
{
const unsigned int ImageDimension = 2;
typedef float PixelType;
typedef itk::Image<PixelType,ImageDimension> ImageType;
const unsigned int SplineOrder = 3;
/** Generate a random input image and connect to BSpline decomposition filter */
typedef ImageType::SpacingType SpacingType;
typedef ImageType::PointType PointType;
typedef ImageType::SizeType SizeType;
SpacingType spacing;
PointType origin;
SizeType size;
spacing.Fill( 2.0 );
origin.Fill ( 10.0 );
size.Fill( 32 );
typedef itk::RandomImageSource<ImageType> SourceType;
SourceType::Pointer source = SourceType::New();
source->SetSize( size );
source->SetSpacing( spacing );
source->SetOrigin( origin );
source->SetMin( 0.0 );
source->SetMax( 10.0 );
typedef itk::BSplineDecompositionImageFilter<ImageType,ImageType> FilterType;
FilterType::Pointer filter = FilterType::New();
FilterWatcher watcher(filter,"filter");
filter->SetSplineOrder( SplineOrder );
filter->SetInput( source->GetOutput() );
filter->Update();
/** Set up a BSplineResampleImageFunction. */
typedef itk::BSplineResampleImageFunction<ImageType,double>
ResampleFunctionType;
ResampleFunctionType::Pointer resample = ResampleFunctionType::New();
resample->SetSplineOrder( SplineOrder );
resample->SetInputImage( filter->GetOutput() );
/** Set up a BSplineInterpolateImageFunction for comparision. */
typedef itk::BSplineInterpolateImageFunction<ImageType,double>
InterpolateFunctionType;
InterpolateFunctionType::Pointer interpolate = InterpolateFunctionType::New();
interpolate->SetSplineOrder( SplineOrder );
interpolate->SetInputImage( source->GetOutput() );
/** Compare 10 values at random points. */
ResampleFunctionType::PointType point;
double minValue = origin[0];
double maxValue = origin[0] + spacing[0] * static_cast<double>(size[0] - 1);
for ( unsigned int k = 0; k < 10; k ++ )
{
for ( unsigned int j = 0; j < ImageDimension; j++ )
{
point[j] = vnl_sample_uniform( minValue, maxValue );
}
double f = resample->Evaluate( point );
double g = interpolate->Evaluate( point );
if ( vnl_math_abs( f - g ) > 1e-5 )
{
std::cout << "Resample and Interpolated point are different." << std::endl;
std::cout << " point: " << point << std::endl;
std::cout << " resample: " << resample->Evaluate( point ) << std::endl;
std::cout << " interpolate: " << interpolate->Evaluate( point ) << std::endl;
std::cout << " Test failed. " << std::endl;
return EXIT_FAILURE;
}
}
return EXIT_SUCCESS;
}
|