#include <iostream>
#include <string>
void
CreateMask(MaskType * const mask);
void
CreateImage(ImageType * const image);
void
CreateImageOfSquare(ImageType *
const image,
const itk::Index<2> & cornerOfSquare);
int
main()
{
CreateMask(mask);
cornerOfSquare1[0] = 3;
cornerOfSquare1[1] = 8;
CreateImageOfSquare(image1, cornerOfSquare1);
offset[0] = 20;
offset[1] = 6;
cornerOfSquare2[0] = cornerOfSquare1[0] + offset[0];
cornerOfSquare2[1] = cornerOfSquare1[1] + offset[1];
CreateImageOfSquare(image2, cornerOfSquare2);
radius[0] = image1->GetLargestPossibleRegion().
GetSize()[0] / 2;
radius[1] = image1->GetLargestPossibleRegion().
GetSize()[1] / 2;
if (radius[0] % 2 == 0 || radius[1] % 2 == 0)
{
std::cerr << "Input must have odd dimensions!" << std::endl;
return EXIT_FAILURE;
}
kernelOperator.CreateToRadius(radius);
using CorrelationFilterType =
correlationFilter->SetInput(image2);
correlationFilter->SetMaskImage(mask);
correlationFilter->SetTemplate(kernelOperator);
correlationFilter->Update();
rescaleFilter->SetInput(correlationFilter->GetOutput());
rescaleFilter->SetOutputMinimum(0);
rescaleFilter->SetOutputMaximum(255);
rescaleFilter->Update();
minimumMaximumImageCalculatorFilter->SetImage(correlationFilter->GetOutput());
minimumMaximumImageCalculatorFilter->Compute();
itk::Index<2> maximumCorrelationPatchCenter = minimumMaximumImageCalculatorFilter->GetIndexOfMaximum();
std::cout << "Maximum location fixed: " << maximumCorrelationPatchCenter - radius << std::endl;
std::cout << "Maximum value: " << minimumMaximumImageCalculatorFilter->GetMaximum() << std::endl;
return EXIT_SUCCESS;
}
void
CreateMask(MaskType * const mask)
{
mask->SetRegions(region);
mask->Allocate();
mask->FillBuffer(255);
unsigned int squareSize = 3;
while (!maskIterator.IsAtEnd())
{
if (maskIterator.GetIndex()[0] > cornerOfSquare[0] && maskIterator.
GetIndex()[0] < cornerOfSquare[0] + squareSize &&
maskIterator.
GetIndex()[1] > cornerOfSquare[1] && maskIterator.
GetIndex()[1] < cornerOfSquare[1] + squareSize)
{
maskIterator.Set(0);
}
++maskIterator;
}
}
void
CreateImage(ImageType * const image)
{
image->SetRegions(region);
image->Allocate();
image->FillBuffer(0);
}
void
CreateImageOfSquare(ImageType *
const image,
const itk::Index<2> & cornerOfSquare)
{
image->SetRegions(region);
image->Allocate();
image->FillBuffer(0);
unsigned int squareSize = 8;
while (!imageIterator.IsAtEnd())
{
if (imageIterator.GetIndex()[0] > cornerOfSquare[0] &&
imageIterator.
GetIndex()[0] < cornerOfSquare[0] + squareSize &&
imageIterator.
GetIndex()[1] > cornerOfSquare[1] && imageIterator.
GetIndex()[1] < cornerOfSquare[1] + squareSize)
{
imageIterator.Set(255);
}
++imageIterator;
}
}