1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
#include "ITKWrap.hpp"
#include <itkMorphologicalGradientImageFilter.h>
template <int dims, DataClass dataclass, class PixelClass>
static Array TMorphologicalGradientBallFunction(const ArrayVector & arg)
{
typedef itk::Image<PixelClass, dims> ITKType;
typename ITKType::Pointer imageIn = CreateITKFromArray<dims,dataclass,PixelClass>(arg[0]);
typedef itk::BinaryBallStructuringElement<PixelClass, dims> KernelType;
KernelType kernel;
typedef itk::MorphologicalGradientImageFilter<ITKType, ITKType, KernelType> FilterType;
typename FilterType::Pointer filter = FilterType::New();
if (arg.size() > 2)
kernel.SetRadius(arg[2].asInteger());
else
kernel.SetRadius(1);
kernel.CreateStructuringElement();
filter->SetKernel(kernel);
filter->SetInput(imageIn);
filter->Update();
return CreateArrayFromITK<dims,dataclass,PixelClass>(filter->GetOutput());
}
template <int dims, DataClass dataclass, class PixelClass>
static Array TMorphologicalGradientCrossFunction(const ArrayVector & arg)
{
typedef itk::Image<PixelClass, dims> ITKType;
typename ITKType::Pointer imageIn = CreateITKFromArray<dims,dataclass,PixelClass>(arg[0]);
typedef itk::BinaryCrossStructuringElement<PixelClass, dims> KernelType;
KernelType kernel;
typedef itk::MorphologicalGradientImageFilter<ITKType, ITKType, KernelType> FilterType;
typename FilterType::Pointer filter = FilterType::New();
kernel.CreateStructuringElement();
filter->SetKernel(kernel);
filter->SetInput(imageIn);
filter->Update();
return CreateArrayFromITK<dims,dataclass,PixelClass>(filter->GetOutput());
}
//@@Signature
//gfunction morphologicalgradient MorphologicalGradientFunction
//input x type radius
//output y
ArrayVector MorphologicalGradientFunction(int nargout, const ArrayVector &arg)
{
QString type = "ball";
if (arg.size() >= 2) type = arg[1].asString().toLower();
if (arg.size() == 0)
return ArrayVector();
if (type == "ball")
{
ITKCases(TMorphologicalGradientBallFunction,arg);
}
if (type == "cross")
{
ITKCases(TMorphologicalGradientCrossFunction,arg);
}
throw Exception("Unsupported kernel type -- it must be either 'ball' or 'cross'");
}
|