{
public:
using Self = CommandIterationUpdate;
protected:
CommandIterationUpdate() { m_IterationNumber = 0; }
public:
using OptimizerPointer = const OptimizerType *;
void
{
}
void
{
auto optimizer = static_cast<OptimizerPointer>(object);
if (!itk::IterationEvent().CheckEvent(&event))
{
return;
}
std::cout << m_IterationNumber++ << " ";
std::cout << optimizer->GetCachedValue() << " ";
std::cout << optimizer->GetCachedCurrentPosition() << std::endl;
}
private:
unsigned long m_IterationNumber;
};
int
main(int argc, char * argv[])
{
if (argc < 4)
{
std::cerr << "Missing Parameters " << std::endl;
std::cerr << "Usage: " << argv[0];
std::cerr << " fixedImageFile movingImageFile ";
std::cerr << " outputImagefile ";
std::cerr << " [initialTx] [initialTy]";
std::cerr << "[useExplicitPDFderivatives ] " << std::endl;
return EXIT_FAILURE;
}
using PixelType = unsigned char;
using InterpolatorType =
using RegistrationType =
using MetricType =
MovingImageType>;
auto transform = TransformType::New();
auto optimizer = OptimizerType::New();
auto interpolator = InterpolatorType::New();
auto registration = RegistrationType::New();
registration->SetOptimizer(optimizer);
registration->SetTransform(transform);
registration->SetInterpolator(interpolator);
auto metric = MetricType::New();
registration->SetMetric(metric);
metric->SetNumberOfHistogramBins(20);
metric->SetNumberOfSpatialSamples(10000);
metric->ReinitializeSeed(121212);
if (argc > 6)
{
metric->SetUseExplicitPDFDerivatives(std::stoi(argv[6]));
}
const unsigned int numberOfParameters = transform->GetNumberOfParameters();
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();
const FixedImageType::ConstPointer fixedImage =
fixedImageReader->GetOutput();
registration->SetFixedImageRegion(fixedImage->GetBufferedRegion());
transform->SetIdentity();
using ParametersType = RegistrationType::ParametersType;
ParametersType initialParameters = transform->GetParameters();
initialParameters[0] = 0.0;
initialParameters[1] = 0.0;
if (argc > 5)
{
initialParameters[0] = std::stod(argv[4]);
initialParameters[1] = std::stod(argv[5]);
}
registration->SetInitialTransformParameters(initialParameters);
std::cout << "Initial transform parameters = ";
std::cout << initialParameters << std::endl;
OptimizerType::ParametersType simplexDelta(numberOfParameters);
simplexDelta.Fill(5.0);
optimizer->AutomaticInitialSimplexOff();
optimizer->SetInitialSimplexDelta(simplexDelta);
optimizer->SetParametersConvergenceTolerance(0.1);
optimizer->SetFunctionConvergenceTolerance(0.001);
optimizer->SetMaximumNumberOfIterations(200);
auto observer = CommandIterationUpdate::New();
optimizer->AddObserver(itk::IterationEvent(), observer);
try
{
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 finalTranslationX = finalParameters[0];
const double finalTranslationY = finalParameters[1];
const double bestValue = optimizer->GetValue();
std::cout << "Result = " << std::endl;
std::cout << " Translation X = " << finalTranslationX << std::endl;
std::cout << " Translation Y = " << finalTranslationY << 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());
resample->SetSize(fixedImage->GetLargestPossibleRegion().GetSize());
resample->SetOutputOrigin(fixedImage->GetOrigin());
resample->SetOutputSpacing(fixedImage->GetSpacing());
resample->SetOutputDirection(fixedImage->GetDirection());
resample->SetDefaultPixelValue(100);
auto writer = WriterType::New();
writer->SetFileName(argv[3]);
writer->SetInput(resample->GetOutput());
writer->Update();
return EXIT_SUCCESS;
}
Wrap of the vnl_amoeba algorithm.
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.
Linearly interpolate an image at specified positions.
Base class for most ITK classes.
Resample an image via a coordinate transform.
Implements transparent reference counting.
BinaryGeneratorImageFilter< TInputImage1, TInputImage2, TOutputImage > Superclass
SmartPointer< Self > Pointer
constexpr unsigned int Dimension