#include "itkImage.h"
#include "itkNeighborhoodOperatorImageFunction.h"
#include "itkNeighborhoodOperator.h"
using UnsignedCharImageType = itk::Image<unsigned char, 3>;
static void
CreateImage(UnsignedCharImageType::Pointer image);
UnsignedCharImageType::Pointer image = UnsignedCharImageType::New();
CreateImage(image);
std::array<int, 6> elment6 = {4,10,12,14,16,22};
std::array<int, 18> elment18 = { 1,3,4,5,7,9,10,11,12,14,15,16,17,19,21,22,23,25 };
itk::Neighborhood<float, 3> neighborhood6, neighborhood18,neighborhood26;
neighborhood6.SetRadius(1);
neighborhood18.SetRadius(1);
neighborhood26.SetRadius(1);
for (unsigned int i = 0; i < neighborhood26.GetSize()[0] * neighborhood26.GetSize()[1]* neighborhood26.GetSize()[2]; ++i)
{
neighborhood18[i] = 0;
neighborhood6[i] = 0;
neighborhood26[i] = 1;
}
neighborhood26[13] = 0;
for (auto index : elment6)
{
neighborhood6[index] = 1;
}
for (auto index : elment18)
{
neighborhood18[index] = 1;
}
itk::Neighborhood<float, 3> neighborhood_6_18, neighborhood_18_26;
neighborhood_6_18.SetRadius(1);
neighborhood_18_26.SetRadius(1);
for (unsigned int i = 0; i < neighborhood26.GetSize()[0] * neighborhood26.GetSize()[1] * neighborhood26.GetSize()[2]; ++i)
{
neighborhood_6_18[i] = neighborhood18[i] - neighborhood6[i];
neighborhood_18_26[i] = neighborhood26[i] - neighborhood18[i];
}
std::cout << neighborhood6.GetOffset(4) << "\n";
// std::cout << neighborhood6.Get << "\n";
using NeighborhoodOperatorImageFunctionType = itk::NeighborhoodOperatorImageFunction<UnsignedCharImageType, float>;
auto neighborhoodOperatorImageFunction = NeighborhoodOperatorImageFunctionType::New();
neighborhoodOperatorImageFunction->SetOperator(neighborhood6);
neighborhoodOperatorImageFunction->SetInputImage(image);
auto neighborhoodOperatorImageFunction18 = NeighborhoodOperatorImageFunctionType::New();
neighborhoodOperatorImageFunction18->SetOperator(neighborhood18);
neighborhoodOperatorImageFunction18->SetInputImage(image);
auto neighborhoodOperatorImageFunction26 = NeighborhoodOperatorImageFunctionType::New();
neighborhoodOperatorImageFunction26->SetOperator(neighborhood26);
neighborhoodOperatorImageFunction26->SetInputImage(image);
auto neighborhoodOperatorImageFunction12 = NeighborhoodOperatorImageFunctionType::New();
neighborhoodOperatorImageFunction12->SetOperator(neighborhood_6_18);
neighborhoodOperatorImageFunction12->SetInputImage(image);
auto neighborhoodOperatorImageFunction8 = NeighborhoodOperatorImageFunctionType::New();
neighborhoodOperatorImageFunction8->SetOperator(neighborhood_18_26);
neighborhoodOperatorImageFunction8->SetInputImage(image);
{
itk::Index<3> index;
index.Fill(30);
float output6 = neighborhoodOperatorImageFunction->EvaluateAtIndex(index);
std::cout << "Sum on border: " << output6 << std::endl;
float output18 = neighborhoodOperatorImageFunction18->EvaluateAtIndex(index);
std::cout << "Sum on border: " << output18 << std::endl;
float output26 = neighborhoodOperatorImageFunction26->EvaluateAtIndex(index);
std::cout << "Sum on border: " << output26 << std::endl;
float output12 = neighborhoodOperatorImageFunction12->EvaluateAtIndex(index);
std::cout << "Sum on border: " << output12 << std::endl;
float output8 = neighborhoodOperatorImageFunction8->EvaluateAtIndex(index);
std::cout << "Sum on border: " << output8 << std::endl;
}
return EXIT_SUCCESS;
}
void
CreateImage(UnsignedCharImageType::Pointer image)
{
// Create an image with 2 connected components
UnsignedCharImageType::IndexType start;
start.Fill(0);
UnsignedCharImageType::SizeType size;
size.Fill(100);
UnsignedCharImageType::RegionType region(start, size);
image->SetRegions(region);
image->Allocate();
image->FillBuffer(0);
// Make a square
for (unsigned int r = 20; r < 80; r++)
{
for (unsigned int c = 20; c < 80; c++)
{
for (unsigned int u = 20; u < 80; u++)
{
UnsignedCharImageType::IndexType pixelIndex;
pixelIndex[0] = r;
pixelIndex[1] = c;
pixelIndex[2] = u;
image->SetPixel(pixelIndex, 10);
}
}
}
}