[ITK-users] DVFs interpolation by BSpline
wonnybro
kjwjj627 at gmail.com
Wed Oct 3 11:30:04 EDT 2018
Hi, ITK users
I really really need your help, please help me...
I am trying to do BSpline interpolation of DVFs obtained by image
registrations of 10 images.
I'm trying to modify the BSplineScatteredDataPointSetToImageFilter from the
Insight Journal. However,
I am having trouble to find the correct parameter in order to make the
filter work.
I'll have scattered 3-D points of several DVFs over time and I want to fit
these DVFs by a 4-D Bspline. Afterwards I want to evaluate output DVF to one
time step.
Here you can find the code, unfortunately it crashes.
Please help me...please.
Thanks in advance.
#include "itkBSplineScatteredDataPointSetToImageFilter.h"
#include "itkPointSet.h"
#include "itkImage.h"
#include "itkVectorImage.h"
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
int main (int argc, char* argv[])
{
const unsigned int ImageDimension = 3;
using VectorType = itk::Vector<float, ImageDimension>;
using InputImageType = itk::Image<VectorType, ImageDimension>;
using InputPointType = InputImageType::PointType;
using OutputImageType = itk::Image<VectorType, ImageDimension + 1>;
using PointSetType = itk::PointSet<VectorType, ImageDimension + 1>;
using OutputPointType = PointSetType::PointType;
using ReaderType = itk::ImageFileReader<InputImageType>;
using WriterType = itk::ImageFileWriter<OutputImageType>;
PointSetType::Pointer pointSet = PointSetType::New();
unsigned long pointId = 0;
InputImageType::PointType origin;
InputImageType::SpacingType spacing;
InputImageType::SizeType size;
for (int i = 1; i < argc; ++i)
{
ReaderType::Pointer reader = ReaderType::New();
std::cout << "Reading file " << argv[i] << std::endl;
reader->SetFileName(argv[i]);
try
{
reader->Update();
}
catch (itk::ExceptionObject & err)
{
std::cout << "ExceptionObject caught !" << std::endl;
std::cout << err << std::endl;
return EXIT_FAILURE;
}
using IteratorType = itk::ImageRegionConstIterator<InputImageType>;
const InputImageType * image = reader->GetOutput();
IteratorType it(image, image->GetBufferedRegion());
it.GoToBegin();
InputPointType inPoint;
OutputPointType outPoint;
int iCount = 0;
while (!it.IsAtEnd())
{
inPoint = image->GetPixel(it.GetIndex());
for (int j = 0; j < ImageDimension; ++j)
outPoint[j] = inPoint[i];
outPoint[ImageDimension] = i - 1;
pointSet->SetPoint(pointId, outPoint);
// Transfer the pixel data to the value associated with the point.
pointSet->SetPointData(pointId, it.Get());
++it;
++pointId;
++iCount;
}
std::cout << "Number of points in " << argv[i] << " = " << iCount <<
std::endl;
std::cout << "Total number of points = " <<
pointSet->GetNumberOfPoints() << std::endl;
origin = image->GetOrigin();
spacing = image->GetSpacing();
size = image->GetLargestPossibleRegion().GetSize();
}
typedef itk::BSplineScatteredDataPointSetToImageFilter < PointSetType,
OutputImageType > SplineFilterType;
SplineFilterType::Pointer splineFilter = SplineFilterType::New();
int splineorder=3; // complexity of the spline
SplineFilterType::ArrayType ncontrol;
ncontrol[0]=splineorder + 1;
SplineFilterType::ArrayType closedim;
closedim[0]= 0;
OutputImageType::PointType parametricDomainOrigin;
OutputImageType::SpacingType parametricDomainSpacing;
OutputImageType::SizeType parametricDomainSize;
for (int i = 0; i < ImageDimension; ++i)
{
parametricDomainOrigin[i] = origin[i];
parametricDomainSpacing[i] = spacing[i];
parametricDomainSize[i] = size[i];
}
parametricDomainOrigin[ImageDimension] = 0;
parametricDomainSize[ImageDimension] = argc - 2;
parametricDomainSpacing[ImageDimension] = 10.0;
splineFilter->SetGenerateOutputImage( true ); // the only reason to turn
this off is if one only wants to use the control point lattice for further
processing
splineFilter->SetInput ( pointSet );
splineFilter->SetSplineOrder ( splineorder );
splineFilter->SetNumberOfControlPoints ( ncontrol );
splineFilter->SetNumberOfLevels( 3 );
splineFilter->SetCloseDimension ( closedim );
splineFilter->SetSize( parametricDomainSize );
splineFilter->SetSpacing( parametricDomainSpacing );
splineFilter->SetOrigin( parametricDomainOrigin );
std::cout << "Before update spline filter" << std::endl;
splineFilter->Update();
std::cout << "After update spline filter" << std::endl;
WriterType::Pointer writer = WriterType::New();
writer->SetInput(splineFilter->GetOutput());
writer->SetFileName("Output.mhd");
writer->Update();
std::cout << "After write image filter" << std::endl;
return EXIT_SUCCESS;
};
--
Sent from: http://itk-users.7.n7.nabble.com/
More information about the Insight-users
mailing list