{
public:
using Self = CommandIterationUpdate;
protected:
CommandIterationUpdate() = default;
public:
using OptimizerPointer = const OptimizerType *;
void
{
}
void
{
auto optimizer = static_cast<OptimizerPointer>(object);
if (!itk::IterationEvent().CheckEvent(&event))
{
return;
}
std::cout << optimizer->GetCachedValue() << " ";
std::cout << optimizer->GetCachedCurrentPosition() << std::endl;
}
};
int
main(int argc, char * argv[])
{
if (argc < 3)
{
std::cerr << "Missing Parameters " << std::endl;
std::cerr << "Usage: " << argv[0];
std::cerr << " fixedImageFile movingImageFile ";
std::cerr << " outputImagefile [differenceImage]" << std::endl;
std::cerr << " [initialTx] [initialTy]" << std::endl;
return EXIT_FAILURE;
}
fow->SetInstance(fow);
using PixelType = float;
using MetricType =
using InterpolatorType =
using RegistrationType =
auto metric = MetricType::New();
auto transform = TransformType::New();
auto optimizer = OptimizerType::New();
auto interpolator = InterpolatorType::New();
auto registration = RegistrationType::New();
metric->MeasureMatchesOff();
registration->SetMetric(metric);
registration->SetOptimizer(optimizer);
registration->SetTransform(transform);
registration->SetInterpolator(interpolator);
auto fixedImageReader = FixedImageReaderType::New();
auto movingImageReader = MovingImageReaderType::New();
fixedImageReader->SetFileName(argv[1]);
movingImageReader->SetFileName(argv[2]);
registration->SetFixedImage(fixedImageReader->GetOutput());
registration->SetMovingImage(movingImageReader->GetOutput());
fixedImageReader->Update();
movingImageReader->Update();
registration->SetFixedImageRegion(
fixedImageReader->GetOutput()->GetBufferedRegion());
using ParametersType = RegistrationType::ParametersType;
ParametersType initialParameters(transform->GetNumberOfParameters());
double tx = 0.0;
double ty = 0.0;
if (argc > 6)
{
tx = std::stod(argv[5]);
ty = std::stod(argv[6]);
}
initialParameters[0] = tx;
initialParameters[1] = ty;
registration->SetInitialTransformParameters(initialParameters);
OptimizerType::ParametersType simplexDelta(
transform->GetNumberOfParameters());
simplexDelta.Fill(5.0);
optimizer->AutomaticInitialSimplexOff();
optimizer->SetInitialSimplexDelta(simplexDelta);
optimizer->SetParametersConvergenceTolerance(0.25);
optimizer->SetFunctionConvergenceTolerance(0.001);
optimizer->SetMaximumNumberOfIterations(200);
auto observer = CommandIterationUpdate::New();
optimizer->AddObserver(itk::IterationEvent(), observer);
try
{
registration->Initialize();
std::cout << "Initial Metric value = "
<< metric->GetValue(initialParameters) << std::endl;
registration->Update();
std::cout << "Optimizer stop condition = "
<< registration->GetOptimizer()->GetStopConditionDescription()
<< std::endl;
}
{
std::cout << "ExceptionObject caught !" << std::endl;
std::cout << err << std::endl;
return EXIT_FAILURE;
}
ParametersType finalParameters = registration->GetLastTransformParameters();
const double TranslationAlongX = finalParameters[0];
const double TranslationAlongY = finalParameters[1];
const unsigned int numberOfIterations =
optimizer->GetOptimizer()->get_num_evaluations();
const double bestValue = metric->GetValue(finalParameters);
std::cout << "Result = " << std::endl;
std::cout << " Translation X = " << TranslationAlongX << std::endl;
std::cout << " Translation Y = " << TranslationAlongY << std::endl;
std::cout << " Iterations = " << numberOfIterations << std::endl;
std::cout << " Metric value = " << bestValue << std::endl;
using ResampleFilterType =
auto finalTransform = TransformType::New();
finalTransform->SetParameters(finalParameters);
finalTransform->SetFixedParameters(transform->GetFixedParameters());
auto resample = ResampleFilterType::New();
resample->SetTransform(finalTransform);
resample->SetInput(movingImageReader->GetOutput());
const FixedImageType::Pointer fixedImage = fixedImageReader->GetOutput();
resample->SetSize(fixedImage->GetLargestPossibleRegion().GetSize());
resample->SetOutputOrigin(fixedImage->GetOrigin());
resample->SetOutputSpacing(fixedImage->GetSpacing());
resample->SetOutputDirection(fixedImage->GetDirection());
resample->SetDefaultPixelValue(0);
resample->SetInterpolator(interpolator);
using OutputPixelType = unsigned short;
using CastFilterType =
auto writer = WriterType::New();
auto caster = CastFilterType::New();
writer->SetFileName(argv[3]);
caster->SetInput(resample->GetOutput());
writer->SetInput(caster->GetOutput());
writer->Update();
using DifferenceFilterType =
FixedImageType,
OutputImageType>;
auto difference = DifferenceFilterType::New();
difference->SetInput1(fixedImageReader->GetOutput());
difference->SetInput2(resample->GetOutput());
auto writer2 = WriterType::New();
writer2->SetInput(difference->GetOutput());
if (argc > 4)
{
writer2->SetFileName(argv[4]);
writer2->Update();
}
return EXIT_SUCCESS;
}
Wrap of the vnl_amoeba algorithm.
Casts input pixels to output pixel type.
Superclass for callback/observer methods.
virtual void Execute(Object *caller, const EventObject &event)=0
Abstraction of the Events used to communicating among filters and with GUIs.
Standard exception handling object.
Data source that reads image data from a single file.
Writes image data to a single file.
Base class for Image Registration Methods.
Templated n-dimensional image class.
Computes similarity between two objects to be registered.
Nearest neighbor interpolation of a scalar image.
Base class for most ITK classes.
Resample an image via a coordinate transform.
Implements transparent reference counting.
Implements pixel-wise the computation of squared difference.
BinaryGeneratorImageFilter< TInputImage1, TInputImage2, TOutputImage > Superclass
SmartPointer< Self > Pointer
constexpr unsigned int Dimension