#include <cstdlib>
#include <iostream>
using itk::simple::operator<<;
template <class T>
struct SliceBySliceDecorator;
template <class R, class ImageArg, class... Args>
struct SliceBySliceDecorator<R(ImageArg, Args...)>
{
using FunctionType = std::function<R(ImageArg, Args...)>;
explicit SliceBySliceDecorator(FunctionType f)
{}
R
{
const auto image_size = image.
GetSize();
if (dim <= iter_dim)
{
image = f_(image, args...);
return image;
}
std::vector<unsigned int> extract_size = image.
GetSize();
std::fill(extract_size.begin() + iter_dim, extract_size.end(), 0);
std::vector<int> extract_index(dim, 0);
sitk::ExtractImageFilter extractor;
sitk::PasteImageFilter paster;
paster.
SetSourceSize(std::vector<unsigned int>(extract_size.begin(), extract_size.begin() + iter_dim));
while (
static_cast<unsigned int>(extract_index.back()) < image.
GetSize().back())
{
sitk::Image && temp_image = f_(extractor.
Execute(image), args...);
image = paster.
Execute(image, temp_image);
++extract_index[iter_dim];
for (unsigned int e = iter_dim; e + 1 < dim; ++e)
{
if (
static_cast<unsigned int>(extract_index[e]) > image.
GetSize()[e])
{
extract_index[e] = 0;
++extract_index[e + 1];
}
}
}
return image;
}
FunctionType f_;
static constexpr unsigned int iter_dim = 2;
};
template <class R, class... Args>
SliceBySliceDecorator<R(Args...)>
makeSliceBySlice(R (*f)(Args...))
{
using DecoratorType = SliceBySliceDecorator<R(Args...)>;
return DecoratorType(typename DecoratorType::FunctionType(f));
}
int
main(int argc, char * argv[])
{
if (argc < 3)
{
std::cerr << "Usage: " << argv[0] << " <inputImage> <outputImage>" << std::endl;
return 1;
}
float alpha = 0.3f;
float beta = 0.3f;
std::vector<unsigned int> radius(2, 20);
tempImage = AdaptiveHistogramEqualization2D(tempImage, radius, alpha, beta);
return 0;
}
The Image class for SimpleITK.
unsigned int GetDimension() const
std::vector< unsigned int > GetSize() const
Self & SetSourceSize(std::vector< unsigned int > SourceSize)
Self & SetDestinationIndex(std::vector< int > DestinationIndex)
Image Execute(Image &&destinationImage, const Image &sourceImage)
SITKIO_EXPORT Image ReadImage(const PathType &filename, PixelIDValueEnum outputPixelType=sitkUnknown, const std::string &imageIO="")
ReadImage is a procedural interface to the ImageFileReader class which is convenient for most image r...
Image AdaptiveHistogramEqualization(const Image &image1, std::vector< unsigned int > radius=std::vector< unsigned int >(3, 5), float alpha=0.3f, float beta=0.3f)
Power Law Adaptive Histogram Equalization.
SITKIO_EXPORT void WriteImage(const Image &image, const PathType &fileName, bool useCompression=false, int compressionLevel=-1)
WriteImage is a procedural interface to the ImageFileWriter. class which is convenient for many image...