#include <fstream>
int
main(int argc, char * argv[])
{
if (argc < 4)
{
std::cerr << "Missing Parameters " << std::endl;
std::cerr << "Usage: " << argv[0];
std::cerr << " landmarksFile inputImage ";
std::cerr << "DeformedImage " << std::endl;
std::cerr << "deformationField" << std::endl;
return EXIT_FAILURE;
}
constexpr unsigned int ImageDimension = 3;
using PixelType = unsigned char;
using CoordinateRepType = double;
using TransformType =
using PointSetType = TransformType::PointSetType;
using PointIdType = PointSetType::PointIdentifier;
using ResamplerType =
using InterpolatorType =
InputImageType::ConstPointer inputImage;
try
{
}
{
std::cerr << "Exception thrown " << std::endl;
std::cerr << excp << std::endl;
return EXIT_FAILURE;
}
auto sourceLandMarks = PointSetType::New();
auto targetLandMarks = PointSetType::New();
PointType p1;
PointType p2;
const PointSetType::PointsContainer::Pointer sourceLandMarkContainer =
sourceLandMarks->GetPoints();
const PointSetType::PointsContainer::Pointer targetLandMarkContainer =
targetLandMarks->GetPoints();
PointIdType id{};
std::ifstream infile;
infile.open(argv[1]);
while (!infile.eof())
{
infile >> p1[0] >> p1[1] >> p1[2] >> p2[0] >> p2[1] >> p2[2];
sourceLandMarkContainer->InsertElement(id, p1);
targetLandMarkContainer->InsertElement(id++, p2);
}
infile.close();
auto tps = TransformType::New();
tps->SetSourceLandmarks(sourceLandMarks);
tps->SetTargetLandmarks(targetLandMarks);
tps->ComputeWMatrix();
auto resampler = ResamplerType::New();
auto interpolator = InterpolatorType::New();
resampler->SetInterpolator(interpolator);
const InputImageType::SpacingType spacing = inputImage->GetSpacing();
const InputImageType::PointType origin = inputImage->GetOrigin();
const InputImageType::DirectionType direction = inputImage->GetDirection();
const InputImageType::RegionType region = inputImage->GetBufferedRegion();
const InputImageType::SizeType size = region.GetSize();
resampler->SetOutputSpacing(spacing);
resampler->SetOutputDirection(direction);
resampler->SetOutputOrigin(origin);
resampler->SetSize(size);
resampler->SetTransform(tps);
resampler->SetOutputStartIndex(region.GetIndex());
resampler->SetInput(inputImage);
try
{
}
{
std::cerr << "Exception thrown " << std::endl;
std::cerr << excp << std::endl;
return EXIT_FAILURE;
}
auto field = DisplacementFieldType::New();
field->SetRegions(region);
field->SetOrigin(origin);
field->SetSpacing(spacing);
field->Allocate();
FieldIterator fi(field, region);
fi.GoToBegin();
TransformType::InputPointType point1;
TransformType::OutputPointType point2;
DisplacementFieldType::IndexType index;
FieldVectorType displacement;
while (!fi.IsAtEnd())
{
index = fi.GetIndex();
field->TransformIndexToPhysicalPoint(index, point1);
point2 = tps->TransformPoint(point1);
for (unsigned int i = 0; i < ImageDimension; ++i)
{
displacement[i] = point2[i] - point1[i];
}
fi.Set(displacement);
++fi;
}
try
{
}
{
std::cerr << "Exception thrown " << std::endl;
std::cerr << excp << std::endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
Standard exception handling object.
A multi-dimensional iterator templated over image type that walks a region of pixels.
Templated n-dimensional image class.
Linearly interpolate an image at specified positions.
A templated class holding a geometric point in n-Dimensional space.
Resample an image via a coordinate transform.
A templated class holding a n-Dimensional vector.
ITK_TEMPLATE_EXPORT void WriteImage(TImagePointer &&image, const std::string &filename, bool compress=false)
TOutputImage::Pointer ReadImage(const std::string &filename)