#include <iostream>
#include <string>
static void CreateMask(MaskType* const mask);
static void CreateImage(ImageType::Pointer image,
const itk::Index<2>& cornerOfSquare);
template <typename TImage>
void WriteImage(TImage* const image, const std::string& filename);
int main(int argc, char *argv[])
{
offset[0] = 5;
offset[1] = 6;
MaskType::Pointer mask = MaskType::New();
CreateMask(mask);
ImageType::Pointer fixedImage = ImageType::New();
cornerOfFixedSquare[0] = 3;
cornerOfFixedSquare[1] = 8;
CreateImage(fixedImage, cornerOfFixedSquare);
WriteImage(fixedImage.GetPointer(), "fixedImage.png");
ImageType::Pointer movingImage = ImageType::New();
cornerOfMovingSquare[0] = cornerOfFixedSquare[0] + offset[0];
cornerOfMovingSquare[1] = cornerOfFixedSquare[1] + offset[1];
CreateImage(movingImage, cornerOfMovingSquare);
WriteImage(movingImage.GetPointer(), "movingImage.png");
CorrelationFilterType::Pointer correlationFilter = CorrelationFilterType::New();
correlationFilter->SetFixedImage(fixedImage);
correlationFilter->SetMovingImage(movingImage);
correlationFilter->SetMovingImageMask(mask);
correlationFilter->Update();
WriteImage(correlationFilter->GetOutput(), "correlation.mha");
RescaleFilterType::Pointer rescaleFilter = RescaleFilterType::New();
rescaleFilter->SetInput(correlationFilter->GetOutput());
rescaleFilter->SetOutputMinimum(0);
rescaleFilter->SetOutputMaximum(255);
rescaleFilter->Update();
WriteImage(rescaleFilter->GetOutput(), "correlation.png");
MinimumMaximumImageCalculatorType::Pointer minimumMaximumImageCalculatorFilter = MinimumMaximumImageCalculatorType::New ();
minimumMaximumImageCalculatorFilter->SetImage(correlationFilter->GetOutput());
minimumMaximumImageCalculatorFilter->Compute();
itk::Index<2> maximumCorrelationPatchCenter = minimumMaximumImageCalculatorFilter->GetIndexOfMaximum();
itk::Size<2> outputSize = correlationFilter->GetOutput()->GetLargestPossibleRegion().
GetSize();
maximumCorrelationPatchCenterFixed[0] = outputSize[0]/2 - maximumCorrelationPatchCenter[0];
maximumCorrelationPatchCenterFixed[1] = outputSize[1]/2 - maximumCorrelationPatchCenter[1];
std::cout << "Maximum location: " << maximumCorrelationPatchCenter << std::endl;
std::cout << "Maximum location fixed: " << maximumCorrelationPatchCenterFixed << std::endl;
std::cout << "Maximum value: " << minimumMaximumImageCalculatorFilter->GetMaximum() << std::endl;
return EXIT_SUCCESS;
}
void CreateImage(ImageType::Pointer image,
const itk::Index<2>& cornerOfSquare)
{
ImageType::IndexType start;
ImageType::SizeType size;
size.Fill(51);
ImageType::RegionType region(start,size);
image->SetRegions(region);
image->Allocate();
image->FillBuffer(0);
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;
}
}
template <typename TImage>
void WriteImage(TImage* const image, const std::string& filename)
{
typename WriterType::Pointer writer = WriterType::New();
writer->SetFileName(filename);
writer->SetInput(image);
writer->Update();
}
void CreateMask(MaskType* const mask)
{
ImageType::IndexType start;
start.Fill(0);
ImageType::SizeType size;
size.Fill(51);
ImageType::RegionType region(start,size);
mask->SetRegions(region);
mask->Allocate();
mask->FillBuffer(255);
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;
}
}